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...