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>

上面的代码声明了一个名为springDispatcherServletDispatcherServlet。并且设置了优先级为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包括ControllersViewResolverHandlerMapping等等。

WebApplicationContext继承自ApplicationContext,它提供了一些web应用经常需要用到的特性。它与普通的ApplicationContext不同的地方在于,它支持主题的解析,并且知道它关联到的是哪个servlet(它持有一个该ServletContext的引用)。WebApplicationContext被绑定在ServletContext中。如果需要获取它,你可以通过RequestContextUtils工具类中的静态方法来拿到这个web应用的上下文WebApplicationContext

在web.xml中我们已经配置好了DispatcherServlet。此时DispatcherServlet会去/WEB-INF/路径下寻找名为[Servlet的名字]-servlet.xml的文件。springDispatcherServlet就是我们创建的DispatcherServlet的名字,所以寻找的配置文件名为springDispatcherServlet-servlet.xmlspringDispatcherServlet-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...