如果我们的项目使用的是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对静态资源的访问的更多相关文章

  1. 【Spring学习笔记-MVC-14】Spring MVC对静态资源的访问

    作者:ssslinppp       参考链接: http://www.cnblogs.com/luxh/archive/2013/03/14/2959207.html  http://www.cnb ...

  2. Spring MVC 处理静态资源不能访问问题

    在web.xml文件中加入如下代码: <servlet-mapping> <servlet-name>default</servlet-name> <url- ...

  3. Spring MVC 处理静态资源文件

    摘要: 三个方案: 1.方案一:激活Tomcat的defaultServlet来处理静态文件 2.方案二: 在spring3.0.4以后版本提供了mvc:resources (需要配置annotati ...

  4. Spring MVC配置静态资源和资源包

    Spring MVC配置静态资源和资源包 本例映射:css目录: pom.xml <properties> <spring.version>4.3.5.RELEASE</ ...

  5. Spring mvc 增加静态资源配置后访问不了注解配置的controller

    spring mvc 增加静态资源访问配置. 例如: <!-- 静态资源映射 --> <mvc:resources location="/static/" map ...

  6. spring mvc添加静态资源访问时@Controller无效的解决

    web.xml中的url-pattern设置为/,添加mvc:resources访问静态资源时,@Controller无效的问题 web.xml: <servlet> <servle ...

  7. spring mvc处理静态资源

    servlet的url映射定义为'/'表示映射全部路径 struts的过滤器是*.action,在spring mvc中设置成*.action或者*.do......也是可以的,但是spring mv ...

  8. Spring MVC配置静态资源的正常访问

    SpringMVC如果过滤器过滤范围配置了/或者/*,那么框架会过滤所有请求,包括自己写的请求和静态资源请求,这样静态资源就不能正常加载,包括js文件.css文件.图片资源访问的时候都会出现404页面 ...

  9. Spring MVC 过滤静态资源访问

    过滤的必要性 一般来说,HTTP 请求都会被映射到 DispatcherServlet,进而由具体的类来承接处理,但对于类似 js 或者 css 这样的静态资源则没必要这样,因为对资源的获取只需返回资 ...

随机推荐

  1. Kotlin实现LeetCode算法题之Median of Two Sorted Arrays

    题目Median of Two Sorted Arrays(难度Hard) 方案1,数组合并&排序调用Java方法 import java.util.* class Solution { fu ...

  2. get和post与服务端的交互方式

    在网上看了不少关于get和post的文章,看到博主这个,现在手录下来. 原博客地址:http://www.cnblogs.com/warrior4236/p/5675756.html 一:B/S结构, ...

  3. Builder模式的思考(Effective Java)

    <Effective Java>(第2版)中第二条中提到:遇到多个构造器参数时要考虑用构建器.在复习static关键字和内部类时回头看了一下,这才明白了为什么要用静态内部类来做处理,这里记 ...

  4. Python 爬虫练习(二)爬取补天公益SRC厂商域名URL (2017年11月22日)

    介绍下: 补天是国内知名的漏洞响应平台,旨在企业和白帽子共赢. 白帽子在这里提交厂商漏洞,获得库币和荣誉,厂商从这里发布众测.获取漏洞报告和修复建议. 在2017年3月份之前,补天的厂商域名URL是非 ...

  5. Java学习笔记17---方法的重载与重写

    重载是指,一个类中定义了一个成员方法后,通过修改参数个数.参数类型或参数顺序,重新实现该方法,则这两个方法互为对方的重载方法. 重写是指,子类重新实现父类的成员方法. 重载后的方法,与原方法相比: ( ...

  6. android 开源收藏

    第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...

  7. Mybatis(三)返回值

    Mybatis返回值 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则 ...

  8. ##7.Dashboard web管理界面-- openstack pike

    ##7.Dashboard web管理界面 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard ...

  9. springboot集成swagger

    对于搬砖的同学来说,写接口容易,写接口文档很烦,接口变动,维护接口文档就更更更烦,所以经常能发现文档与程序不匹配. 等过一段时间就连开发者也蒙圈了 Swagger2快速方便的解决了以上问题.一个能与S ...

  10. CSS架构的优选和解决方案

    背景 上周我厂前端小伙伴们开了一个技术交流会,关于如何优选CSS架构.解决掉平时写CSS时频繁出现的各种问题,这是前端人员老生常谈的问题,但却很少搬上台面,铺开正式地开交流会.这次会议,便是围绕CSS ...