搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
IT小白
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
maya python api_从目标Maya Python API查找Blendshape
2
笔试ACM模式输入输出练习c++_acm模式练习
3
deconv 函数介绍_deconv函数
4
Openstack云平台脚本部署之Dashboard配置(十)_openstack dashboard 为什么要配置 webroot
5
个人简历样本范文(精选10篇)
6
学习Python必去的8个网站!_python学习网站
7
sql server安装及使用全流程_sqlserver数据库安装步骤
8
自动化测试进阶之Python推导式的使用
9
UDP网络程序
10
idea查看行提交记录_idea查看提交记录
当前位置:
article
> 正文
SpringMVC 静态资源处理 详解_war包的mvc静态资源
作者:IT小白 | 2024-04-13 00:13:39
赞
踩
war包的mvc静态资源
需要先调整 web.xml 中 DispatcherServlet 的配置,例如如下配置 :
<
servlet
>
<
servlet-name
>
springServlet
</
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
>
springServlet
</
servlet-name
>
<
url-pattern
>
/
</
url-pattern
>
</
servlet-mapping
>
方法一 : 采用<mvc:default-servlet-handler/>
在 spring-mvc.xml 中配置
<!-- 将无法mapping到Controller的path交给default servlet handler处理 -->
<
mvc
:default-servlet-handler
/>
这样会在 SpringMVC 上下文中定义一个 org.springframework.web.servlet.resource.DefaultServletHttpRquestHandler,其会对进入 DispatcherServlet 的URL 进行筛选,若发现是静态资源请求,则转由 Web 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
一般 Web 应用服务器 (包括 Tomcat、Jetty等) 默认Servlet名称都是 default,因此 DefaultServletHttpRquestHandler 可以找到。如果使用的 Web 应用服务器的默认 Servlet 名称不是 “default",则需要通过 default-servlet-name 属性显式指定 :
<
mvc
:default-servlet-handler
default-servlet-name
="yourServerDefaultServletName"
/>
方法二 : 采用<mvc:resources/>
<mvc:default-servlet-handler/> 将静态资源的处理经由 Spring MVC 框架交回 Web 应用服务器处理。而 <mvc:resources/> 更进一步,由 Spring MVC 框架自行处理静态资源,并添加一些附加功能
<mvc:resources/> 允许静态资源放在任何地方,如 WEB-INF 目录下、类路径,甚至 JAR 包中,可以使用诸如 "classpath:" 等的资源前缀指定资源位置。可以通过 cacheSeconds 属性指定静态资源在浏览器端的缓存时间,一般设置为一年。在输出静态资源时,会根据配置设置好响应报头的 Expires 和 Cache-Control 值
在接收静态资源的获取请求时,会检查请求头的 Last-Modified 值,如果静态资源没有发生变化,则直接返回 303 响应状态码,指示客户端使用浏览器缓存的数据,而非静态资源的内容输出到客户端,以节省带宽,提高性能
在 spring-mvc.xml 中的配置
<
mvc
:resources
mapping
=“/resource/**"
location
="/,classpath:/META-INF/publicResources/"
/>
该配置将 Web 根路径 “/“ 以及类路径 /META-INF/publicResources/ 映射为 /resource
Spring MVC在处理映射的静态资源时,会查看引用路径是否包含 WEB-INF 或 META-INF,如果存在则返回 null。可以通过将 /WEB-INF/ 设置在 location 属性中,此时可以通过访问到 web.xml :
<
mvc
:resources
mapping
="/
resources
/**"
location
="/WEB-INF/"
/>
在设置<mvc:resources/>时,注意不要将不期望的资源暴露出去
可通过 cache-period 设置客户端数据缓存时间,如下设置为一年
<
mvc
:resources
mapping
="/
resource
/**"
location
="
/,classpath:/META-INF/publicResources/
"
cache-period
="31536000"
/>
在实际开发中,发布新版本,即使服务端的 javascript、css等静态资源以发生变化,但由于客户端浏览器本身缓存管理机制问题,客户端并不会从服务端下载新的静态资源。一个好的解决方案是 : 网页中引用静态资源的路径添加应用的发布版本号,这样发布新的部署版本时,由于版本号的变更造成网页中竟资源台路径发生更改,从而是这些静态资源成为“新资源”,因此客户端会下载这个“新资源”,而不会使用缓存中的数据
创建 ServletContextAware 实现类
import
javax.servlet.ServletContext;
import
org.springframework.web.context.ServletContextAware;
public class
ResourcePathExposer
implements
ServletContextAware {
private
ServletContext
servletContext
;
private
String
resourceRoot
;
public void
init() {
String version =
"1.2.1"
;
// 实际应用中,可以在外部属性文件或数据库保存应用发布版本号,在此获取之。此处仅仅提供一个模拟值
resourceRoot
=
"/resources-"
+ version;
// 资源逻辑路径带上应用发布版本号
getServletContext().setAttribute(
"resourceRoot"
, getServletContext().getContextPath() +
resourceRoot
);
// 将资源逻辑路径暴露到ServletContext的属性列表中
}
public void
setServletContext(ServletContext servletContext) {
this
.
servletContext
= servletContext;
}
public
String getResourceRoot() {
return
resourceRoot
;
}
public
ServletContext getServletContext() {
return
servletContext
;
}
}
在 spring-mvc.xml 中
<
bean
id
="rpe"
class
="com.chenshun.web.ResourcePathExposer"
init-method
="init"
/>
<
mvc
:resources
mapping
="#{rpe.resourceRoot}/**"
location
="/"
cache-period
="31536000"
/>
在 jsp 页面中,通过 EL 引用 resourceRoot 属性值
<%@
page
language
="
java
"
contentType
="
text/html; charset=UTF-8
"
pageEncoding
="
UTF-8
"%>
<%@
taglib
prefix
="
c
"
uri
="
http://java.sun.com/jsp/jstl/core
" %>
<
html
>
<
head
>
<
title
>
静态资源测试
</
title
>
<
script
src=
"
${
resourceRoot
}
/js/test.js"
type=
"text/javascript"
>
</
script
>
</
head
>
<
body
>
hello!!
<
script
>
test
();
</
script
>
</
body
>
</
html
>
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/IT小白/article/detail/413354
推荐阅读
article
基于
java
web的
个人相册
系统
(
idea
+
spring
+
spring
mvc+
mybatis
+js...
基于
java
web的
个人相册
系统
(
idea
+
spring
+
spring
mc+
mybatis
+jsp),采用
idea
开发...
赞
踩
article
基于
java
web+
mysql
的图片相册
管理系统
(
java
+
Springboot
+
SpringMVC
...
一、项目运行环境配置:Jdk1.8 + Tomcat8.5 +
mysql
+ Eclispe(IntelliJ IDE...
赞
踩
article
毕设项目:
图片
分类
管理
系统
(JSP+
java
+springmvc+
mysql
+
MyBatis
)_照片...
随着互联网的普及和社交媒体的发展,人们每天都会接触到大量的
图片
。此外,通过对大量
图片
进行分类和
管理
,还可以为其他应用提供...
赞
踩
article
毕设项目:
茶叶
销售
系统(JSP+
java
+springmvc+
mysql
+MyBatis)_
茶叶
销售
...
因此,开发一款高效、便捷、实用的
茶叶
销售
系统成为了
茶叶
企业和商家们迫切需要解决的问题。系统可以实现
茶叶
信息的录入、查询、...
赞
踩
article
Java项目:基于jsp+
mysql
+Spring+SpringMVC+
mybatis
的校园超市
系统
...
本网站主要是针对高校学生以超市购物为重点开发的网站。
系统
从用户上分为三种:卖家、买家和游客。
系统
从模块分为买家模块和卖家...
赞
踩
article
基于jsp+
mysql
+
Spring
+
Spring
MVC+mybatis的ssm生鲜
超市
进销存管理系...
目前
超市
越来越多,越来越普及,如何高效的管理经营
超市
才是成功的关键,其中对于中小型
超市
来说,在降低成本的前提下使用最有效...
赞
踩
article
毕设项目:
超市
管理系统
的
设计
与实现(JSP+
java
+springmvc+
mysql
+MyBatis...
因此,开发一款高效、便捷、实用的
超市
管理系统
成为了现代
超市
迫切需要解决的问题。系统可以实现商品信息的录入、查询、修改和删...
赞
踩
相关标签
java
mysql
tomcat
intellij-idea
mybatis
maven
spring boot
课程设计
spring
计算机毕业设计