Web on Servlet Stack(version 5.0.15.RELEASE)
本系列參考文檔都是由spring官方參考文檔翻譯而來
第一章Spring Web Mvc
1介紹
Spring Web MVC框架是建立在Servlet API上的,并且最初被包含在springframe work中的web框架。 正式命名為“Spring Web MVC框架”來自他的源源模塊spring-webmvc坠敷,但它通常被稱為“Spring MVC” .
與Spring Web MVC類似堵幽,Spring框架5.0中引入的響應(yīng)式堆棧web框架季希,它被命名為“Spring WebFlux”也是基于它的源模塊Spring - WebFlux。本節(jié)涵蓋Spring Web MVC框架, 下一節(jié)的部分涵蓋Spring WebFlux
一些與Servlet容器和Java EE版本范圍的基準信息和兼容性信息可以訪問Spring框架的Wiki
1.1 (分發(fā)器)DispatcherServlet
在Spring WebFlux中也是同樣的。
Spring MVC涧郊,像許多其它Web框架一樣,被設(shè)計圍繞前端控制器模型眼五,他的核心Servlet DispatcherServlet提供了一種共享算法妆艘,用于請求處理,實際工作的共享算法由可配置的被委托的組件來執(zhí)行看幼。 該模型是靈活多樣并且支持多樣化的工作流批旺。 DispatcherServlet和任何一個Servlet一樣,需要根據(jù)使用Java配置或web.xml中的Servlet規(guī)范來聲明和映射诵姜。 反過來DispatcherServlet的使用Spring配置來發(fā)現(xiàn)他需要請求映射汽煮,視圖解析,異常處理等等的委托組件。下面是Java 配置的一個例子暇赤,并注冊和初始化DispatcherServlet心例。這個類被Servlet 容器自動檢測到(參見Servlet的配置):
// JAVA 代碼
public class MyWebApplicationInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletCxt){
// Load Spring web application configuration
AnnotationConfigWebApplicationContext ac=new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
ac.refresh();
// Create and register the Dispatcher Servlet
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletCxt.addServlet("app",servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/app/*");
}
}
//Kotlin代碼
class MyWebApplicationInitializer : WebApplicationInitializer {
override fun onStartup(servletCxt: ServletContext) {
// Load Spring web application configuration
val ac = AnnotationConfigWebApplicationContext()
ac.register(AppConfig::class.java)
ac.refresh()
// Create and register the DispatcherServlet
val servlet = DispatcherServlet(ac)
val registration = servletCxt.addServlet("app", servlet)
registration.setLoadOnStartup(1)
registration.addMapping("/app/*")
}
}
除了能直接用ServletContext的API之外,你也能可以繼承AbstractAnnotationConfigDispatcherServletInitializer同時復寫特定的方法翎卓。
接下來的例子是用web.xml來進行配置并且并注冊和初始化DispatcherServlet的契邀。
<web-app>
<listener>
<listenerclass>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servletclass>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
1.1.1上下文層級結(jié)構(gòu)(Context Hierarchy)
DispatcherServlet用他自己的配置來預(yù)測 WebApplicationContext 摆寄,WebApplicationContext有一個鏈接指向與他有關(guān)聯(lián)的ServletContext and the Servlet. 它還綁定到 ServletContext失暴,以便應(yīng)用程序可以使用靜態(tài)方法在RequestContextUtils上查找 WebApplicationContext,如果他們需要訪問它微饥。
對于許多應(yīng)用程序逗扒,擁有單個 WebApplicationContext非常簡單且足夠。這也可能有一個上下文層次結(jié)構(gòu)欠橘,其中一個根 WebApplicationContext被多個DispatcherServlet(或其他 Servlet)實例共享矩肩,每個實例都有自己的子WebApplicationContext配置。有關(guān)詳細信息肃续,請參閱WebApplicationContext章節(jié)的上下文層次結(jié)構(gòu)特征黍檩。
The root WebApplicationContext typically contains infrastructure beans, such as data repositories
and business services that need to be shared across multiple Servlet instances. Those beans are
effectively inherited and can be overridden (that is, re-declared) in the Servlet-specific child
WebApplicationContext, which typically contains beans local to the given Servlet. The following
image shows this relationship:
根 Web 應(yīng)用程序上下文通常包含基礎(chǔ)結(jié)構(gòu) bean,如數(shù)據(jù)存儲庫以及需要跨多個 Servlet 實例共享的業(yè)務(wù)服務(wù)始锚。那些Beans是有效繼承刽酱,并可以重寫(即重新聲明)在 Servlet 特定的子級WebApplicationContext,它通常包含給定 Servlet 的本地 bean瞧捌。下圖顯示此關(guān)系: