赠人玫瑰,手留余香.人生最大的快乐不在于占有什么而在于追求什么的过程.
引用文章:http://blog.youkuaiyun.com/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,该方法也会被调用!
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";
}
}
<?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>
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");
}
}
<?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>
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>
demo下载:http://download.youkuaiyun.com/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>