HandlerMapping 處理器映射 HTTP請求被DispatcherServlet攔截後,會調用HandlerMapping來處理,HandlerMapping根據 url<=>controller 之間的映射關係來確定要調用哪個controller來處理。 有2種HandlerMappin ...
HandlerMapping 處理器映射
HTTP請求被DispatcherServlet攔截後,會調用HandlerMapping來處理,HandlerMapping根據 url<=>controller 之間的映射關係來確定要調用哪個controller來處理。
有2種HandlerMapping:
-
BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <bean name="/userController" class="com.chy.controller.UserController" />
http://localhost:8080/springmvc_war_exploded/userController
BeanNameUrl,顧名思義,映射關係是BeanName <=> Url,url地址對應bean的name,根據url中的beanname確定要調用的controller。
-
SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <!-- 使用props配置url-controller之間的映射關係 --> <props> <!-- 一個prop配置一個映射,key指定url,value指定bean的id或name。可使用多個prop。 --> <prop key="/userController">userController</prop> </props> </property> </bean> <bean name="userController" class="com.chy.controller.UserController" />
http://localhost:8080/springmvc_war_exploded/userController
url是/userController,去<props>中找到key=/userController的<prop>,得到要調用的controller的name或id。
HandlerAdapter 處理器適配器
HandlerMapping確定要調用的controller後,將要調用的controller告訴DispatcherServlet,
由DispatcherServlet調用controller所屬的HandlerAdapter,再由HandlerAdapter來調用controller。
HandlerAdapter有2種:
-
SimpleControllerHandlerAdapter(推薦)
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
public class UserController implements Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { //視圖可以在構造器中指定,也可以先使用空參構造器,在調用setter方法設置 ModelAndView mav = new ModelAndView("user_info"); User user = new User(); user.setUsername("chy"); user.setPassword("abcd"); //向視圖傳遞數據 mav.addObject("user", user); return mav; } }
SimpleControllerHandlerAdapter,名字中有Controller,實現的自然是Controller介面。
方法要返回一個ModelAndView類型的值。
這個ModelAndView由controller返回給HandlerAdapter,再由HandlerAdapter返回給DispatcherServlet。
DispatcherServlet調用配置的ViewResolver來解析ModelAndView,獲取裡面的model(數據)、view(視圖名),並將數據、視圖名返回給DispatcherServlet。
DispatcherServelt對View進行渲染(把模型數據填入視圖中),把渲染好的視圖返回個瀏覽器。
所以需要搭配ViewResolver使用:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--首碼--> <property name="prefix" value="/WEB-INF/jsp/" /> <!--尾碼--> <property name="suffix" value=".jsp" /> </bean>
視圖解析器也有好幾種,此處不再一一介紹。
-
HttpRequestHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />
public class UserController implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { User user = new User(); user.setUsername("chy"); user.setPassword("abcd"); //向視圖傳遞數據 httpServletRequest.setAttribute("user",user); //將請求轉發到視圖(地址欄的url不變) RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher("/WEB-INF/jsp/user_info.jsp"); dispatcher.forward(httpServletRequest,httpServletResponse); } }
適配器與實現的介面是對應的。使用請求轉發實現,返回值是void。
ViewResolver是解析ModelAndView用的,既然返回值是void,就不使用視圖解析器,沒有視圖名的拼接,需要寫視圖的完整路徑。
此種方式是Servlet的實現方式,不建議使用。儘量使用ModelAndView的方式,更加符合mvc的思想。