您的位置:首页 > 编程语言 > Java开发

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 提供的功能
功能解释
delegateMultiActionController有两种使用方式。第一种是继承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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: