DispatcherServlet配置
先来直接看DispatcherServlet在SpringMVC的web容器中的xml配置
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring_mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里有很多人会疑问<url-pattern>
为何设置为/
,而不是/*
,从这两个路径设置,来分别看下对请求路径的影响。
为什么要配置为/
查看一下tomcat的web.xml对DefaultServlet的配置如下:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
当DispatcherServlet的路径配置为/
时,将会覆盖web容器的DefaultServlet,凡是在web.xml文件中找不到匹配的URL,它们的访问请求都将交给DispatcherServlet处理(静态资源也将会拦截,所以需要在SpringMVC的核心配置文件中开启<mvc:default-servlet-handler/>
)。这也是SpringMVC的web.xml没有再配置其他特殊路径Servlet的原因,即将所有的请求都交由DispatcherServlet处理。
为什么不能配置为/*
查看一下tomcat的web.xml对JspServlet的配置如下:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
如果将DispatcherServlet的路径配置为/*
,将会覆盖JspServlet,会拦截*.jsp和*.jspx的请求,如果使用这种配置去转发到一个JSP页面,仍然会被DispatcherServlet拦截,形成死循环,因此不可配置为/*
。一般这种配置用在Filter中,因为它可以通过调用doFilter()方法来使请求继续。
有疑问的欢迎在评论区留言。