zoukankan      html  css  js  c++  java
  • SpringMVC学习(四)——处理器Handler的各种常用实现

      代码:http://files.cnblogs.com/files/douJiangYouTiao888/MultiActionController.zip

      在使用springMVC的开发过程中,Handler(就是Controller)是我们需要手动开发的主要内容,注解的配置方式比较固定,可以限定请求方式,请求映射到方法级,基本可以满足我们的日常需求。所以这里主要记录基于xml配置方式的各种Handler。

      这里引用开涛SpringMVC PDF中的一张图片:

    这里学习一下比较常用的几种实现方式:

      Controller:最顶层的接口,也是最简单的,重写handleRequest()即可。

      AbstractController:比较常用的一个接口,重写handleRequestInternal()即可。AbstractController接口实现了org.springframework.web.servlet.support.WebContentGenerator接口。提供了针对http请求的设定,在我的springMVC(二)示例代码中有体现,如:

        supportedMethods:GET、POST等请求的设定

        cacheSeconds:响应缓存时间

      ServletForwardingController:将拦截的请求交由某个servlet来处理

      MultiActionController:一个controller集成多个不同的请求,解决目前controller只能处理一个请求的问题。

    这里主要说一下MultiActionController的使用:

    类结构:

    public class MultiActionController extends AbstractController implements LastModified{
      ...
      /*
       * 略过其他属性,直接看这个resolver是最重要的,由它来决定URL到Controller.method()的映射,默认实现为InternalPathMethodNameResolver
       * 除此之外,还有两个比较常用的实现,稍后在下面介绍使用方式:
       *   ParameterMethodNameResolver:根据请求参数匹配method
       *   PropertiesMethodNameResolver:根据请求URL匹配method
       */
      private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
      ...
    }

    MethodNameResolver类结构图:

    配置方式:

    一、根据请求URL匹配method,默认实现:InternalPathMethodNameResolver

      <!-- 
            InternalPathMethodNameResolver,可以不配置methodNameResolver,
            如果需要prefix和suffix可以配置methodNameResolver,调用controller.${prefix}**${suffix}
            请求/paramAction/add,调用Controller.padds()
         -->
        <bean name="/paramAction/**" class="com.wang.controller.MultiController">
            <property name="methodNameResolver">
                <bean
                    class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
                    <property name="prefix" value="p"></property>
                    <property name="suffix" value="s"></property>
                </bean>
            </property>
        </bean>

    二、根据请求参数匹配method:ParameterMethodNameResolver

      <!-- ParameterMethodNameResolver -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/paramMulti.do">paramAction</prop>
                </props>
            </property>
        </bean>
    
      <bean id="paramMultiResolver"
            class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
            <!-- 指定参数key映射方法,即xxx?action=sb,执行Controller的sb() -->
            <property name="paramName" value="action" />
            <!-- 未指定action参数时,默认执行的方法,即xxx?a=1,执行execute() -->
            <property name="defaultMethodName" value="execute"></property>
            <!-- 请求参数包含list、create、update时默认会执行Controller.list()、create()、update(), 
                但是配置logicalMappings后会将create()映射为createLogical(), 如:http://localhost:8088/paramMulti.do?action=add&create 
                执行createLogical() -->
            <property name="methodParamNames" value="list,create,update"></property>
            <!-- 方法映射,action=add时,映射到Controller.addLogical();action=list,映射到list() -->
            <property name="logicalMappings">
                <props>
                    <prop key="add">add</prop>
                    <prop key="list">list</prop>
                    <prop key="create">createLogical</prop>
                    <prop key="update">update</prop>
                    <prop key="execute">sbExecute</prop>
                </props>
            </property>
        </bean>
    
      <bean id="paramAction" class="com.wang.controller.MultiController">
            <!-- 通过参数调用方法:ParameterMethodNameResolver  -->
            <property name="methodNameResolver" ref="paramMultiResolver"></property>
        </bean>

    三、根据请求URL匹配method:PropertiesMethodNameResolver

      <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <prop key="/propertiesMulti/**">paramAction</prop>
                </props>
            </property>
        </bean>
        
        <!-- PropertiesMethodNameResolver -->
        <bean id="propertiesMultiResolver"
            class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
            <property name="mappings">
                <props>
                    <prop key="/propertiesMulti/add">add</prop>
                    <prop key="/propertiesMulti/list">list</prop>
                    <prop key="/propertiesMulti/update">update</prop>
                    <prop key="/propertiesMulti/create">create</prop>
                    <prop key="/**">execute</prop>
                </props>
            </property>
        </bean>
      <bean id="paramAction" class="com.wang.controller.MultiController">
            <!-- 通过URL调用方法:PropertiesMethodNameResolver -->
            <property name="methodNameResolver" ref="propertiesMultiResolver"></property>
        </bean>

    controller:

    /**
     * 继承MultiActionController类,并自定义方法
     * 方法格式:public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
     * @author wlyfree
     *
     */
    public class MultiController extends MultiActionController{
    
        public ModelAndView add(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController add()");
            ModelAndView mv = new ModelAndView();   
            mv.addObject("message","add");   
            mv.setViewName("add");   
            return mv;
        }
        
        public ModelAndView padds(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController add()");
            ModelAndView mv = new ModelAndView();   
            mv.addObject("message","add");   
            mv.setViewName("add");   
            return mv;
        }
        
        public void addLogical(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController addLogical()");
        }
        public void createLogical(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController createLogical()");
        }
        public void list(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController list()");
        }
        public void create(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController create()");
        }
        public void update(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController update()");
        }
        public void execute(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController execute()");
        }
        public void sbExecute(HttpServletRequest request,HttpServletResponse response){
            System.err.println("MultiController select()");
        }
    }
  • 相关阅读:
    HTTP请求方法 GET POST【总结】
    Data Binding MVVM 数据绑定 总结
    Butter Knife 黄油刀
    原生JS强大DOM选择器querySelector与querySelectorAll
    JS日期Date详解与实例扩展
    JS中的冒泡排序以及实现一个数组中得最到最大的数字小例
    jquery.roundabout.js实现3D图片层叠旋转木马切换
    AngularJS 表格
    AngularJS XMLHttpRequest
    AngularJS Filters
  • 原文地址:https://www.cnblogs.com/douJiangYouTiao888/p/6706210.html
Copyright © 2011-2022 走看看