`

MultiActionController的映射

阅读更多
相对于其他控制器,SpringMVC的特点是"拥有多种控制器",虽说这种控制器照猫画虎的使用起来非常简单,但是如果是自己创建一个应用的话,如何选择Controller还是一个比较有深度的问题。所以掌握每个Controller将是使用好SpringMVC的重要重要前提。
下边的文章是我转载的:(源地址 http://ccbwm.spaces.live.com/blog/cns!41D66FDD19ED0FB!303.entry
        一般情况下,一个控制器只处理一个动作,这有很大的局限性,若要实现几个相似的功能,应该使用“多动作控制器”(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>
这时的URL就是如下的形式:
“http://192.168.0.21/abc/methodA.go”由此看来,PropertiesMethodNameResolver更先进一步,它是将URL直接映射到控制器的一个方法。通过这个映射文件,我们可以看到,PropertiesMethodNameResolver的用法和SimpleUrlHandlerMapping非常相似。

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

相关推荐

    springmvcdemo

    3 URL Mapping: ControllerClassNameHandlerMapping 映射控制器 4 使用MultiActionController 5 所有service利用spring注入到controller中,利用注解 6 数据库连接串单独在properties文件配置 7 在spring中配置数据...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    10.5.4 多动作控制器(MultiActionController) 10.6 Spring的视图映射机制 10.6.1 分发器(DispatcherServlet) 10.6.2 视图映射 10.7 Spring的模型(Model) 10.7.1 模型简介 10.7.2 模型封装 10.8 小结 第十一章 ...

    spring chm文档

    13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. ...

    Spring中文帮助文档

    13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. ...

    Spring API

    13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. ...

    Spring 2.0 开发参考手册

    13.3.3. MultiActionController 13.3.4. 命令控制器 13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. ...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.4. 处理器映射(handler mapping) 13.4.1. BeanNameUrlHandlerMapping 13.4.2. SimpleUrlHandlerMapping 13.4.3. 拦截器(HandlerInterceptor) 13.5. 视图与视图解析 13.5.1. 视图解析器 13.5.2. 视图解析链 ...

Global site tag (gtag.js) - Google Analytics