zoukankan      html  css  js  c++  java
  • MultiActionController中的处理方法映射

    一般情况下,一个控制器只处理一个动作,这有很大的局限性,若要实现几个相似的功能,应该使用“多动作控制器”(MultiActionController),

    MultiActionController是一个特殊类型的控制器,它可实现多个动作。而该控制器中的每个动作分派给不同的方法,其实多控制器中的每个方法实现的是类似的功能,每个方法代表了一个可以由一个单独控制器完成的动作。

    那么这样的控制器里的诸多方法,是怎样选择执行的呢?MultiActionController对此有一个名为“方法名解析器”的东东来做这项工作。

    MultiActionController中的方法名解析器共有三个:

    0InternalPathMethodNameResolver——这是MultiActionController的缺省情况下的方法名解析器,它是根据URL样式来解析方法名的。(实际上就是根据URL中的“文件名部分”决定的)。

    除了上面的缺省的解析器外,MultiActionController还有两个方法名解析器:

    1ParameterMethodNameResolver——根据请求中的参数来解析并执行方法名。

    2PropertiesMethodNameResolver——根据查询一个key/value列表来解析并执行方法名。

     

     

    举个例子吧,

    比如说,有一个名为MAController的控制器,是MultiActionController的子类,它有里边有三个方法分别是method01method02method03。其代码如下:

     

    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这个BeanURL为“test.go”所映射的话,这时就可以在URL中输入形如:

    “http://…/test.go?action=Method01”

    这时将由控制器MAController中的Method01来处理这个请求。这跟用HTML表单来表现用户的选择形式差不多,你来看

    <form action="test.go">

    Sort by: <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>

     

     

    这时的URL就是如下的形式

    “http://…/methodA.go”   

     

     

     

    由此看来,PropertiesMethodNameResolver更先进一步,它是将URL直接映射到控制器的一个方法。通过这个映射文件,我们可以看到,PropertiesMethodNameResolver的用法和SimpleUrlHandlerMapping非常相似。

     

    0、当然,映射文件中,在定义maController时,若没有提及methodNameResolver的话,就说明要使用缺省方式的解析器了,这时,要选择多动作控制器中的某一方法,就在URL中输入形如下面(假定maController映射到URL样式为“/method*.go”):

    http://…/method01.go

    这个将被maController中的Method01方法处理。

  • 相关阅读:
    编译安装php
    CentOS yum 安装LAMP PHP5.4版本
    CentOS下php安装mcrypt扩展
    CentOS安装crontab及使用方法(转)
    解决svn "cannot set LC_CTYPE locale"的问题
    CentOS下通过yum安装svn及配置
    linux svn启动和关闭
    vagrant启动报错The following SSH command responded with a no
    并行进程问题
    利用集群因子优化
  • 原文地址:https://www.cnblogs.com/forestwolf/p/2998245.html
Copyright © 2011-2022 走看看