第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC
2015-05-21 00:00
531 查看
原创内容,转载请注明iteyehttp://jinnianshilongnian.iteye.com/
4.15、MultiActionController
之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(CRUDCreate-Read-Update-Delete),那该怎么办呢?4.15.1解决方案
1、每一个功能对应一个控制器,如果是CRUD则需要四个控制器,但这样我们的控制器会暴增,肯定不可取;2、使用SpringWebMVC提供的MultiActionController,用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,这种方式不错。
4.15.2问题
1、MultiActionController如何将不同的请求映射不同的请求的功能处理方法呢?SpringWebMVC提供了MethodNameResolver(方法名解析器)用于解析当前请求到需要执行的功能处理方法的方法名。默认使用InternalPathMethodNameResolver实现类,另外还提供了ParameterMethodNameResolver和PropertiesMethodNameResolver,当然我们也可以自己来实现,稍候我们仔细研究下它们是如何工作的。
2、那我们的功能处理方法应该怎么写呢?
public(ModelAndView|Map|String|void)actionName(HttpServletRequestrequest,HttpServletResponseresponse,[,HttpSessionsession][,AnyObject]);
哦,原来如此,我们只需要按照如上格式写我们的功能处理方法即可;此处需要注意一下几点:
1、返回值:即模型和视图部分;
ModelAndView:模型和视图部分,之前已经见过了;
Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator实现类来计算,稍候讨论;
String:只返回逻辑视图名;
void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行相同的处理);
2、actionName:功能方法名字;由methodNameResolver根据请求信息解析功能方法名,通过反射调用;
3、形参列表:顺序固定,“[]”表示可选,我们来看看几个示例吧:
//表示到新增页面
publicModelAndViewtoAdd(HttpServletRequestrequest,HttpServletResponseresponse);
//表示新增表单提交,在最后可以带着命令对象
publicModelAndViewadd(HttpServletRequestrequest,HttpServletResponseresponse,UserModeluser);
//列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator实现来计算
publicMaplist(HttpServletRequestrequest,HttpServletResponseresponse);
//文件下载,返回值类型为void,表示该功能方法直接写响应
publicvoidfileDownload(HttpServletRequestrequest,HttpServletResponseresponse)
//第三个参数可以是session
publicModelAndViewsessionWith(HttpServletRequestrequest,HttpServletResponseresponse,HttpSessionsession);
//如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序
publicvoidsessionAndCommandWith(HttpServletRequestrequest,HttpServletResponseresponse,HttpSessionsession,UserModeluser)
4、异常处理方法,MultiActionController提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处理方法进行处理,式如下所示:
publicModelAndViewanyMeaningfulName(HttpServletRequestrequest,HttpServletResponseresponse,ExceptionClassexception)
MultiActionController会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:
//处理PayException
publicModelAndViewprocessPayException(HttpServletRequestrequest,HttpServletResponseresponse,PayExceptionex)
//处理Exception
publicModelAndViewprocessException(HttpServletRequestrequest,HttpServletResponseresponse,Exceptionex)
4.15.3MultiActionController类实现
类定义:publicclassMultiActionControllerextendsAbstractControllerimplementsLastModified,继承了AbstractController,并实现了LastModified接口,默认返回-1;核心属性:
delegate:功能处理的委托对象,即我们要调用请求处理方法所在的对象,默认是this;
methodNameResolver:功能处理方法名解析器,即根据请求信息来解析需要执行的delegate的功能处理方法的方法名。
核心方法:
接下来,我们看一下MultiActionController如何使用
4.15.4MethodNameResolver
4.15.5RequestToViewNameTranslator
用于直接将请求转换为逻辑视图名。默认实现为4.15.6示例
增删改:如果是GET请求方法,则表示到展示页面,POST请求方法表示真正的功能操作;
<beanname="/user/**"class="cn.javass.chapter4.web.controller.UserController">
<propertyname="userService"ref="userService"/>
<propertyname="createView"value="user/create"/>
<propertyname="updateView"value="user/update"/>
<propertyname="deleteView"value="user/delete"/>
<propertyname="listView"value="user/list"/>
<propertyname="redirectToListView"value="redirect:/user/list"/>
<!--使用PropertiesMethodNameResolver来解析功能处理方法名-->
<!--propertyname="methodNameResolver"ref="propertiesMethodNameResolver"/-->
</bean>
<tableborder="1"width="50%">
<tr>
<th>用户名</th>
<th>真实姓名</th>
<th>操作</th>
</tr>
<c:forEachitems="${userList}"var="user">
<tr>
<td>${user.username}</td>
<td>${user.realname}</td>
<td>
<ahref="${pageContext.request.contextPath}/user/update?username=${user.username}">更新</a>
|
<ahref="${pageContext.request.contextPath}/user/delete?username=${user.username}">删除</a>
</td>
</tr>
</c:forEach>
</table>
用户名:<inputtype="text"name="username"value="${command.username}"/><br/>
真实姓名:<inputtype="text"name="realname"value="${command.realname}"/><br/>
<inputtype="submit"value="更新"/>
</form>
默认的InternalPathMethodNameResolver将进行如下解析:
我们可以将默认的InternalPathMethodNameResolver改为PropertiesMethodNameResolver:
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<propertyname="mappings">
<props>
<propkey="/user/create">create</prop>
<propkey="/user/update">update</prop>
<propkey="/user/delete">delete</prop>
<propkey="/user/list">list</prop>
<propkey="/**">list</prop><!--默认的行为-->
</props>
</property>
<propertyname="alwaysUseFullPath"value="false"/><!--不使用全路径-->
</bean>
<beanname="/user/**"class="cn.javass.chapter4.web.controller.UserController">
<!—省略其他配置,详见配置文件-->
<!--使用PropertiesMethodNameResolver来解析功能处理方法名-->
<propertyname="methodNameResolver"ref="propertiesMethodNameResolver"/>
</bean>
如上配置方式可以很好的工作,但必须继承MultiActionController,SpringWebMVC提供给我们无需继承MultiActionController实现方式,即使有委托对象方式,继续往下看吧。
4.15.7、委托方式实现
<beanid="userDelegate"class="cn.javass.chapter4.web.controller.UserDelegate">
<propertyname="userService"ref="userService"/>
<propertyname="createView"value="user2/create"/>
<propertyname="updateView"value="user2/update"/>
<propertyname="deleteView"value="user2/delete"/>
<propertyname="listView"value="user2/list"/>
<propertyname="redirectToListView"value="redirect:/user2/list"/>
</bean>
<!—控制器对象-->
<beanname="/user2/**"
class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<propertyname="delegate"ref="userDelegate"/>
<propertyname="methodNameResolver"ref="parameterMethodNameResolver"/>
</bean>
<beanid="parameterMethodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!--1、根据请求参数名解析功能方法名-->
<propertyname="methodParamNames"value="create,update,delete"/>
<!--2、根据请求参数名的值解析功能方法名-->
<propertyname="paramName"value="action"/>
<!--3、逻辑方法名到真实方法名的映射-->
<propertyname="logicalMappings"> <props> <propkey="doList">list</prop> </props> </property>
<!—4、默认执行的功能处理方法-->
<propertyname="defaultMethodName"value="list"/>
</bean>
<tableborder="1"width="50%">
<tr>
<th>用户名</th>
<th>真实姓名</th>
<th>操作</th>
</tr>
<c:forEachitems="${userList}"var="user">
<tr>
<td>${user.username}</td>
<td>${user.realname}</td>
<td>
<ahref="${pageContext.request.contextPath}/user2?action=update&username=${user.username}">更新</a>
|
<ahref="${pageContext.request.contextPath}/user2?action=delete&username=${user.username}">删除</a>
</td>
</tr>
</c:forEach>
</table>
<inputtype="hidden"name="action"value="update"/>
用户名:<inputtype="text"name="username"value="${command.username}"/><br/>
真实姓名:<inputtype="text"name="realname"value="${command.realname}"/><br/>
<inputtype="submit"value="更新"/>
</form>
用户名:<inputtype="text"name="username"value="${command.username}"/><br/>
真实姓名:<inputtype="text"name="realname"value="${command.realname}"/><br/>
<inputtype="submit"name="create"value="新增"/>
</form>
使用ParameterMethodNameResolver将进行如下解析:
原创内容,转载请注明iteye
相关文章推荐
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解 (4)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(7)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC 博客分类: 跟开涛学SpringMVC
- 第四章 Controller接口控制器详解(3)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(4)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(7 完)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(7)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(2)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(3)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(3)——跟着开涛学SpringMVC
- 第四章 Controller接口控制器详解(1)——跟着开涛学SpringMVC