专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » spring架构:Spring架构增强MultiActionController(上) »正文

spring架构:Spring架构增强MultiActionController(上)

来源: 发布时间:星期四, 2009年1月8日 浏览:15次 评论:0
  在使用Spring提供控制器时AbstractController和SimpleFormController是应用得最多AbstractController是最基本Controller可以给予用户最大灵活性SimpleFormController则用于典型表单编辑和提交个需要增,删,改需求中增加和修改扩展SimpleFormController完成删除和查询则扩展AbstractController完成

  但是像上面那样完成某业务对象都属于类相关业务类相关操作分布到区别类去完成违返“高内聚”设计原则这样 4个业务操作需要 4个类来完成造成太多类文件难以维护和配置

  所以Spring借鉴StrutsDispatchAction提供了类似功能MultiActionController可以实现区别请求路径对应MultiActionController中区别思路方法这样就可以把相关操作都在个类相关思路方法中完成这样使得这个类具有“高内聚”也利于系统维护还避免了重复代码增加和修改操作数据验证逻辑是很相似使用MultiActionController后就可以让增加和修改操作共用段数据验证逻辑代码

  1. 使用MultiActionController

  MultiActionController会使区别请求映射为区别思路方法,这里是个实现用户信息增删改查例子:

  1.1 SampleMultiMethodController实现

public SampleMultiMethodController extends MultiActionController...{
 // 用户信息列表view
 private final String userInfoListView = "ehld.sample.getuserinfolist";
 //用户信息编辑view
 private final String userFormView = "ehld.sample.userForm";
 //提交成功后显示view
 private final String userSuccessView ="redirect:ehld.sample.getuserinfolist.do";
 // 用户信息列表key值
 private final String userInfoListKey = "userInfoList";
 // userid
 private final String userIdParam = "id";
 // 定义业务对象
 private SampleAction sampleAction;
 public SampleAction getSampleAction ...{
     sampleAction;
 }
 public void SampleAction(SampleAction sampleAction) ...{
  this.sampleAction = sampleAction;
 }
 /**//**
  * 功能:获得所有用户信息<br>
 */
 public ModelAndView listUser(HttpServletRequest request,
      HttpServletResponse response) throws Exception ...{
   List userInfoList = this.sampleAction.getUserInfoList;
   ModelAndView mav = ModelAndView(userInfoListView);
   mav.addObject(this.userInfoListKey,userInfoList);
   mav;
 }
 /**//**
  * 功能:编辑用户信息<br>
 */
 public ModelAndView edtiUser(HttpServletRequest request,
      HttpServletResponse response) throws Exception ...{
   String uid = RequestUtils.getStringParameter(request, userIdParam);
   UserInfoDTO userInfo = null;
   (!"".equals(uid)) ...{
  userInfo = this.sampleAction.getUserInfo(uid);
   }
   (userInfo null) ...{
  userInfo = UserInfoDTO;
   }
   ModelAndView mav = ModelAndView(this.userFormView, this
        .getCommandName(null), userInfo);
   mav;
 }
 /**//**
  * 功能:保存修改或新增用户信息<br>
  *检查从页面bind对象如果userId或userName为空则返回原来form页面;否则进行保存用户信息操作返回
*成功页面
 */
public ModelAndView saveUser(HttpServletRequest request,
      HttpServletResponse response, UserInfoDTO command) throws Exception ...{
    UserInfoDTO user = (UserInfoDTO) command;
  ServletRequestDataBinder binder = ServletRequestDataBinder(command,
        getCommandName(command));
  BindException errors = binder.getErrors;
  ModelAndView mav = null;
   (user.getUserID null || "".equals(user.getUserID)) ...{
    errors.rejectValue("userID", "userIdNull", "用户id不能为空");
  }
   (user.getUserName null || "".equals(user.getUserName)) ...{
    errors.reject("userNameNull", "用户名不能为空");
  }
   (errors.hasErrors) ...{
    mav = ModelAndView(this.userFormView, errors.getModel);
  } ...{
    this.sampleAction.saveUserInfo(user);// 保存用户信息
    mav = ModelAndView(this.userSuccessView);
  }
     mav;
}
 /**//**
  * 功能:删除用户信息<br>
 */
public ModelAndView deleteUser(HttpServletRequest request,
      HttpServletResponse response) throws Exception ...{
   String uid = RequestUtils.getStringParameter(request, userIdParam);
   UserInfoDTO user = UserInfoDTO;
   user.UserID(uid);
   this.sampleAction.deleteUserInfo(user);
   ModelAndView mav = ModelAndView(this.userSuccessView);
    mav;
}
}


  1.2 web-context配置

<!-- 把sampleMultiMethodController所有请求映射到SimpleUrlHandlerMapping -->
<bean id="handlerMapping"
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="defaultHandler" ref=" sampleMultiMethodController "/>
</bean>
<!-- 集增,删查操作到个类controller -->
<bean id="sampleMultiMethodController"
="com.prs.application.ehld.sample.web.controller.SampleMultiMethodController">
<property name="methodNameResolver">
<bean
="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/ehld.sample.getuserinfolist.do">listUser</prop>
<prop key="/ehld.sample.edituserinfo.do">edtiUser</prop>
<prop key="/ehld.sample.saveuserinfo.do">saveUser</prop>
</props>
</property>
</bean>
</property>
<property name="sampleAction"
ref="com.prs.application.ehld.sample.biz.action.sampleAction"></property>
</bean>


  2. MultiActionController缺点

  MultiActionController把相关业务思路方法集中在个类中进行处理减少控制类数量方便于系统维护可以重用相关逻辑代码提高代码重用同时也减少bean配置有太多bean配置可以说是Spring 个暇疵Spring提供IOC,让我们灵活控制bean依赖同时我们需要去维护太多bean配置Spring项目中很大程度上都在烂用xml 配置文件这很不利于团队(Team)开发和系统后期维护MultiActionController也不例外

  1. multiActionController配置相对复杂MultiActionController需要注入个MethodNameResolver对象再通过MethodNameResolvermappings属性来提供请求和思路方法的间映射这样配置是复杂和难以理解使用Spring框架确很灵活但是有时这种过分灵活反而增加了系统复杂度

  2. multiActionController配置涉及bean过多除了自身bean定义外还需要把所有映射配置到个UrlHandlerMapping中去这样除了维护multiActionController自身bean定义外还需要维护UrlHandlerMapping定义

  笔者十分反对这种具有连带性配置个bean属性改变会造成对别个bean属性改变这样增加了系统复杂度和维护成本所以必须提供种默认实现让bean的间依赖不要造成bean属性的间依赖MultiActionController在这方面表示得十分不好

  3. 数据绑定支持不好SimpleFormController专门用来支持编辑和表单提效它支持数据绑定在这方面做得很好可以把jsp页面字段值绑定为某对象(Command)可以自定义command名称虽然MultiActionController也支持数据绑定但是它并不支持自定义command名称它默认comamnd名称为”command”这也是不便于维护对象应该有个代表自身含义名字如果所有页面绑定对象都以”command”作为名字那将难以理解MultiActionController支持数据绑定思路方法参见上面例子saveUser思路方法

  3. 理想MultiActionController构想

  个理想MultActionController应该配置简单明了并且无需要在多个地方进行配置 应该支持对绑定对象自定义名称

<bean name="sampleMultiMethodController"
="com.prs.application.ehld.sample.web.controller.SampleMultiMethodController">
<property name="commandName" value="userInfoDTO"/>
<property name="formView" value="ehld.sample.userForm"/>
<property name="successView" value="redirect:ehld.sample.getuserinfolist.do"/>
<property name="urlMethodmappings">
<props>
<!--显示用户信息列表 -->
<prop key="/ehld.sample.getuserinfolist.do">listUser</prop>
<!-- 编辑用户信息 -->
<prop key="/ehld.sample.edituserinfo.do">edtiUser</prop>
<!-- 保存用户信息-->
<prop key="/ehld.sample.saveuserinfo.do">saveUser</prop>
</props>
</property>
<property name="sampleAction"
ref="com.prs.application.ehld.sample.biz.action.sampleAction"></property>
</bean>




  上面是个更让人能够理解配置

  1.把请求和具体思路方法的间映射作为MultiActionController自身个属性“urlMethodmappings”

  2.通过个commandName属性可以让用户自由决定绑定对象名称

  3.简化UrlHandlerMapping关联配置对MutilActionControllerbean配置进行改动时无再需要去关心 SimpleUrlHandlerMappingbean配置



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: