spring mvc对静态资源的访问
如果我们的项目使用的是springmvc,在web.xml中会有一段这的配置。
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:ApplicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
其中的DispatcherServlet会拦截一切(<url-pattern>/</url-pattern>)请求,当然也包含静态请求(html,js,css,img等),注意jsp文件不是静态资源。其本质还是一个servlet。我们知道DispatcherServlet拦截完请求以后会交给对应的controllers的requestmapping来处理。那么如果是静态资源该如何处理呢?
举个例子:假设我再webapp根目录下新建了一个index.html文件,而我在某个controllers类下也有一个逻辑名称为index.html的方法。如下所示。

@RequestMapping("index.html")
public ModelAndView index() {
ModelAndView mv = new ModelAndView("back/main/Login");
return mv;
}
运行项目,在浏览器地址栏输入localhost:8080/warrior/index.html。则会去执行public ModelAndView index()的代码。
假如我把这个方法注释掉呢?继续运行localhost:8080/warrior/index.html。则会报404错误。
这是因为spring mvc还是把这个请求地址当成一个逻辑视图地址,而去controllers类中寻找关联这个地址的方法,但是找不到,所以报404了。
我们怎样能让spring mvc识别静态文件以规避这个错误呢?有两种方法。
1.使用<mvc:default-servlet-handler/>
在mvc的配置文件中,加入以下两句代码。
<mvc:annotation-driven/>
<!-- 静态资源访问方式一,推荐使用 -->
<mvc:default-servlet-handler/>
在web.xml中的DispatcherServlet配置前面加上如下代码:
<!-- 对静态资源的配置 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.ico</url-pattern>
<url-pattern>/img/*</url-pattern>
<url-pattern>/static/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
<url-pattern>/font/*</url-pattern>
</servlet-mapping>
这样配置了以后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。
需要注意的是,这两句必须一同出现,如果没有<mvc:annotation-driven/>这句,会访问不到controllers中的方法。
2.使用 mvc:resources来区分静态资源
为了将静态资源与动态资源进行区分,spring mvc使用<mvc:resources mapping="/**" location="/,/admin/" />这样的配置来标明静态资源所在的路径。
以上述那条语句为例:当我们访问localhost:8080/warrior/index.html的时候,spring mvc先去寻找逻辑名为“index.html”的action,找不到的话,再去location为/,也就是根目录下的index.html,如果还是找不到的话,再去寻找admin/目录下的index.html。而不会报错。
我的理解是,mvc:resources为静态资源定义了一个逻辑名称,或者说映射(mapping),当我们需要访问静态资源的时候,就无需再使用物理地址了,直接使用映射地址就好了。
使用mvc:resources的好处除了创建一个别名以外,是不用再创建一个servlet,不像方法一,而且他可以随意指定静态资源的位置,甚至可以放在web-inf下面。另外,还可以对静态资源做一些配置,好充分利用缓存。
看几个mvc:resources的例子:
<mvc:resources mapping="/**" location="/,/admin/" /><!-- 当访问warrior/demo/index.html时候,先到根目录下去寻找demo/index.html,再到admin目录下去寻找demo/index.html -->
<mvc:resources mapping="/admin/**" location="/,/admin/" /><!-- 当访问warrior/static/index.html时候,先到根目录下寻找index.html,再到static下寻找index.html -->
PS:当上述两种配置同时出现在spring mvc的配置文件中,顺序是,先去controllers中寻找,找不到再使用<mvc:default-servlet-handler/>去寻找静态资源,找不到就会报404,不会再使用mvc:resources去寻找了。
spring mvc对静态资源的访问的更多相关文章
- 【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问
作者:ssslinppp 参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html http://www.cnb ...
- Spring MVC 处理静态资源不能访问问题
在web.xml文件中加入如下代码: <servlet-mapping> <servlet-name>default</servlet-name> <url- ...
- Spring MVC 处理静态资源文件
摘要: 三个方案: 1.方案一:激活Tomcat的defaultServlet来处理静态文件 2.方案二: 在spring3.0.4以后版本提供了mvc:resources (需要配置annotati ...
- Spring MVC配置静态资源和资源包
Spring MVC配置静态资源和资源包 本例映射:css目录: pom.xml <properties> <spring.version>4.3.5.RELEASE</ ...
- Spring mvc 增加静态资源配置后访问不了注解配置的controller
spring mvc 增加静态资源访问配置. 例如: <!-- 静态资源映射 --> <mvc:resources location="/static/" map ...
- spring mvc添加静态资源访问时@Controller无效的解决
web.xml中的url-pattern设置为/,添加mvc:resources访问静态资源时,@Controller无效的问题 web.xml: <servlet> <servle ...
- spring mvc处理静态资源
servlet的url映射定义为'/'表示映射全部路径 struts的过滤器是*.action,在spring mvc中设置成*.action或者*.do......也是可以的,但是spring mv ...
- Spring MVC配置静态资源的正常访问
SpringMVC如果过滤器过滤范围配置了/或者/*,那么框架会过滤所有请求,包括自己写的请求和静态资源请求,这样静态资源就不能正常加载,包括js文件.css文件.图片资源访问的时候都会出现404页面 ...
- Spring MVC 过滤静态资源访问
过滤的必要性 一般来说,HTTP 请求都会被映射到 DispatcherServlet,进而由具体的类来承接处理,但对于类似 js 或者 css 这样的静态资源则没必要这样,因为对资源的获取只需返回资 ...
随机推荐
- 40个Java多线程问题
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然 ...
- 直接调用VS.net2005中的配置界面
以前做Winform程序,居然专门做一个界面来配置连接字符串.今天无意中发现:竟然可以直接调用VS.net2005中的配置界面来处理. 使用方法也非常简单: 引用C:\Program Files\Mi ...
- 一款基于vue2.0的分页组件---写在页面内
通过 Vue2.0 实现的分页 可自由设置分页显示的多少.上一页.下一页.省略号等,也可直接输入跳转到的页码进行跳转,分页的样式可自由调整 // 1.页面的 head 部分,需要设计好页面的样式 .p ...
- 程序、计算机程序、java初论
一.程序? 程序一词来自生活,通常指完成某些事情的一种既定方式和过程,可以将程序看成对一系列动作的执行过程的描述. 例如:个人去银行取钱 1.带上存折/银行卡去银行 2.取号排队 3.将存折或储蓄卡递 ...
- mysql数据库常用命令笔记
连接数据库:mysql -h localhost -u root -p 000000 退出:exit; \q; quit; SET foreign_key_checks = 0; 禁用外键 ...
- webpack 3.X学习之初始构建
webpack是什么 webpack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Sass,TypeScript等),并 ...
- 《java.util.concurrent 包源码阅读》28 Phaser 第二部分
这一部分来分析Phaser关于线程等待的实现.所谓线程等待Phaser的当前phase结束并转到下一个phase的过程.Phaser提供了三个方法: // 不可中断,没有超时的版本 public in ...
- Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)
前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程. 以源码中dubbo-demo模块作为切入口一步步走进Dubbo源码. ...
- java并发包下的并发工具类
1.Exchanger 功能:用于线程间数据的交换 应用场景:1)遗传算法,目前还不是特别理解 2)校对工作,假设A,B线程做同一件任务,可以通过数据校验判断两线程是否正确的工作 例子:是一个简单的 ...
- Mybatis(三)返回值
Mybatis返回值 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则 ...