潘景

SpringMVC之再解url-pattern
配置详解关于SpringMVC的配置文件web.xml中<url -pattern></url&...
扫描右侧二维码阅读全文
02
2019/01

SpringMVC之再解url-pattern

配置详解

关于SpringMVC的配置文件web.xml中<url -pattern></url>应该怎么写的问题,相信许多初学的小伙伴会有疑惑,特此总结一下。

<!-- 注册中央调度器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定springmvc配置文件的位置及文件名 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 在Tomcat启动时直接创建当前servlet,此处值越小,优先级越高(大于0的整数) -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

(1)建议写为*.do形式

在没有特殊要求的情况下,SpringMVC的中央调度器DispatcherServlet的<url -pattern></url>常使用后缀匹配方式,如写成*.do。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

(2)不能写为/*

这里的url-pattern不能写成/*,因为DispatcherServlet会将向动态页面的跳转请求,即向JSP页面的跳转请求也当做是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然是找不到的,所以在这种情况下,所有的JSP页面跳转均会报404错误。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

如此时访问index.jsp,将会出现以下页面:
enter image description here

(3)最好也不要写成/

最好也不要写成/,因为DispatcherServlet会将静态资源的获取请求,例如.css,.js,.jpg,.png等资源的获取请求,当做是一个普通的Controller请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源请求也均会报404错误。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

如在index.jsp中添加如下代码:

<img alt="pics" src="images/1.jpg">

也将会出现404页面:
enter image description here

(4)总结

.do大法好,建议都写成.do的形式

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 此处绝对不能写成/*,因为/*会拦截动态资源获取请求 -->
    <!-- <url-pattern>/*</url-pattern> -->
    <!-- 此处最好不要写成/,因为/会拦截静态资源获取请求 -->
    <!-- <url-pattern>/</url-pattern> -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

静态资源访问

<url -pattern></url>的值并不是说写成/后,静态资源就无法访问了。经过一些配置后,该问题也是可以解决的。

(1)使用Tomcat中名为default的Servlet

在Tomcat中,有一个专门用于处理静态资源访问的Servlet-DefaultServlet。其<servlet -name></servlet>为default。可以处理各种静态资源访问请求。该Servlet注册在Tomcat服务器的web.xml中。在Tomcat安装目录/conf/web.xml。
enter image description here
我们要做的就是直接使用它即可,即直接在web.xml中注册<servlet -mapping></servlet>即可。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

此时如果再访问

<img alt="pics" src="images/1.jpg">

将会正常显示图片

(2)使用<mvc:default-servlet-handler/>

只需在springmvc.xml中添加<mvc:default -servlet-handler></mvc:default>标签即可。

<mvc:default-servlet-handler/>

<mvc:default -servlet-handler></mvc:default>会将对静态资源的访问请求添加到SimpleUrlHandlerMapping的urlMap中,key就是请求的URI,而value则为默认servlet请求处理器DefaultServletHttpRequestHandler对象。而该处理器调用了Tomcat的DefaultServlet来处理静态资源的访问请求 当然了,要想使用<mvc:.../>标签,需要引入mvc约束。
enter image description here

(3)使用<mvc:resources/>

在Spring3.04版本后,Spring中专门定义了用于处理静态资源访问请求的处理器ResourceHttpRequestHandler。并且添加了<mvc:resources></mvc:resources>标签,专门用于解决静态资源无法访问问题。需要在springmvc中添加如下形式的配置:

<mvc:resources location="/images/" mapping="/images/**"/>

location表示静态资源所在目录。当然,这里的目录包含/WEB-INF/目录及其子目录。 mapping表示对该静态资源的请求。注意,后面的两个**。 该配置会把对该静态资源的访问请求添加到SimpleUrlHandlerMapping的urlMap中,key就是真正与mapping的URI匹配的URI,而value则为静态资源处理器对象ResourceHttpRequestHandler。

Last modification:March 8th, 2019 at 03:55 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment