處理器映射器(HandlerMapping)及處理器適配器(HandlerAdapter)詳解(一)


非注解 處理器映射器 和 處理器適配器

  處理器映射器:

  第一種: BeanNameUrlHandlerMapping

<!-- 配置Handler -->
<bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />

<!-- 處理器映射器 將bean的name作為url進行查找, bean就是我們寫的Handler,所以我們需要在配置Handler時指定beanname(就是url) -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

 

  第二種:SimpleUrlHandlerMapping

 

<!-- 配置Handler 實現 Controller 接口 的 Handler
  既有 name 屬性 可以讓 BeanNameUrlHandlerMapping 處理器映射器 映射到,
  又有 id
屬性 可以在 SimpleUrlHandlerMapping 處理器映射器 中進行映射-->
<bean id="userController1" name="/queryUsers.action" class="com.bjxb.ssm.controller.UserController" />

<!-- 配置Handler,實現 HttpRequestHandlerAdapter 接口 的 Handler -->
<bean id="userController2" class="com.bjxb.ssm.controller.UserController2"/>

<!-- 簡單URL映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 對userController1進行URL映射,URL是/queryUsers.action 同一個Bean可以有多個URL與之映射 -->
            <prop key="/queryUsers1.action">userController1</prop>
            <prop key="/queryUsers2.action">userController1</prop>
            <prop key="/queryUsers3.action">userController2</prop>
        </props>
    </property>
</bean> 

 

 

 

  

  注意:上面兩種處理器映射器,我們是在同一個 xml 文件中配置,並且根據不同的 URL 都能正常訪問。

  結論:多個處理器映射器可以並存,前端控制器判斷 URL 能讓哪些映射器映射,從中選擇正確的映射器處理。

 

 

  非注解的適配器:

  第一種:SimpleControllerHandlerAdapter

<!-- 處理器適配器 所有的處理器適配器都實現 HandlerAdapter接口 這里我們使用SimpleControllerHandlerAdapter 處理器適配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

   

   注意:這款適配器要求我們編寫的 Handler 實現 Controller 接口

  

  Handler如下:

public class UserController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ArrayList<User> userlist = new ArrayList<User>(); User user1 = new User("騰博","123456"); User user2 = new User("小兵","123456"); System.out.println("我來了"); userlist.add(user1); userlist.add(user2); // 返回ModelAndView
        ModelAndView modelAndView = new ModelAndView(); // 相當於request的setAttribute,在jsp頁面中通過userlist取數據
        modelAndView.addObject("userlist", userlist); // 指定視圖
        modelAndView.setViewName("/WEB-INF/jsp/users/user.jsp"); return modelAndView; } }

 

 

 

  第二種:HttpRequestHandlerAdapter

<!-- 另一個非注解的處理器適配器 HttpRequestHandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

 

   注意:這款適配器要求我們編寫的 Handler 實現 HttpRequestHandler 接口

 

    

    Handler如下

 

 

public class UserController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ArrayList<User> userlist = new ArrayList<User>(); User user1 = new User("騰博","123456"); User user2 = new User("小兵","123456"); System.out.println("我來了"); userlist.add(user1); userlist.add(user2); // 設置模型數據
        request.setAttribute("userlist", userlist); // 設置轉發的視圖
        request.getRequestDispatcher("/WEB-INF/jsp/users/user.jsp").forward(request, response); // 使用此接口,我們可以通過修改response,設置響應的數據格式,比如響應json數據 // response.setCharacterEncoding("utf-8"); // response.setContentType("application/json;charset=utf-8"); // response.getWriter().write("json串");
 } }

 

  經過上面的分析我們發現:

    處理器映射器就是:根據我們的 URL 尋找 Handler
    處理器適配器就是:按照它要求的規則去執行 Handler

    而且我們發現:非注解形式的 HandlerMapping 和 HandlerAdapter 所對應的 Handler,一個類中只有一個方法,處理能力有限,比較繁瑣

 


免責聲明!

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



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