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 这样的静态资源则没必要这样,因为对资源的获取只需返回资 ...
随机推荐
- 对于Mongodb数据库的学习
数据库主要分为两种 1.关系型数据库(RDBS) 2.非关系性数据库(NoSQL) 而MongoDB就是非关系型数据库里的一种 文档型数据库(BSON) 文档型数据库(BSON)顾名思义就是以文档的形 ...
- python定时利用QQ邮件发送天气预报
大致介绍 好久没有写博客了,正好今天有时间把前几天写的利用python定时发送QQ邮件记录一下 1.首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.c ...
- 利用Pycharm本地调试spark-streaming(包含kafka和zookeeper等操作)
环境准备就不说了! 第一步:打开Pycharm,在File->Setting->Project Structure中点击Add Content Root 添加本地python调用java和 ...
- 原生js绑定和解绑事件,兼容IE,FF,chrome
主要是最近项目中用到了原生的js 解绑和绑定 事件 然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解 ...
- Hive 学习笔记(启动方式,内置服务)
一.Hive介绍 Hive是基于Hadoop的一个数据仓库,Hive能够将SQL语句转化为MapReduce任务进行运行. Hive架构图分为以下四部分. 1.用户接口 Hive有三个用户接口: 命令 ...
- C语言实现快速排序法(分治法)
title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思 ...
- CLR设计类型之接口
写在前面的话: 写到这一节的时候,CLR设计类型就已经结束了,因为CLR要求的是有一定基础的人看的,所以我们不是从基础类型以及运算符开始的,文章从一开始就讲的是深入面向对象编程 ...
- JMS学习之路(一):整合activeMQ到SpringMVC 转载:http://www.cnblogs.com/xiaochangwei/p/5426639.html
JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...
- vscode调试html页面,及配置说明
一.效果目的 1.在VSCode里,直接F5打开html页面,并且可以在编辑器里,进行断点调试js代码: 二.工具准备 1.VSCode 软件 2.一个js项目 3.VSCode 上装一个插件:Deb ...
- hibernate第二天
hibernate的核心思想就是将之前对单个字段的操作变为操作一个对象,使用了ORM(Object relation mapping)对象关系映射的思想 · 在hibernate中对数据库特殊字段的有 ...