1、静态资源访问问题
我们平时在开发Web项目时,不可避免的需要使用到静态资源,例如要用到项目中的图片文件、HTML文件、CSS文件、JavaScript文件等等凡是浏览器直接可以使用且不需要Tomcat解析的资源都是静态资源。但是我们在配置SpringMVC核心控制器dispatcherServlet时,配置的<url-pattern>/</url-pattern>表示拦截除jsp以外的所有请求,对于前台页面来说想要使用静态资源比如图片、引入js、css等,就必须向服务器发送请求才能获取,而此时我们是将dispatcherServlet设置为拦截了除jsp以外所有请求,所以对于这些静态资源就会获取不到,导致页面出现404错误!
下面就是对静态资源访问的一些解决方案。
补充:<url-pattern>/</url-pattern>表示拦截除jsp以外的所有请求。JSP为什么不拦截呢?因为tomcat容器定义了一个名称为Jsp的Servlet,在这里并没有重写
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
2、解决方法一
方法一:使用<mvc:default-servlet-handler/>
只需在springmvc的xml配置文件中配置这个标签即可:
<!-- 开启默认的servlet -->
<mvc:default-servlet-handler/>
<!-- 配置MVC注解驱动 -->
<mvc:annotation-driven/>
<mvc:default-servlet-handler /> 表示开启默认的servlet,在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它暂时会取代DispatcherServlet处理请求的功能,所以这个时候会出现一个新的问题,就是后台Handler方法中映射的请求会失效,所以还必须配合<mvc:annotation-driven />使用,设置<mvc:annotation-driven />是将默认servlet无法处理的请求交给dispatcherServlet处理。
这样配合使用之后,当浏览器输入请求时,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。
一般Web应用服务器默认的Servlet名称是”default”,因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是”default” 或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则需要通过default-servlet-name属性显示指定:
<mvc:default-servlet-handler default-servlet-name="xxx" />
3、解决方法二
方法二:使用<mvc:resources />
<!-- 配置静态资源的路径和映射 -->
<mvc:resources mapping="/static/**" location="/static/"/>
<!-- 配置MVC注解驱动 -->
<mvc:annotation-driven/>
location:表示静态资源的位置,就是指定不要拦截的目录,这里指在根目录static文件下的所有文件。注意:这些文件必须是在webapp根目录下的路径
mapping:表示静态资源的映射请求路径,/**表示匹配任意深度的路径。上面表示以resources开头的请求路径,例如:/resources/a,/resources/a/b
在映射路径的定义中,最后是两个 *,这是一种 Ant 风格的路径匹配符号,一共有三个通配符:
通配符 |
含义 |
---|---|
** | 匹配多层路径 |
* | 匹配一层路径 |
? | 匹配任意单个字符 |
注意:本地资源路径,必须是webapp根目录下的路径
4、解决方法三
方法三:在web.xml中配置defaultServlet的mapping
配置要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.png</url-pattern>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.gif</url-pattern>
<url-pattern>*.ico</url-pattern>
</servlet-mapping>