springmvc中MultiActionController的3种方法映射

        一般情况下,一个控制器只处理一个动作,这有很大的局限性,若要实现几个相似的功能,应该使用“多动作控制器”(MultiActionController),MultiActionController是一个特殊类型的控制器,它可实现多个动作。而该控制器中的每个动作分派给不同的方法,其实多控制器中的每个方法实现的是类似的功能,每个方法代表了一个可以由一个单独控制器完成的动作。那么这样的控制器里的诸多方法,是怎样选择执行的呢?

MultiActionController对此有一个名为“方法名解析器”的东东来做这项工作。

 
MultiActionController中的方法名解析器共有三个:
1、InternalPathMethodNameResolver——这是MultiActionController的缺省情况下的方法名解析器,它是根据URL样式来解析方法名的。(实际上就是根据URL中的“文件名部分”决定的)。除了上面的缺省的解析器外,MultiActionController还有两个方法名解析器:
2、ParameterMethodNameResolver——根据请求中的参数来解析并执行方法名。
3、PropertiesMethodNameResolver——根据查询一个key/value列表来解析并执行方法名。
举个例子吧,比如说,有一个名为MAController的控制器,是MultiActionController的子类,
它有里边有三个方法分别是method01、method02、method03。其代码如下:
public class MAController extends MultiActionController {
 public MAController () {}
 public ModelAndView method01(HttpServletRequest request,   HttpServletResponse response) {
  ……
  return new ModelAndView("courseList", "courses", courses);
 }
 public ModelAndView method02(HttpServletRequest request, HttpServletResponse response) {
  ……
  return new ModelAndView("courseList", "courses", courses);
 }
 
 public ModelAndView method03(HttpServletRequest request, HttpServletResponse response) {
  ……
  return new ModelAndView("courseList", "courses", courses);
 }
 
 private CourseService courseService;
 public void setCourseService(CourseService courseService) {
  this.courseService = courseService;
 }
  ……
}
然后,在映射文件中,它被映射到一个id值为“maController”的Bean,
<bean id="maController" class="com.w3cs.vlar.training.mvc.MAController">
    <property name="methodNameResolver">
       <ref bean="methodNameResolver"/>
    </property>
</bean>

1、此时方法名解析器若用ParameterMethodNameResolver,这时就会根据请求中的一个参数决定选择哪个方法
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
    <property name="paramName">
       <value>action</value>
    </property>
</bean>
若maController这个Bean被URL为“test.go”所映射的话,这时就可以在URL中输入形如:
“http://192.168.0.21/abc/test.go?action=Method01”这时将由控制器MAController中的Method01来处理这个请求。这跟用HTML表单来表现用户的选择形式差不多,你来看
<form action="test.go">
 <select name="action">
  <option value="Method01"> method_01</option>
  <option value="Method02"> method_02</option>
  <option value="Method03"> method_03</option>
 </select>
</form>
这两种选择在形式上不同,但行为上和效果是相同的。

2、方法名解析器若用PropertiesMethodNameResolver,用
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">
       <props>
           <prop key="/methodA.go">Method01</prop>
           <prop key="/methodB.go">Method02</prop>
           <prop key="/methodC.go">Method03</prop>
       </props>
    </property>
</bean>
同时还要和SimpleUrlHandlerMapping一起用
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
         <props>
            <prop key="/method*.go">maController</prop>
         </props>
       </property>
     </bean>  

这时的URL就是如下的形式:
“http://192.168.0.21/项目名/methodA.go”由此看来,PropertiesMethodNameResolver更先进一步,它是将URL直接映射到控制器的一个方法。通过这个映射文件,我们可以看到,PropertiesMethodNameResolver的用法和SimpleUrlHandlerMapping非常相似。

3.方法名解析器若用InternalPathMethodNameResolver(缺省,但还是要通过SimpleUrlHandlerMapping请求),用
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
</bean>
同时还要和SimpleUrlHandlerMapping一起用
      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
         <props>
            <prop key="/methodA.go">maController</prop>
           <prop key="/methodB.go">maController</prop>
           <prop key="/methodC.go">maController</prop>
         </props>
       </property>
     </bean>  
4、当然,映射文件中,在定义maController时,若没有提及methodNameResolver的话,就说明要使用缺省方式的解析器了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值