在顛覆者中尝苇,我們看到過如下代碼。
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(MyMvcConfig.class);
ctx.setServletContext(servletContext); //2
Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); //3
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
servlet.setAsyncSupported(true);//1
}
}
那么這個DispatcherServlet起到了什么作用呢埠胖?
SpringMVC實現(xiàn)了兩種常見的設(shè)計模式:前端控制器模式與MVC模式糠溜。
對于前端控制器系統(tǒng),在設(shè)計時會為所有傳入的請求公開一個單獨的入口點直撤。在Java Web中非竿,這個入口點通常是個Servlet——這個特別的Servlet會將請求分派并委托給其他組件處理。對于SpringMVC來說谋竖,這個特別的Servlet就是DispatcherServlet红柱。
MVC設(shè)計模式是一種架構(gòu)風(fēng)格承匣,它整體描述了一個應(yīng)用,提倡在請求線程必須經(jīng)過的三個不同層次之間要明確分離的關(guān)注點锤悄,這三個層次分別是模型韧骗、視圖與控制器。
當(dāng)客戶端的請求被Servlet容器攔截時零聚,它會被路由到DispatcherServlet宽闲。DispatcherServlet會將請求發(fā)送給一個控制器。
SpringMVC的流程可以通過下圖來描述握牧。
(ViewResolver視圖解析器容诬,主要作用是把一個邏輯上的視圖名稱解析為一個真正的視圖。Handler Mapping處理器映射沿腰,把一個URL指定到一個Controller上览徒。)
DispatcherServlet是SpringMVC的入口點,DispatcherServlet依賴于HanderMapping的實現(xiàn)颂龙。根據(jù)不同的策略和特性习蓬,HanderMapping能夠解析出適用于某個請求的控制器方法處理程序。
當(dāng)DispatcherServlet有了控制器方法處理程序后措嵌,就會將請求指派給它躲叼。方法處理程序會將一個視圖名(或是視圖本身)以及填充好的模型數(shù)據(jù)返回給DispatcherServlet。
通過視圖名企巢,DispatcherServlet會請求ViewResolver的實現(xiàn)來查找并選擇視圖枫慷。
通過請求、視圖與模型浪规,DispatcherServlet就具備了構(gòu)建客戶端所需的一切或听。通過所有這些元素對視圖進行處理后,會將響應(yīng)返回給Servlet容器笋婿。