目录
SpringMVC中url-pattern的使用
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<url-pattern> </url-pattern> <!-- *号匹配后缀-->
</servlet-mapping>
1. 不要配置为 /*
;
url-pattern 不能写为/*
。因为此时 DispatchterServlet 会向动态页面的跳转发送请求,即向 JSP 页面的跳转请求也当作是一个普通的 Controller 请求,中央处理器会调用处理器映射器查找响应的处理器,当然是找不到相应处理器的;
即当写为/*
时,会拦截所有动态资源请求 (jsp) 交给 DispatchterServlet,当然是找不到相应处理器的,在这种情况下,所有的 JSP 页面跳转均会报 404 错误。
对于静态资源请求…
2. 最好不要配置为 /
;
url-pattern 最好不要写为/
。因为此时 DispatchterServlet 会向静态资源的获取发送请求,例如 .css、.js、.jpg、.png 等资源的获取请求,也当作是一个普通的 Controller 请求,中央处理器会调用处理器映射器查找响应的处理器,当然是找不到相应处理器的;
即当写为/
会时,会拦截下所有静态资源请求交给 DispatchterServlet,当然是找不到相应处理器的,在这种情况下,所有的静态资源获取请求均会报 404 错误。
对于动态资源请求…
PS:此时静态资源无法访问的解决方法:
方法一:使用 Tomcat 默认的 Servlet,配置 servlet-mapping
使用 Tomcat 默认的 Servlet,在电脑的 Tomcat 安装目录下,tomcat/conf/web.xml 的 web.xml 文件中,有默认配置如下:
<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>
然后在项目的 web.xml 文件中,配置 servlet-mapping,使用此默认 Servlet:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
然后就可以顺利加载 .html 后缀的静态资源了。其它如 .css、.js、.jpg 后缀的静态资源文件也可类似的设置。
方法二:使用 mvc:default-servlet-handler/
- 保证 springmvc.xml 中有 spring-mvc 的约束:
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
-
在 springmvc.xml 中添加
<mvc:default-servlet-handler/>
标签即可;然后便可以访问所有静态资源了。 -
执行原理分析:
mvc:default-servlet-handler 会将对静态资源的访问请求通过 HandlerMapping 映射到默认 Servlet 请求处理器 DefaultServletHttpRequestHandler 对象。而该处理器调用了 Tomcat 的 DefaultServlet 来处理静态资源的访问请求。(方法一)
方法三:使用 mvc:resources/
参考方法二;
然后将 <mvc:default-servlet-handler>
标签改为 <mvc:resources location="/resouces-directory-name/" mapping="/resouces-directory-name/**"/>
标签。其中 location 表示静态资源所在目录,mapping 表示对该资源的请求(注意后面有两个星号**)。
该配置会该配置会把对该静态资源的访问请求经 HandlerMapping 直接映射到静态资源处理器对象 ResourceHttpRequestHandler。
3. 建议使用*.do
的形式
注:
对/*
和/
的理解感觉仍存在问题。