SpringMVC的映射器,適配器,控制器
一、各司其職
(1)HandlerMapping映射器
根據客戶端請求的url,找到處理本次請求的處理器,即將請求的路徑和controller關聯起來
(2)HandlerAdapter適配器
對映射器查找到的controller中的方法進行調用,包括對實現了Controller接口的控制器適配,HttpRequestHandler適配,和Controller註解適配等
(3)HandlerController控制器
執行核心的業務邏輯
二、部分功能概述
(1)映射器 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping:通過所配置的Action的name屬性路徑,路由到指定的控制器。
<bean name="/beanurl.action" class="com.jyk.springmvc.BeanNameUrlHanderMapping.HelloHAE"></bean> <bean name="/delete.action" class="com.jyk.springmvc.BeanNameUrlHanderMapping.HelloHAE"></bean> <bean name="/update.action" class="com.jyk.springmvc.BeanNameUrlHanderMapping.HelloHAE"></bean> <bean name="/find.action" class="com.jyk.springmvc.BeanNameUrlHanderMapping.HelloHAE"></bean>
(2)映射器 org.springframework.web.servlet.handler.SimpleUrlHandlerMapping:xx.action,yy.action,oo.action等請求路徑都交由標簽為id的控制器處理,即多個路徑映射到一個Action
<!-- 映射器,此部分配置用以取代上面復雜配置 1、首先註冊業務實現類 2、接著配置映射器(Simple)--> <bean id="userAction" class="com.jyk.springmvc.BeanNameUrlHanderMapping.HelloHAE"> </bean> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/beanurl.action">userAction</prop> <prop key="/delete.action">userAction</prop> <prop key="/update.action">userAction</prop> <prop key="/find.action">userAction</prop> </props> </property> </bean>
(2)適配器 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter:因此Spring定義了一個適配接口,使得每一種Controller有一種對應的適配器實現類,
讓適配器代替controller執行相應的方法。這樣在擴展Controller 時,只需要增加一個適配器類就完成了SpringMVC的擴展了,springmvc適配器的精妙設計詳情請見https://www.cnblogs.com/tongkey/p/7919401.html或https://blog.csdn.net/u010288264/article/details/53835185,感謝作者。
(3)控制器 org.springframework.web.servlet.mvc.ParameterizableViewController 如果請求是A.jsp的請求路徑,希望跳轉到B.jsp頁面,不經過定義的控制器處理
<!-- jsp到jsp頁面的轉發控制器 --> <bean name="/index.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value="/index.jsp"/> </bean>
(4)控制器 org.springframework.web.servlet.mvc.AbstractCommandController : 能夠以實體的形式,收集客戶端參數
<bean name="/add.action" class="com.jyk.springmvc.controller.AdminAction"> </bean>
public class AdminAction extends AbstractCommandController{ public AdminAction(){ this.setCommandClass(Admin.class); } @Override protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object obj, BindException bindException)throws Exception { System.out.println("AdminAction::handle"); ModelAndView modelAndView = new ModelAndView(); Admin admin = null; if(obj instanceof Admin){ admin = (Admin) obj; } modelAndView.addObject("username",admin.getUsername()); modelAndView.addObject("gender",admin.getGender()); modelAndView.addObject("hiredate",admin.getHiredate()); modelAndView.setViewName("/jsp/success.jsp"); return modelAndView; } }
SpringMVC的映射器,適配器,控制器