SpringMVC中静态资源的处理
web项目中web.xml配置
在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern> <!--注意这里-->
</servlet-mapping>
这里的url-pattern有两种配置方式
- .扩展名,比如.do,古老的方式,不会导致静态资源文件被拦截的问题,但 是不支持RESTful编码风格
- /,支持RESTful风格,但是会导致静态资源文件被拦截
还有一种错误的配置方式
/*,错误的方式,可以请求到Controller方法,但是跳转到JSP时会被拦截,JSP不能正常显示 XX
一般来说,企业中更多的是采用第二种配置方式,但这导致了静态资源被拦截
静态资源为什么会被拦截??
我们知道,我们的web项目最终要部署到服务器上,以我们熟悉的Tomcat服务器为例进行说明。
当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:\work_folder\java_studying\java_tools\apache-tomcat-9.0.12\conf\web.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成 <url-pattern>/</url-pattern>
会覆盖掉全局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>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这就是默认的servlet,发现与我们配置的url-pattern一样了,导致静态资源也被我们自定义的dispatcherServlet所拦截,那这个类就会去找controller里面的映射了,比如我们访问http://localhost:8080/springmvc/img.png,显然是Controller里面是没有这个映射路径的。
如何处理静态资源被拦截
有三种方式:
- 方式一:手动排除法
在我们的web.xml添加如下配置
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
其他地方保持不变,这个粒度显然是比<url-pattern>/</url-pattern>更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。
当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用
- 方式二:在springmvc的配置文件中加入
<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
- 方式三:在springmvc配置文件中手动指定静态资源路径
<!-- 设置静态资源不过滤 -->
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/img/" mapping="/img/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/plugins/" mapping="/plugins/**" />
,这种方式更灵活,功能更丰富,也是可以的
注意 springmvc配置文件中这个配置<mvc:annotation-driven />推荐每次都加
以上就上springmvc中处理静态资源的三种方式
SpringMVC中静态资源的处理的更多相关文章
- 完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题
https://blog.csdn.net/kingmax54212008/article/details/79330308 今天遇到一个比较新奇的问题,但是也应该是使用spring MVC框架时由于 ...
- SpringMVC常用配置-添加静态资源处理器-针对SpringMVC中静态资源无法访问的问题
- SpringMVC访问静态资源
SpringMVC访问静态资源 在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被Dis ...
- 【SpringMVC】静态资源访问的问题
在项目中经常会用到一些静态的资源,而一般我们在配置SpringMVC时会让SpringMVC接管所有的请求(包括静态资源的访问), 那么我们怎样才能最简单的来配置静态资源的访问呢? 一,在web.xm ...
- SpringMVC拦截静态资源的处理办法
SpringMVC拦截静态资源导致 JS CSS 无法加载 可以在配置文件中加入以下代码 <mvc:resources location="/statices/" m ...
- IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404
IntelliJ IDEA+SpringBoot中静态资源访问路径陷阱:静态资源访问404 .embody{ padding:10px 10px 10px; margin:0 -20px; borde ...
- $ is not defined与SpringMVC访问静态资源
编写前台Jquery代码时,遇到谷歌浏览器报错:Uncaught ReferenceError: $ is not defined 意味着Jquery库并没有导入到页面.这是有几种情况需要考虑: 1. ...
- IDEA中静态资源无法找到的原因
IDEA中静态资源无法找到, 原因1:同名的文件但是在不同的包里. 原因2:IDEA重启,web清空缓存. 原因3:错误的文件及路径. 原因4:其他原因排除后,可使用绝招重启试试.
- springmvc之静态资源访问不到 -记一次惨痛的经历
springmvc之静态资源访问不到 -记一次惨痛的经历 问题描述:项目正常启动,可以访问页面,但是无法找到静态资源文件,如css,js等文件资源. 控制台: $ 未定义 页面: GET http:/ ...
随机推荐
- Haskell语言学习笔记(94)Enum Bounded
Enum class Enum a where succ, pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFr ...
- php+tcpdf生成pdf: 中文乱码
TCPDF是一个生成PDF的不错的库,可惜,官方对包括中文在内的东亚字体支持不怎么样的.场景:某项目需要根据数据库信息生成pdf格式的发票,考虑采用稳定的tcpdf,虽然还有许多其它选择,但是这个应该 ...
- Postgresql operator does not exist: numeric = character varying
)),series_name from svcm_t_series_res: 原来series_id是numeric型,现在转换为varchar(64):
- 2019.12.09 java for循环
for(初始化表达式; 循环条件; 操作表达式){ 执行语句 ……… } 先走初始化表达式,再走循环条件,如条件满足,走执行语句,然后走操作表达式,再走循环条件,如条件满足,走执行语句 ...
- JMX脚本在某些机器上报错,有的运行超时
运行超时的 是因为在server端运行命令执行脚本,是server给agent下达的指定,但是server端到agent的10050端口没开,所以或一致堵死在那,知道执行超时, 解决:开通server ...
- tensorflow手写数字识别(有注释)
import tensorflow as tf import numpy as np # const = tf.constant(2.0, name='const') # b = tf.placeho ...
- Postgresql 数据库迁移步骤
1.操作位置:迁移数据库源(旧数据库主机) 找到PostgreSql 的data目录 关闭数据库进程 打包 tar -zcvf pgdatabak.tar.gz data/ ----------- ...
- log4j 1.2 配置和使用简述
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/log4j_properties_simple_introduct ...
- 2019牛客国庆集训派对day1
C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...
- ICEM——对msh文件或者cas文件重新划分边界
原视频下载地址:https://pan.baidu.com/s/1jIoKSuy 密码: m3uv