1. 程式人生 > >SPRING MVC 中的 MULTIACTIONCONTROLLER 用法詳解 (轉載)

SPRING MVC 中的 MULTIACTIONCONTROLLER 用法詳解 (轉載)

http://www.blogjava.net/wuhen86/articles/288966.html

Spring MVC 中 Controller 的層次實在是多,有些眼花繚亂了。在單個的基礎上,再新加兩三個叫做豐富,再多就未必是好事,反而會令人縮手新聞片腳,無從定奪。
多數 Controller 都是隻完成一個任務,不過也有一個像 Struts 的 DispatchAction 的那樣的 Conntroller,
org.springframework.web.servlet.mvc.multiaction.MultiActionController,意即在一個 Controller 中處理多個動作,
如同一個業務的增、刪、改可以放在一起了。不至於增、刪、改各自為政,造成程式碼混亂、重複難以維護。

 本文中的 web.xml 的 org.springframework.web.servlet.DispatcherServlet 所處理的 url-pattern 是 *.html,
 如何搭建 Spring MVC 專案不細加說明,可參考我前面同系列的文章。

例如,下面的 UserController,有兩個簽名一樣的 updateUser() 和 deleteUser() 方法

public class UserController extends MultiActionController { 
  public ModelAndView updateUser(HttpServletRequest request, 
      HttpServletResponse response) { 
    System.out.println("updateUser");//方便於跟蹤執行了哪個方法 
    return new ModelAndView("userList","from","updateUser"); 
  } 
  public ModelAndView deleteUser(HttpServletRequest request, 
      HttpServletResponse response) { 
    System.out.println("deleteUser");//方便於跟蹤執行了哪個方法 
    return new ModelAndView("userList","from","deleteUser"); 
  } 
} 

用過 Struts 的 DispatchAction 的都知道,是通過 http://.../userAction.do?method=updateUser 的方式來指定執行哪個方法。
那 Spring MVC中是如何定位到所需方法上呢?

  Spring MVC 除了有一個叫做 HandlerMapping(把 URL 解析到 Controller) 的東西,還要把操作進一步解析到方法名上,
即要找到的 Controller 上的哪個方法並執行之。預設的方法名解析器是 InternalPathMethodNameResolver,它根據 URL 樣式解析方法名。

  在預設的 BeanNameUrlHandlerMapping 和預設的 InternalPathMethodNameResolver 協調之下,Bean 上下文可以這樣配置:

<bean name="/updateUser.html" class="com.unmi.UserController"/> 
<bean name="/deleteUser.html" class="com.unmi.UserController"/> 

  這樣分別通過下面的 URL 就能執行到正確的方法上去了:

  http://.../updateUser.html -- 將被 UserController.updateUser() 處理

  http://.../deleteUser.html  --  將被 UserController.deleteUser() 處理

  但是,你應該注意到了,上面的 com.unmi.UserController 配置了兩次,一來礙眼、二來原來只要 Singleton 的 UserController 例項不再是那麼回事了。
所以要引入 SimpleUrlHandlerMapping 對 Bean 配置進一步緊湊一下:

<bean id="userController" class="com.unmi.UserController"/> 
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">userController</prop> 
      <prop key="/deleteUser.html">userController</prop> 
    </props> 
  </property> 
</bean> 


說是緊湊,倒不如說 Bean 配置複雜了,反正不用配置兩個相同的 UserController 例項了。還是通過上面那兩個 URL 來訪問執行到相應的方法。

  除了預設的方法名解析器 InternalPathMethodNameResolver(注意了,Spring 中預設的 XXX 很多用 InternalXXX 的命名),還有兩種其他型別的方法名解析器:

  ·ParameterMethodNameResolver -- 根據請求中的引數解析執行方法名,相當於 Struts 的 DispathAction

  ·PropertiesMethodNameResolver -- 根據查詢一個 key/value 列表解析執行方法名,相當於 Struts 的 MappingDispatchAction(用得很少)

  下面逐一介紹使用上面兩種方法名解析器時的 Bean 配置及相應訪問的 URL。

 使用 ParameterMethodNameResolver 時的 Bean 配置(為簡單起見,又用回了預設的 HandlerMapping):

<bean name="/user.html" class="com.unmi.UserController">
 <property name="methodNameResolver">
 <ref bean="methodNameResolver"/>
 </property>
</bean>
<bean name="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
 <property name="paramName">
 <value>method</value>
 </property>
</bean>
這時候分別用下面的 URL 就能訪問到相應的方法

  http://.../user.html?method=updateUser -- 將被 UserController.updateUser() 處理

  http://.../user.html?method=deleteUser -- 將被 UserController.deleteUser() 處理

 通過引數的方式使得 HTML 表單表現使用者選擇成為可能,例如把 method 引數可放在一個下拉框或隱藏域中。

  使用 PropertiesMethodNameResolver 時的 Bean 配置

<bean id="userController" class="com.unmi.UserController" /> 
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">userController</prop> 
      <prop key="/deleteUser.html">userController</prop> 
    </props> 
  </property> 
</bean> 
<bean id="methodNameResolver"  class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">updateUser</prop> 
      <prop key="/deleteUser.html">deleteUser</prop> 
    </props> 
  </property> 
</bean> 

 這種配置有點複雜,PropertiesMethodNameResolver 不僅與 SimpleUrlHandlerMapping 相仿又有重疊,而且必須把 SimpleUrlHandlerMapping 拉進來,
 無法使用預設的 HandlerMapping。從上面的配置我們可以明顯的看出 HandlerMapping 和 MethodNameResolver 不同職責了,一個是定位 Controller,
 一個是定位 Method。

  這時候分別用下面的 URL 來訪問到相應 Controller 的方法

  http://.../updateUser.html -- 將被 UserController.updateUser() 處理

  http://.../deleteUser.html  --  將被 UserController.deleteUser() 處理

  這裡的 URL 恰巧和使用 InternalPathMethodNameResolver 時是一樣的,但一定要理解其實他們的機制是一樣的。

  PropertiesMethodNameResolver 把事性搞這麼複雜,被譽為最複雜的方法名解析器。可我還真看不出它還有什麼獨到之處,或值得一用的理由,
同時也不難理解 Struts 的 MappingDispatchAction 鮮為人知的緣由了。

相關推薦

SPRING MVC MULTIACTIONCONTROLLER 用法 (轉載)

http://www.blogjava.net/wuhen86/articles/288966.html Spring MVC 中 Controller 的層次實在是多,有些眼花繚亂了。在單個的基礎上,再新加兩三個叫做豐富,再多就未必是好事,反而會令人縮手新聞片腳,無

Spring Boot@RequestMapping 用法之地址對映(轉)

引言 前段時間使用springboot來開發專案,並且需要使用到傳輸JSON資料,並且踩了很多坑,無意中找到了這篇文章,詳細的說明了@RequestMapping的使用 簡介: @RequestMapping RequestMappin

Css路徑data:image/png;base64的用法 (轉載)

javascrip base64編碼 asc cda 文件的 color 情況 ont 背景圖片 大家可能註意到了,網頁上有些圖片的src或css背景圖片的url後面跟了一大串字符,比如: background-image:url(data:image/png;bas

Spring@Async用法及簡單例項

Spring中@Async用法 引言: 在Java應用中,絕大多數情況下都是通過同步的方式來實現互動處理的;但是在處理與第三方系統互動的時候,容易造成響應遲緩的情況,之前大部分都是使用多執行緒來完成此類任務,其實,在spring 3.x之後,就已經內建了@Async來完美解決這個問題,本文將完成

SpringSpring MVC原理及配置

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡

jar命令的用法(轉載)

load 可執行 list 最後一行 包含 ati target url 工具包 本文詳細講述了JAR命令的用法,對於大家學習和總結jar命令的使用有一定的幫助作用。具體如下: JAR包是Java中所特有一種壓縮文檔,其實大家就可以把它理解為.zip包。當然也是有區別的,J

Spring MVC原理及配置

對象 classpath oca entity attribute nco conf nal spring Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提

Pythonenumerate用法

num readline 文件的 簡單 += () 用法 字符 計數 enumerate()是python的內置函數、適用於python2.x和python3.xenumerate在字典上是枚舉、列舉的意思enumerate參數為可遍歷/可叠代的對象(如列表、字符串)enu

C#const用法

htm 鏈接 服務器 span img body 用法詳解 -s 設計 本文實例講述了C#中const用法。分享給大家供大家參考。具體用法分析如下: const是一個c語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性,另外,

C#protected用法

base 而是 報錯 public 我們 此刻 訪問 .html 定義 轉自(https://www.cnblogs.com/wangyt223/archive/2012/08/08/2627801.html) 在c#的可訪問性級別中,public和private算是最

Spring boot使用aop

array () bind intercept 通知 不同的 單獨使用 run arr 版權聲明:本文為博主武偉峰原創文章,轉載請註明地址http://blog.csdn.net/tianyaleixiaowu。 aop是spring的兩大功能模塊之一,功

spring boot使用JPA

1.首先在pom.xml檔案中匯入jar包 <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <g

JavaSimpleDateFormat用法

轉自:http://blog.csdn.net/linbooooo1987/article/details/7540999 [java]  view plain  copy

Maven依賴的scope(轉載)

ont 默認值 動作 周期 vid st表 傻傻 足夠 只需要 Maven的一個哲學是慣例優於配置(Convention Over Configuration), Maven默認的依賴配置項中,scope的默認值是compile,項目中經常傻傻的分不清,直接默認了。今天梳理

Java二進位制0用法

題目內容: 計算機內部用二進位制來表達所有的值。一個十進位制的數字,比如18,在一個32位的計算機內部被表達為00000000000000000000000000011000。可以看到,從左邊數過來,在第一個1之前,有27個0。我們把這些0稱作前導的零。 現在,你的任務是寫一個程式,輸入一

STLmap用法

Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆

C++的STLmap用法

Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料 處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡

Elasticsearch——Date Math在索引用法

在elasticsearch中,有時會想要通過索引日期來篩選查詢的資料,此時就需要用到日期數學表示式。 更多內容參考Elasticsearch翻譯彙總 基於日期數學表示式的索引 模式如下: <static_name{date_math_expr{date_format|time_zone}}>

Spring mvc MultiActionController的三種methodNameResolver

三種methodNameResolver分別為: org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver org.springframework.web.servlet.m

javaArrayList用法,基本用法(含增刪改查)

1、什麼是ArrayList ArrayList就是動態陣列,它提供了①動態的增加和減少元素 ②實現了ICollection和IList介面 ③靈活的設定陣列的大小ArrayList是一個其容量能夠動態增長的動態陣列。它繼承了AbstractList,實現了List、Rand