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>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值