spring mvc 之MultiActionController跟MethodNameResolver-附带实例
首发地址:http://inmethetiger.iteye.com/blog/1678785
MultiActionController身兼数值,主要处理一组逻辑上相似的web请求,比如针对一个对象的CRUD操作或者针对同一个对象或者多个对象的一组查询操作。我们可以将这些web请求交个MultiActionController来同意处理。
主要功能:
1:请求参数到Command对象的绑定。
2:通过Validatator的数据验证
3:细化的异常处理方法
实例代码:
public class MyMultiActionController extends MultiActionController{
public Map list(HttpServletRequest request,HttpServletResponse response){
return new HashMap();
}
public ModelAndView delete(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView();
}
public ModelAndView update(HttpServletRequest request,HttpServletResponse response){
return new ModelAndView();
} ..
MultiActionController知道具体的Web请求进来之后,将由MethodNameResolver处理。即:MethodNameResolver帮助MultiActionController决定当前web请求应该交给哪个方法来处理。
1:InternalPathMethodNameResolver:
如果没有为MultiActionController明确指定任何MethodNameResolver,InternalPathMethodNameResolver将做为默认的MethodNameResolver实现。(类似于HandlerMapping中的BeanNameUrlHandlerMapping)(下面有用InternalPathMethodNameResolver与BeanNameUrlHandlerMapping组合实现的例子)
处理方法:
提取URL最后一个(/)之后的部分,并去掉扩展名,作为返回的方法名称
/xxxx/admin/admincontroller/login.do。交给login方法。
2:PropertisMethodNameResolver,和InternalPathMethodNameResolver类似,但是可以在配置文件中进行灵活配置来确定web请求到具体方法处理之间的映射。(类似于SimpleUrlHandlerMapping)(下面有用PropertisMethodNameResolver与SimpleUrlHandlerMapping组合实现的例子)。
------------------------------实例-----------------------------------------------------
InternalPathMethodNameResolver与BeanNameUrlHandlerMapping组合实现的例子
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class MyMutilActionController extends MultiActionController {
public ModelAndView listing(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("list");
return mv;
}
public ModelAndView delete(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("delete");
return mv;
}
public ModelAndView update(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("update");
return mv;
}
public ModelAndView insert(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("insert");
return mv;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- HandlerMapping -->
<!-- 帮助DispatchServlet进行web请求的url到具体处理类的匹配,默认为BeanNameUrlHandleMapping -->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/listing.do">myMutioActionController</prop>
<prop key="/delete.do">myMutioActionController</prop>
<prop key="/update.do">myMutioActionController</prop>
<prop key="/insert.do">myMutioActionController</prop>
</props>
</property>
</bean>
<!-- MethodNameResolver -->
<!-- 解决MultiActionController决定web请求交给哪个方法 -->
<!-- <bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
</bean> -->
<!-- Controller -->
<!-- 控制器,自己实现,收集参数,绑定参数到命令对象,调用业务对象,选择视图模型,返回视图,模型,数据 -->
<!-- MutiActionController需要指定方法名解析器,因为我选用的不是默认的 -->
<bean name="myMutioActionController" class="org.spring.controller.MyMutilActionController">
</bean>
<!-- ViewResover -->
<!-- DispatcherServlet根据Controller中指定的逻辑视图查找相应的视图实现 -->
<bean id="defaultViewResover"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
注意注释,在控制器中并没有指明MethodNameResolver,所以,Spring mvc自动使用InternalPathMethodNameResolver。所以,控制器中的方法名必须和映射名一致。
刚开始HandlerMapping想使用默认的,但是试了一下,可是可以,但是不实际。因为,BeanNameUrlHandlerMapping,需要控制器的name和web请求一致,这就需要将同一个
控制器,声明四次配置方法如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Controller -->
<!-- 控制器,自己实现,收集参数,绑定参数到命令对象,调用业务对象,选择视图模型,返回视图,模型,数据 -->
<!-- MutiActionController需要指定方法名解析器,因为我选用的不是默认的 -->
<bean name="/listing.do" class="org.spring.controller.MyMutilActionController">
</bean>
<bean name="/insert.do" class="org.spring.controller.MyMutilActionController">
</bean>
<bean name="/delete.do" class="org.spring.controller.MyMutilActionController">
</bean>
<bean name="/update.do" class="org.spring.controller.MyMutilActionController">
</bean>
<!-- ViewResover -->
<!-- DispatcherServlet根据Controller中指定的逻辑视图查找相应的视图实现 -->
<bean id="defaultViewResover"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
将InternalPathMethodNameResolver和BeanNameUrlHandlerMapping都已经省略。甚至可以将ViewResover都省略。只是这样的话,增删改查这四个jsp文件得放到WebContext下,而且控制器中返回的视图名称为xxx.jsp或者,jsp文件依然放在原来的位置,但是在控制器中将返回WEB-INF/view/xxx.jsp
-------------------------------------------------------------------------
PropertisMethodNameResolver+SimplUrlHandlerMapping+MultiActionController组合实现简单实例
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class MyMutilActionController extends MultiActionController {
public ModelAndView listObject(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("list");
return mv;
}
public ModelAndView deleteObject(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("delete");
return mv;
}
public ModelAndView updateObject(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("update");
return mv;
}
public ModelAndView insertObject(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("insert");
return mv;
}
}
注意控制器中的方法,和上面的不同,因为 PropertiesMethodNameResolver更灵活,只需在配置文件中指定
dispatch-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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- HandlerMapping -->
<!-- 帮助DispatchServlet进行web请求的url到具体处理类的匹配,默认为BeanNameUrlHandleMapping -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/listing.do">myMutioActionController</prop>
<prop key="/update.do">myMutioActionController</prop>
<prop key="/insert.do">myMutioActionController</prop>
<prop key="/delete.do">myMutioActionController</prop>
</props>
</property>
</bean>
<!-- MethodNameResolver -->
<!-- 解决MultiActionController决定web请求交给哪个方法 -->
<bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/listing.do">listObject</prop>
<prop key="/update.do">updateObject</prop>
<prop key="/insert.do">insertObject</prop>
<prop key="/delete.do">deleteObject</prop>
</props>
</property>
</bean>
<!-- Controller -->
<!-- 控制器,自己实现,收集参数,绑定参数到命令对象,调用业务对象,选择视图模型,返回视图,模型,数据 -->
<!-- MutiActionController需要指定方法名解析器,因为我选用的不是默认的 -->
<bean name="myMutioActionController" class="org.spring.controller.MyMutilActionController">
<property name="methodNameResolver" ref="propertiesMethodNameResolver"></property>
</bean>
<!-- ViewResover -->
<!-- DispatcherServlet根据Controller中指定的逻辑视图查找相应的视图实现 -->
<bean id="defaultViewResover" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean></beans>