DispatcherServlet 與 WebApplicationContext ...
DispatcherServlet
DispatcherServlet是整個SpringMVC框架的核心。它負責把所有的請求分發到控制器中。同時提供其他web應用開發所需要的功能。它與Spring IoC容器做到了無縫集成,這意味著,Spring提供的任何特性,在Spring MVC中你都可以使用。
DispatcherServlet顧名思義它就是一個Servlet。所以跟Servlet一樣,需要在web.xml文件中進行配置。下麵的代碼展示了DispatcherServlet的配置與路徑映射的聲明:
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
上面的代碼聲明瞭一個名為springDispatcherServlet的DispatcherServlet。並且設置了優先順序為1的啟動載入(數字越小優先順序越高)。工程下的所有路徑的請求都會被名字為springDispatcherServlet的DispatcherServlet處理
-
springDispatcherServlet :配置Servlet的名稱。 -
org.springframework.web.servlet.DispatcherServlet :這個Servlet使用的類。 -
1 :啟動載入,優先順序為1,優先順序數字越小優先順序越高。 -
/ :映射的路徑。這裡使用/
會攔截除了.jsp
以外的所有請求(包括.html)。如果使用/*
的話會攔截包括.jsp
的所有請求。因為我們在/WEB-INF/
下編寫的web.xml
會繼承自Tomcat
本身的web.xml
。在Tomcat
中處理靜態文件的Servlet是DefaultServlet
,他的url-partten
就是/
。因為我們配置DispatcherServlet
的時候設置的url-partten
也是/
,所以現在靜態資源的訪問也會被我們配置的DispatcherServlet
攔截。而為什麼jsp文件卻可以正常訪問呢?因為在Tomcat中有專門用來處理.jsp請求的Servlet:JspServlet
。所以說,所有的.jsp請求並不會被DispatcherServlet攔截,而是會被JspServlet攔截再處理。這樣.jsp的請求就可以正常的被處理。
以下是web.xml文件的所有代碼:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>SpringMVC</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- The front controller of this Spring Web application, responsible for
handling all application requests -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
註意:除了像上面使用web.xml配置DispatcherServlet以外,我們還可以是用java編程的方式來配置DispatcherServlet(Servlet3.0以上版本),但是初學者還是使用web.xml來配置吧。因為簡單明瞭!
WebApplicationContext
至此,一個DispatcherServlet就配置完了。但是只配置DispatcherServlet是遠遠不夠的,還需要配置其他組件(WebApplicationContext)。Web應用上下文(WebApplicationContext)內部定義了項目所需要用到的bean,併在容器啟動的時候生成bean。這些bean包括Controllers、ViewResolver、HandlerMapping等等。
WebApplicationContext
繼承自ApplicationContext
,它提供了一些web應用經常需要用到的特性。它與普通的ApplicationContext
不同的地方在於,它支持主題的解析,並且知道它關聯到的是哪個servlet(它持有一個該ServletContext
的引用)。WebApplicationContext
被綁定在ServletContext
中。如果需要獲取它,你可以通過RequestContextUtils
工具類中的靜態方法來拿到這個web應用的上下文WebApplicationContext
。
在web.xml中我們已經配置好了DispatcherServlet。此時DispatcherServlet會去/WEB-INF/路徑下尋找名為[Servlet的名字]-servlet.xml
的文件。springDispatcherServlet就是我們創建的DispatcherServlet的名字,所以尋找的配置文件名為springDispatcherServlet-servlet.xml
。springDispatcherServlet-servlet.xml
就是我們上面所說的WebApplicationContext。在它內部會定義項目需要的bean。
/WEB-INF/springDispatcherServlet-servlet.xml
是我們配置的DispatcherServlet預設尋找配置文件的路徑。我們也可以修改web.xml來修改尋找配置文件的路徑。
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 修改配置文件的預設路徑 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
這裡我們使用了一個contextConfigLocation初始化參數來指定配置文件的路徑。並且把它配置在了classpath路徑下的springmvc.xml。接下來讓我們來創建springmvc.xml。
右擊src ---> New ---> Spring Bean Configuration File(如果你沒有這個選項的話,那麼你的Eclipse沒有包含Spring的插件,此時你可以去Spirng官網下載 Spring Tools,或者給你的Eclipse安裝Spring插件。直接創建普通的xml文件應該也可以,不過我沒有試過...)
設置File name為springmvc.xml並點擊Finish。
創建完成之後的目錄結構如下:
打開springmvc.xml並點擊編輯區下方的Namespaces:
選上context:
並輸入以下代碼:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 掃描註解 -->
<context:component-scan base-package="com.pudding" />
</beans>
加上component-scan
之後會掃描工程下的註解,如果不加的話@Controller、@Service等標簽就失效了。base-package
表示掃描哪個包下的註解。
至此,我們創建了DispatcherServlet並且編寫了WebApplicationContext。SpringMVC的第一步已經完成了,我們可以編寫我們的第一個SpringMVC項目了!它沒有理由不叫HelloWorld...