Spring的MultiActionController

文档:MultiActionController

Spring提供一个多动作控制器,使用它你可以将几个动作合并在一个控制器里,这样可以把功能组合在一起。多动作控制器存在在一个单独的包中——org.springframework.web.mvc.multiaction——它能够将请求映射到方法名,然后调用正确的方法。比如当你在一个控制器中有很多公共的功能,但是想多个入口到控制器使用不同的行为,使用多动作控制器就特别方便。

MultiActionController提供的功能

功能解释
delegateMultiActionController有两种使用方式。第一种是继承MultiActionController,并在子类中指定由MethodNameResolver解析的方法(这种情况下不需要这个配置参数),第二种是你定义了一个代理对象,由它调用Resolver解析的方法。如果你是这种情况,你必须使用这个配置参数定义代理对象
methodNameResolver由于某种原因,MultiActionController需要基于收到的请求解析它必须调用的方法。你可以使用这个配置参数定义一个解析器

一个多动作控制器的方法需要符合下列格式:

				// actionName can be replaced by any methodname
ModelAndView actionName(HttpServletRequest, HttpServletResponse);
		

由于MultiActionController不能判断方法重载(overloading),所以方法重载是不允许的。此外,你可以定义exception handlers,它能够处理从你指定的方法中抛出的异常。包含异常处理的动作方法需要返回一个ModelAndView对象,就象其它动作方法一样,并符合下面的格式:

				// anyMeaningfulName can be replaced by any methodname
ModelAndView anyMeaningfulName(HttpServletRequest, HttpServletResponse, ExceptionClass);
		

ExceptionClass可以是任何异常,只要它是java.lang.Exceptionjava.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,该方法也会被调用!

我们来看一组例子。首先是一个使用ParameterMethodNameResolver和代理属性<继承MultiActionController>的例子,它接受包含参数名的请求

例一:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;

public class ProductController{
 
  public ModelAndView view(HttpServletRequest request, HttpServletResponse response) throws Exception {

      response.getOutputStream().print("Viewing");
      return null;
  }

  public ModelAndView index(HttpServletRequest request, HttpServletResponse response) throws Exception {
      
      response.getOutputStream().print("index");
      return null;
  }
}

*-servlet.xml配置:

<!--配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver,用于解析请求中的特定参数的值,将该值作为方法名调用-->
<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  <property name="paramName" value="method"></property>
 </bean>
<!--配置MultiActionController,因为使用delegate,所以需要配置delegate和methodNameResolver两个属性,两个属性分别指明该MultiActionController的方法解析策略和delegate-->
 <bean name="/disp.sp" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
     <property name="methodNameResolver" ref="paramResolver"></property>
     <property name="delegate" ref="productController"></property>
 </bean>
<!--配置MultiActionController所依赖的delegate-->
   <bean id="productController" class="com.wz.xktj.controller.ProductController" />

测试URL:http://localhost:8080/xktj/disp.sp?method=view

例二:
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 TestMultiactionController extends MultiActionController {

 public ModelAndView view(HttpServletRequest request,HttpServletResponse response) throws Exception{
  
  response.getOutputStream().println("this is test!!!");
  return null;
 }
 
 public ModelAndView add(HttpServletRequest request,HttpServletResponse response) throws Exception{
  
  response.getOutputStream().println("test add......");
  return null;
 }
}


*-servlet.xml配置:

<bean id="MethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
    <property name="paramName" value="method"></property>
    <property name="defaultMethodName" value="view"></property>
   </bean>
   <bean name="/muti.sp" class="com.wz.xktj.controller.TestMultiactionController">
    <property name="methodNameResolver" ref="MethodNameResolver"></property>
 </bean>

测试URL:http://localhost:8080/xktj/muti.sp?method=view
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值