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()");
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM