Spring MVC MultiActionController---多动作控制器
2013-04-23 22:48
435 查看
引用文章:http://blog.csdn.net/q3498233/article/details/6703101
http://red-apple.blog.163.com/blog/static/20116506120122521556586/
http://www.blogjava.net/liaojiyong/archive/2006/09/01/67078.html
http://www.open-open.com/lib/view/open1346746861365.htmlhttp://esffor.iteye.com/blog/96082
在使用Spring提供的控制器时,AbstractController和SimpleFormController是应用得最多的。
AbstractController是最基本的Controller,可以给予用户最大的灵活性。
SimpleFormController则用于典型的表单编辑和提交。
在一个需要增、删、改、查的需求中,增加和修改扩展SimpleFormController完成,删除和查询则扩展AbstractController完成。 但是像上面那样完成某一业务对象的增,删,改,查,都属于一类相关的业务。把一类相关的操作分布到不同的类去完成,违返“高内聚”的设计原则。这样四个业务操作需要四个类来完成,造成太多的类文件,难以维护和配置。 所以Spring借鉴Struts的DispatchAction提供了类似功能的MultiActionController。可以实现不同的请求路径对应MultiActionController中的不同方法,这样就可以把相关的操作都在一个类的相关方法中完成。这样使得这个类具有“高内聚”,也利于系统的维护,还避免了重复代码。
多动作控制器存在在一个单独的包中——org.springframework.web.mvc.multiaction——它能够将请求映射到方法名,然后调用正确的方法。比如当你在一个控制器中有很多公共的功能,但是想多个入口到控制器使用不同的行为,使用多动作控制器就特别方便。
MultiActionController 提供的功能
功能 | 解释 |
---|---|
delegate | MultiActionController有两种使用方式。第一种是继承MultiActionController,并在子类中指定由MethodNameResolver解析的方法(这种情况下不需要这个配置参数),第二种是你定义了一个代理对象,由它调用Resolver解析的方法。如果你是这种情况,你必须使用这个配置参数定义代理对象 |
methodNameResolver | 由于某种原因,MultiActionController需要基于收到的请求解析它必须调用的方法。你可以使用这个配置参数定义一个解析器 |
1:// actionName can be replaced by any methodname
ModelAndView actionName(HttpServletRequest, HttpServletResponse);
由于MultiActionController不能判断方法重载(overloading),所以方法重载是不允许的。此外,你可以定义exception handlers,它能够处理从你指定的方法中抛出的异常。包含异常处理的动作方法需要返回一个ModelAndView对象,就象其它动作方法一样,并符合下面的格式:
2:// anyMeaningfulName can be replaced by any methodname
ModelAndView anyMeaningfulName(HttpServletRequest, HttpServletResponse, ExceptionClass);
ExceptionClass可以是任何异常,只要它是java.lang.Exception或java.lang.RuntimeException的子类。
MethodNameResolver 根据收到的请求解析方法名。有三种解析器可以供你选择,当然你可以自己实现解析器。
ParameterMethodNameResolver - 解析请求参数,并将它作为方法(http://www.sf.net/index.view?testParam=testIt的请求就会调用testIt(HttpServletRequest,HttpServletResponse))。使用paramName配置参数可以调整所检查的参数
InternalPathMethodNameResolver - 从路径中获取文件名作为方法名(http://www.sf.net/testing.view的请求会调用testing(HttpServletRequest, HttpServletResponse)方法)
PropertiesMethodNameResolver - 使用用户定义的属性对象将请求的URL映射到方法名。当属性定义/index/welcome.html=doIt,并且收到/index/welcome.html的请求,就调用doIt(HttpServletRequest, HttpServletResponse)方法。这个方法名解析器需要使用PathMatcher
所以如果属性包含/**/welcom?.html,该方法也会被调用!
废话不多说,上demo1:
首先是一个使用ParameterMethodNameResolver和继承MultiActionController的例子,它接受包含参数名的请求。
Cntroller:MutiController.java
package com.sunshine.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.sunshine.service.UserService; public class MutiController extends MultiActionController { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public String add(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.add()");; request.setAttribute("add", "add"); return "add"; } public String delete(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.delete()");; request.setAttribute("delete", "delete"); return "delete"; } }
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!--MutiController 方法解析器之 ParameterMehtodNameResolver --> <!-- 页面View层基本信息设定 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- <property name="prefix" value="/myjsp/"/> --> <property name="suffix" value=".jsp" /> </bean> <!-- Controller方法调用规则定义 配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver, 用于解析请求中的特定参数的值,将该值作为方法名调用 --> <bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName" value="method" /> </bean> <!-- servlet映射列表,所有控制层Controller的servlet在这里定义 --> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="user.do">userController</prop> <prop key="multy.do">mutiController</prop> </props> </property> </bean> <bean id="mutiController" class="com.sunshine.controller.MutiController"> <property name="userService" ref="userService"></property> <property name="methodNameResolver" ref="paraMethodResolver"></property> </bean> <bean id="userController" class="com.sunshine.controller.UserController"> <property name="userService" ref="userService"></property> </bean> </beans>
浏览器地址栏:http://localhost:8080/SpringMVC25/multy.do?method=delete
http://localhost:8080/SpringMVC25/multy.do?method=add
demo2:
下面是使用InternalPathMethodNameResolver,这个可以根据请求的路径名称来调用相应的方法。
Cntroller:MutiController.java
package com.sunshine.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.sunshine.service.UserService; public class MutiController extends MultiActionController { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } public String add(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.add()");; request.setAttribute("add", "add"); return "add"; } public String delete(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.delete()");; request.setAttribute("delete", "delete"); return "delete"; } public ModelAndView update(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.update()");; request.setAttribute("update", "update"); return new ModelAndView("/update"); } public ModelAndView list(HttpServletRequest request,HttpServletResponse response){ System.out.println("MutiController.list()");; request.setAttribute("list", "list"); return new ModelAndView("/list"); } }
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!--MutiController 方法解析器之 InternalPathMethodNameResolver --> <!-- 页面View层基本信息设定 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- <property name="prefix" value="/myjsp/"/> --> <property name="suffix" value=".jsp" /> </bean> <!-- Controller方法调用规则定义 根据请求的路径名称来调用特定的方法用 --> <bean id="internalPathMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean> <!-- servlet映射列表,所有控制层Controller的servlet在这里定义 --> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="user.do">userController</prop> <prop key="multy/*.do">mutiController</prop> </props> </property> </bean> <bean id="mutiController" class="com.sunshine.controller.MutiController"> <property name="userService" ref="userService"></property> <property name="methodNameResolver" ref="internalPathMethodNameResolver"></property> </bean> <bean id="userController" class="com.sunshine.controller.UserController"> <property name="userService" ref="userService"></property> </bean> </beans>
urlMapping定义/controller/开头的url请求由名字为controller的控制器来处理,因为是多动作处理器,所以要定义MethodNameResolver来告诉springMVC应该调用controller的哪个方法,这里用的是InternalPathMethodNameResolver,该方法名解释器会把整个URL中最后一个"/"和最后一个"."之间的部分作为要调用的方法名。
浏览器地址栏:http://localhost:8080/SpringMVC25/multy/update.do
http://localhost:8080/SpringMVC25/multy/list.do
demo3:
最后使用PropertiesMethodNameResolver,这个可以根据一个URLs 映射列表来调用相应的方法。例如,如果定义了/mutly/list.do=list,那么当请求为/mutly/list.do时,会调用list方法。在定义URLs时可以使用通配符(没有试验成功,有成功的请回复指教,不胜感激,谢谢)。
Cntroller:MutiController.java 如demo2中的MutiController.java
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!--MutiController 方法解析器之 InternalPathMethodNameResolver --> <!-- 页面View层基本信息设定 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- <property name="prefix" value="/myjsp/"/> --> <property name="suffix" value=".jsp" /> </bean> <!-- Controller方法调用规则定义 根据请求的路径名称来调用特定的方法用 --> <bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> <property name="mappings"> <props> <prop key="/multy/list.do">list</prop> <prop key="/multy/update.do">update</prop> </props> </property> </bean> <!-- servlet映射列表,所有控制层Controller的servlet在这里定义 --> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="user.do">userController</prop> <prop key="multy/*">mutiController</prop> </props> </property> </bean> <bean id="mutiController" class="com.sunshine.controller.MutiController"> <property name="userService" ref="userService"></property> <property name="methodNameResolver" ref="propertiesMethodNameResolver"></property> </bean> <bean id="userController" class="com.sunshine.controller.UserController"> <property name="userService" ref="userService"></property> </bean> </beans>
浏览器地址栏:http://localhost:8080/SpringMVC25/multy/update.do
http://localhost:8080/SpringMVC25/multy/list.do
demo下载:http://download.csdn.net/detail/sunshine_love/5293417
后记:
在使用PropertiesMethodNameResolver时,还可以使用下面的配置方式
<bean id="propertiesMethodNameResolver"
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>
/multy/list.do=list
/multy/update.do=update
</value>
<!-- <props>
<prop key="/multy/list.do">list</prop>
<prop key="/multy/update.do">update</prop>
</props> -->
</property>
</bean>
相关文章推荐
- SpringMVC—MultiActionController控制器
- Spring MVC-控制器(Controller)-多动作控制器(Multi Action Controller)示例(转载实践)
- springmvc MultiActionController配置
- 详解Asp.Net MVC――控制器与动作(Controller And Action)
- springMVC--多动作控制器: MultiActionController
- SpringMVC MultiActionController的使用-最简化教程
- Spring MVC完成指南(一)Spring MVC MultiActionController
- Spring MVC MultiActionController example
- Spring MVC MultiActionController annotation example
- Spring MVC MultiActionController example
- Spring MVC MultiActionController example
- Spring MVC MultiActionController annotation example
- spring mvc MultiActionController !!!
- springMVC3学习--MultiActionController
- spring整合SpringMVC Controller 和 Struts2 Action控制层Bean的默认作用域
- Spring架构增强MultiActionController(上)
- springMVC3学习(五)--MultiActionController
- Spring架构增强MultiActionController(下)
- 在同一控制器类中处理多个请求的MultiActionController
- springMVC3学习(五)--MultiActionController