在使用Spring提供
控制器时
AbstractController和SimpleFormController是应用得最多
AbstractController是最基本
Controller
可以给予用户最大
灵活性
SimpleFormController则用于典型
表单编辑和提交
在
个需要增,删,改
查
需求中
增加和修改扩展SimpleFormController完成
删除和查询则扩展AbstractController完成
但是像上面那样完成某
业务对象
增
删
改
查
都属于
类相关
业务
把
类相关
操作分布到区别
类去完成
违返“高内聚”
设计原则
这样 4个业务操作需要 4个类来完成
造成太多
类文件
难以维护和配置
所以Spring借鉴Struts
DispatchAction提供了类似功能
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对象
再通过MethodNameResolver
mappings属性来提供请求和思路方法的间
映射
这样
配置是复杂
和难以理解
使用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
关联配置
对MutilActionController
bean配置进行改动时
无再需要去关心 SimpleUrlHandlerMapping
bean配置