Spring架构增强MultiActionController

转载 2007年09月11日 18:40:00

在使用Spring提供的控制器时,AbstractController和SimpleFormController是应用得最多的。 AbstractController是最基本的Controller,可以给予用户最大的灵活性。SimpleFormController则用于典型 的表单编辑和提交。在一个需要增,删,改,查的需求中,增加和修改扩展SimpleFormController完成,删除和查询则扩展 AbstractController完成。

    但是像上面那样完成某一业务对象的增,删,改,查,都属于一类相关的业务。把一类相关的操作分布到不同的类去完成,违返“高内聚”的设计原则。这样四个业务操作需要四个类来完成,造成太多的类文件,难以维护和配置。

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

    1. 使用MultiActionController

    MultiActionController会使不同的请求映射为不同方法,这里是一个实现用户信息增删改查的例子:

    1.1 SampleMultiMethodController实现

public   class  SampleMultiMethodController  extends  MultiActionController {
      
private   static   final  String userInfoListView  =   " ehld.sample.getuserinfolist " //  用户信息列表view
       private   static   final  String userFormView  =   " ehld.sample.userForm " ; // 用户信息编辑view
       private   static   final  String userSuccessView  = " redirect:ehld.sample.getuserinfolist.do " // 提交成功后显示的view
       private   static   final  String userInfoListKey  =   " userInfoList " ; //  用户信息列表key值
       private   final  String userIdParam  =   " id " ; //  userid
       private  SampleAction sampleAction; //  定义业务对象

      
public  SampleAction getSampleAction() {
        
return  sampleAction;
      }


      
public   void  setSampleAction(SampleAction sampleAction) {
        
this .sampleAction  =  sampleAction;
      }


      
/**
       * 功能:获得所有的用户信息<br>
      
*/

      
public  ModelAndView listUser(HttpServletRequest request,HttpServletResponse response)  throws  Exception {
         List userInfoList 
=   this .sampleAction.getUserInfoList();
         ModelAndView mav 
=   new  ModelAndView(userInfoListView);
         mav.addObject(
this .userInfoListKey,userInfoList);
         
return  mav;
      }


      
/**
       * 功能:编辑用户信息<br>
      
*/

      
public  ModelAndView edtiUser(HttpServletRequest request,HttpServletResponse response)  throws  Exception {
         String uid 
=  RequestUtils.getStringParameter(request, userIdParam);
         UserInfoDTO userInfo 
=   null ;
         
if  ( ! "" .equals(uid)) {
        userInfo 
=   this .sampleAction.getUserInfo(uid);
         }

         
if  (userInfo  ==   null ) {
         userInfo 
=   new  UserInfoDTO();
         }

         ModelAndView mav 
=   new  ModelAndView( this .userFormView,  this .getCommandName( null ), userInfo);
         
return  mav;
      }


      
/**
       * 功能:保存修改或新增的用户信息<br>
       *检查从页面bind的对象,如果userId或userName为空则返回原来的form页面;
       *否则进行保存用户信息操作,返回成功页面
      
*/

    
public  ModelAndView saveUser(HttpServletRequest request, HttpServletResponse response, UserInfoDTO command)  throws  Exception {
           UserInfoDTO user 
=  (UserInfoDTO) command;
           ServletRequestDataBinder binder 
=   new  ServletRequestDataBinder(command,getCommandName(command));
           BindException errors 
=  binder.getErrors();
           ModelAndView mav 
=   null ;
           
if  (user.getUserID()  ==   null   ||   "" .equals(user.getUserID())) {
           errors.rejectValue(
" userID " " userIdNull " " 用户id不能为空 " );
           }


           
if  (user.getUserName()  ==   null   ||   "" .equals(user.getUserName())) {
           errors.reject(
" userNameNull " " 用户名不能为空 " );
           }

           
if  (errors.hasErrors()) {
           mav 
=   new  ModelAndView( this .userFormView, errors.getModel());
           }
  else {
           
this .sampleAction.saveUserInfo(user); //  保存用户信息
           mav  =   new  ModelAndView( this .userSuccessView);
           }

        
return  mav;
    }


      
/**
       * 功能:删除用户信息<br>
      
*/

    
public  ModelAndView deleteUser(HttpServletRequest request, HttpServletResponse response)  throws  Exception {
          String uid 
=  RequestUtils.getStringParameter(request, userIdParam);
          UserInfoDTO user 
=   new  UserInfoDTO();
          user.setUserID(uid);
          
this .sampleAction.deleteUserInfo(user);
          ModelAndView mav 
=   new  ModelAndView( this .userSuccessView);
          
return  mav;
    }

}

1.2 web-context配置

<!--  把sampleMultiMethodController所有的请求映射到SimpleUrlHandlerMapping  -->
< bean id = " handlerMapping "   class = " org.springframework.web.servlet.handler.SimpleUrlHandlerMapping " >
    
< property name = " defaultHandler "  ref = "  sampleMultiMethodController  " />
</ bean >

<!--  集增,删,改,查操作到一个类的controller  -->
< bean id = " sampleMultiMethodController "   class = " com.prs.application.ehld.sample.web.controller.SampleMultiMethodController " >
    
< property name = " methodNameResolver " >
        
< bean  class = " 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的缺点 

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

3. 增强的MultiActionController实现

 

Spring MultiActionController 使用 Command 将Form中的数据绑定

MultiActionController 可以处理多个请求,将数据绑定到Command中,可以在代码中减少类似request.getParameter("")的语句。如果能在MultiActionC...

Spring MVC使用MultiActionController搭配Validator校验表单

贴出来以告慰下午的好几个小时, 网上的一些解决办法,有的可以验证,但是不能显示errors. 因为是继承MultiActionController,所以在配置文件中就没法制定自己的command名称...

Spring mvc: step by step 4-MultiActionController

在实际开发中,我们希望一个controller能够处理多个请求,比如:我们常常把一个用户的增加,删除,修改放在一个controller中。在Spring MVC中,我们就会用到MultiActionC...

Spring mvc (四) [继承MultiActionController实现以方法为单位的controller][配置2种请求的指定方式]

MultiActionController 继承MultiActionController。实现以方法为单位的请求方式。 这里有两种配置。分别是根据参数名指定要请求的方法和根据方法名请求contr...

spring mvc MultiActionController !!!

这篇文章是接到《spring mvc + spring3整合mybatis3的demo!!! 》做的demo,所以我只写出不同的地方!!! StudentController.javapackage ...

Spring之MultiActionController 详解

MultiActionController 详解 Spring提供了一个多动作控制器,用于支持在一个控制器里添加多种功能处理方法,即在一个控制器中存放多个功能处理方法,例如...

Spring MultiActionController and using Annotation

使用Spring MultiActionController 类可以让我们将功能相近的Action组织在一个控制器里,处理每个Action的方法应当像下面这种形式。public (ModelAndVi...

Spring MVC MultiActionController example

In Spring MVC application, MultiActionController is used to group related actions into a single cont...

SPRING MVC 中的 MULTIACTIONCONTROLLER 用法详解 (转载)

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了。在单个的基础上,再新加两三个叫做丰富,再多就未必是好事,反而会令人缩手新闻片脚,无从定夺。 多数 Controller...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring架构增强MultiActionController
举报原因:
原因补充:

(最多只允许输入30个字)