<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Spring MVC 中 Controller 的層次實(shí)在是多,有些眼花繚亂了。在單個(gè)的基礎(chǔ)上,再新加兩三個(gè)叫做豐富,再多就未必是好事,反而會(huì)令人縮手新聞片腳,無(wú)從定奪。
    多數(shù) Controller 都是只完成一個(gè)任務(wù),不過(guò)也有一個(gè)像 Struts 的 DispatchAction 的那樣的 Conntroller,
    org.springframework.web.servlet.mvc.multiaction.MultiActionController,意即在一個(gè) Controller 中處理多個(gè)動(dòng)作,
    如同一個(gè)業(yè)務(wù)的增、刪、改可以放在一起了。不至于增、刪、改各自為政,造成代碼混亂、重復(fù)難以維護(hù)。

     本文中的 web.xml 的 org.springframework.web.servlet.DispatcherServlet 所處理的 url-pattern 是 *.html,
     如何搭建 Spring MVC 項(xiàng)目不細(xì)加說(shuō)明,可參考我前面同系列的文章。

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

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

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

      Spring MVC 除了有一個(gè)叫做 HandlerMapping(把 URL 解析到 Controller) 的東西,還要把操作進(jìn)一步解析到方法名上,
    即要找到的 Controller 上的哪個(gè)方法并執(zhí)行之。缺省的方法名解析器是 InternalPathMethodNameResolver,它根據(jù) URL 樣式解析方法名。

      在缺省的 BeanNameUrlHandlerMapping 和缺省的 InternalPathMethodNameResolver 協(xié)調(diào)之下,Bean 上下文可以這樣配置:

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

      這樣分別通過(guò)下面的 URL 就能執(zhí)行到正確的方法上去了:

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

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

      但是,你應(yīng)該注意到了,上面的 com.unmi.UserController 配置了兩次,一來(lái)礙眼、二來(lái)原來(lái)只要 Singleton 的 UserController 實(shí)例不再是那么回事了。
    所以要引入 SimpleUrlHandlerMapping 對(duì) Bean 配置進(jìn)一步緊湊一下:

    <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> 


    說(shuō)是緊湊,倒不如說(shuō) Bean 配置復(fù)雜了,反正不用配置兩個(gè)相同的 UserController 實(shí)例了。還是通過(guò)上面那兩個(gè) URL 來(lái)訪問(wèn)執(zhí)行到相應(yīng)的方法。

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

      ·ParameterMethodNameResolver -- 根據(jù)請(qǐng)求中的參數(shù)解析執(zhí)行方法名,相當(dāng)于 Struts 的 DispathAction

      ·PropertiesMethodNameResolver -- 根據(jù)查詢一個(gè) key/value 列表解析執(zhí)行方法名,相當(dāng)于 Struts 的 MappingDispatchAction(用得很少)

      下面逐一介紹使用上面兩種方法名解析器時(shí)的 Bean 配置及相應(yīng)訪問(wèn)的 URL。

     使用 ParameterMethodNameResolver 時(shí)的 Bean 配置(為簡(jiǎn)單起見(jiàn),又用回了缺省的 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>
    這時(shí)候分別用下面的 URL 就能訪問(wèn)到相應(yīng)的方法

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

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

     通過(guò)參數(shù)的方式使得 HTML 表單表現(xiàn)用戶選擇成為可能,例如把 method 參數(shù)可放在一個(gè)下拉框或隱藏域中。

      使用 PropertiesMethodNameResolver 時(shí)的 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> 

     這種配置有點(diǎn)復(fù)雜,PropertiesMethodNameResolver 不僅與 SimpleUrlHandlerMapping 相仿又有重疊,而且必須把 SimpleUrlHandlerMapping 拉進(jìn)來(lái),
     無(wú)法使用默認(rèn)的 HandlerMapping。從上面的配置我們可以明顯的看出 HandlerMapping 和 MethodNameResolver 不同職責(zé)了,一個(gè)是定位 Controller,
     一個(gè)是定位 Method。

      這時(shí)候分別用下面的 URL 來(lái)訪問(wèn)到相應(yīng) Controller 的方法

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

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

      這里的 URL 恰巧和使用 InternalPathMethodNameResolver 時(shí)是一樣的,但一定要理解其實(shí)他們的機(jī)制是一樣的。

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

    主站蜘蛛池模板: 中国在线观看免费高清完整版| jizzjizz亚洲日本少妇| 午夜亚洲www湿好大| 亚洲人成图片小说网站| 久久影视国产亚洲| 亚洲中文字幕在线乱码| 亚洲无线码一区二区三区| 国产亚洲自拍一区| 浮力影院亚洲国产第一页| 亚洲中文字幕无码爆乳AV| 国产亚洲综合一区柠檬导航| 国产亚洲综合久久系列| 亚洲国产精华液网站w| 久久久久亚洲AV片无码| 久久精品国产亚洲AV无码麻豆| 7777久久亚洲中文字幕蜜桃| 亚洲国产精品无码久久久| 亚洲娇小性色xxxx| 亚洲av无码专区在线电影| 亚洲AV无码一区二区三区牲色| 在线观看亚洲网站| 丝袜足液精子免费视频| 免费福利在线视频| 黄色网址免费大全| 国产高清免费观看| 亚洲综合色区在线观看| 亚洲AV第一页国产精品| 亚洲视频一区二区在线观看| 亚洲一级毛片免费观看| 久久亚洲精品高潮综合色a片| h视频在线免费观看| 67pao强力打造高清免费| 四虎成人精品一区二区免费网站 | 亚洲人成色777777老人头| 亚洲国产成人手机在线观看| 羞羞视频在线免费观看| 最近国语视频在线观看免费播放 | 亚洲妇女无套内射精| 日本高清免费中文在线看| 国产啪精品视频网站免费尤物| 一级毛片aaaaaa免费看|