W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Spring MVC框架,與其他很多web的MVC框架一樣:請(qǐng)求驅(qū)動(dòng);所有設(shè)計(jì)都圍繞著一個(gè)中央Servlet來(lái)展開(kāi),它負(fù)責(zé)把所有請(qǐng)求分發(fā)到控制器;同時(shí)提供其他web應(yīng)用開(kāi)發(fā)所需要的功能。不過(guò)Spring的中央處理器,DispatcherServlet
,能做的比這更多。它與Spring IoC容器做到了無(wú)縫集成,這意味著,Spring提供的任何特性,在Spring MVC中你都可以使用。
下圖展示了Spring Web MVC的DispatcherServlet
處理請(qǐng)求的工作流。熟悉設(shè)計(jì)模式的朋友會(huì)發(fā)現(xiàn),DispatcherServlet
應(yīng)用的其實(shí)就是一個(gè)“前端控制器”的設(shè)計(jì)模式(其他很多優(yōu)秀的web框架也都使用了這個(gè)設(shè)計(jì)模式)。
圖21.1Spring Web MVC處理請(qǐng)求的(高層抽象)工作流
DispatcherServlet
其實(shí)就是個(gè)Servlet
(它繼承自HttpServlet
基類(lèi)),同樣也需要在你web應(yīng)用的web.xml
配置文件下聲明。你需要在web.xml
文件中把你希望DispatcherServlet
處理的請(qǐng)求映射到對(duì)應(yīng)的URL上去。這就是標(biāo)準(zhǔn)的Java EE Servlet配置;下面的代碼就展示了對(duì)DispatcherServlet
和路徑映射的聲明:
<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
</web-app>
In the preceding example, all requests starting with
/example
will be handled by theDispatcherServlet
instance named example. In a Servlet 3.0+ environment, you also have the option of configuring the Servlet container programmatically. Below is the code based equivalent of the above web.xml example:
在上面的例子中,所有路徑以/example
開(kāi)頭的請(qǐng)求都會(huì)被名字為example
的DispatcherServlet
處理。在Servlet 3.0+的環(huán)境下,你還可以用編程的方式配置Servlet容器。下面是一段這種基于代碼配置的例子,它與上面定義的web.xml
配置文件是等效的。
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
registration.setLoadOnStartup(1);
registration.addMapping("/example/*");
}
}
WebApplicationInitializer
是Spring MVC提供的一個(gè)接口,它會(huì)查找你所有基于代碼的配置,并應(yīng)用它們來(lái)初始化Servlet 3版本以上的web容器。它有一個(gè)抽象的實(shí)現(xiàn)AbstractDispatcherServletInitializer
,用以簡(jiǎn)化DispatcherServlet
的注冊(cè)工作:你只需要指定其servlet映射(mapping)即可。若想了解更多細(xì)節(jié),可以參考基于代碼的Servlet容器初始化一節(jié)。
上面只是配置Spring Web MVC的第一步,接下來(lái)你需要配置其他的一些bean(除了DispatcherServlet
以外的其他bean),它們也會(huì)被Spring Web MVC框架使用到。
在6.15 應(yīng)用上下文ApplicationContext的其他作用)一節(jié)中我們聊到,Spring中的ApplicationContext
實(shí)例是可以有范圍(scope)的。在Spring MVC中,每個(gè)DispatcherServlet
都持有一個(gè)自己的上下文對(duì)象WebApplicationContext
,它又繼承了根(root)WebApplicationContext
對(duì)象中已經(jīng)定義的所有bean。這些繼承的bean可以在具體的Servlet實(shí)例中被重載,在每個(gè)Servlet實(shí)例中你也可以定義其scope下的新bean。
DispatcherServlet
的初始化過(guò)程中,Spring MVC會(huì)在你web應(yīng)用的WEB-INF
目錄下查找一個(gè)名為[servlet-name]-servlet.xml的配置文件,并創(chuàng)建其中所定義的bean。如果在全局上下文中存在相同名字的bean,則它們將被新定義的同名bean覆蓋。
看看下面這個(gè)DispatcherServlet
的Servlet配置(定義于web.xml文件中):
<web-app>
<servlet>
<servlet-name>golfing</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>golfing</servlet-name>
<url-pattern>/golfing/*</url-pattern>
</servlet-mapping>
</web-app>
有了以上的Servlet配置文件,你還需要在應(yīng)用中的/WEB-INF/
路徑下創(chuàng)建一個(gè)golfing-servlet.xml
文件,在該文件中定義所有Spring MVC相關(guān)的組件(比如bean等)。你可以通過(guò)servlet初始化參數(shù)為這個(gè)配置文件指定其他的路徑(更多細(xì)節(jié)請(qǐng)參考下文)。
當(dāng)你的應(yīng)用中只需要一個(gè)DispatcherServlet
時(shí),只配置一個(gè)根context對(duì)象也是可行的。
要配置一個(gè)唯一的根context對(duì)象,可以通過(guò)在servlet初始化參數(shù)中配置一個(gè)空的contextConfigLocation來(lái)做到,如下所示:
<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<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>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
WebApplicationContext
繼承自ApplicationContext
,它提供了一些web應(yīng)用經(jīng)常需要用到的特性。它與普通的ApplicationContext
不同的地方在于,它支持主題的解析(詳見(jiàn)Spring MVC提供的主題一小節(jié)),并且知道它關(guān)聯(lián)到的是哪個(gè)servlet(它持有一個(gè)該ServletContext
的引用)。WebApplicationContext
被綁定在ServletContext
中。如果需要獲取它,你可以通過(guò)RequestContextUtils
工具類(lèi)中的靜態(tài)方法來(lái)拿到這個(gè)web應(yīng)用的上下文WebApplicationContext
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: