SpringMVC的DispatcherServlet路径配置原由

642 阅读1分钟

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()方法来使请求继续。

有疑问的欢迎在评论区留言。