要想使用SpringMVC,必须得了解DispatcherServlet,配置DispatcherServlet是使用SpringMVC的第一步。
DispatcherServlet类位于spring的spring-webmvc-3.2.0.RC1.jar包中,完整的类路径为org.springframework.web.servlet.DispatcherServlet
DispatcherServlet是一个servlet,作为一个前端控制器,负责接收请求,并且根据规则分发请求到后端的controller。因为它是一个servlet,所以我们在web.xml中可以作如下配置:
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>classpath*:/springMVC.xml</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
一个应用中可以有多个DispathcherServlet,不同的DispathcherServlet之间通过各自的servlet名称来区分,每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中。
<init-param>配置项中指定配置文件的位置和名称,如果此处没有配置,则在DispatcherServlet的初始化过程中,框架会在web应用的 WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml 的配置文件,生成文件中定义的bean。同时此处还有多种其他配置方式:
(1)<param-value>classpath*:springMVC-mvc.xml</param-value>
(2)<param-value>/WEB-INF/classes/springMVC.xml</param-value>
(3)多个配置文件可以用逗号隔开
关于该配置文件的内容在以后的文章中会给出展开的详细说明,此处不再进一步分析。
<load-on-startup>是启动时间,此处配置的1指的是让该servlet随着容器的启动而启动。
<url-pattern>是定义拦截的匹配规则,注意此处不能是/*。为了实现REST风格,此处使用了/,一旦使用/,就会拦截了包括静态文件(*.js,*.png)在内的所有请求,这显然是不行的,现有以下方式来处理该问题:
(1)使用<mvc:default-servlet-handler/>来解决该问题。即在springMVC配置文件中加上这句话就ok了。该句话会把”/**” url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回。
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet。
(2)使用各个容器自己默认的Servlet容器来解决该问题。Tomcat, Jetty, JBoss, GlassFish 自带的默认Servlet的名字 — “default”,我们在DispatcherServlet之前添加以下配置,让默认的容器先拦截请求,这样静态文件就不被进入DispatcherServlet中。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
至此DispatcherServlet配置及分析完成。