SpringMVC 静态资源访问加载配置

本文介绍了在SpringMVC项目中如何正确配置静态资源的两种方法。一种是通过<mvc:default-servlet-handler/>配合web.xml来实现,另一种是在spring-servlet.xml中使用<mvc:resources>元素进行配置。

当你使用SpringMVC来做web开发时,经常会遇到如何配置静态资源加载的问题。

问题产生的根源,看如下web.xml中的配置:

<servlet>
		<servlet-name>springServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/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>

 上面的Servlet配置会拦截你所有的请求,包括静态的资源*.css, *.html, *.htm, *.jpg, *.js, *.png ... 等等。

其实这些静态资源被拦截是没有意义的,那么如何避免这些不希望被拦截的资源被拦截呢?

主要有两种方式:

1、如果你的静态资源打包之后再项目的根目录下---注意这里一定是根目录,在WEB-INF目录下是不行的,即在你的项目的Webapp 目录下,那么可以采用配置:

<mvc:default-servlet-handler/>

 的方式到你的 spring-servlet.xml 中。

然后在你的web.xml 加入如下配置:

<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>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.ico</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.gif</url-pattern>
	</servlet-mapping>
	<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>*.bmp</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.jpeg</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.swf</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.flv</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.xml</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.txt</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>default</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>

 然后当你在访问静态资源是就不会被spring Servlet拦截了。

2. 采用 配置 如下代码到你的spring-servlet.xml 文件中的方式:

<mvc:resources mapping="/html/**" location="/WEB-INF/views/mqcloud/monitor/"/>

 注意,这种方式可以指定你的静态资源在你项目中的任何位置,包括在jar 里面,因为 配置中的 location 可以配置成 classpath:/com/ctx/....  的形式。

并且该方式不会像 第一中方式那样 要求静态资源文件放置到应用的根目录下面的。

 

注意:当两种方式在你的项目里面都配置了,那么会出现访问静态资源失败的问题,因此最好不要在项目里面同时配置这两种方式。

### SpringMVC配置静态资源的最佳实践 在Spring MVC应用程序中,处理静态资源(如CSS文件、JavaScript文件、图片等)是一个常见的需求。为了优化这些资源的加载性能并简化其管理方式,在`WebConfig`类中通过重写`addResourceHandlers`方法来定义静态资源路径是一种推荐的做法[^1]。 下面展示了一个具体的例子: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 将 /resources/** 的请求映射到classpath:/static/目录下查找对应资源 registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/static/"); // 可以为不同类型的资源设置不同的缓存时间 registry.addResourceHandler("/images/**") .addResourceLocations("file:upload-dir/") .setCachePeriod(31556926); // 设置一年的缓存期 // 支持多个位置和模式匹配 registry.addResourceHandler("/js/**", "/css/**") .addResourceLocations("classpath:/META-INF/resources/webjars/", "classpath:/static/"); } } ``` 除了上述方法外,还可以利用默认Servlet处理器来提供对未被其他任何处理器映射所捕获的URL访问的支持。这可以通过实现`configureDefaultServletHandling`方法,并调用参数`configurer`的`enable()`方法完成[^2]。 #### 默认Servlet处理器启用示例 ```java import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class DefaultServletHandlerConfig implements WebMvcConfigurer { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } ``` 这种做法可以确保即使当没有找到特定于框架内部路由规则相匹配的情况下,默认情况下仍然能够正确返回位于webapp根目录下的HTML页面或其他静态内容给客户端浏览器。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值