【转】SpringMVC访问静态资源的三种方式

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。

目的:可以正常访问静态文件,不要找不到静态文件报404。

方案一:激活Tomcat的defaultServlet来处理静态文件

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</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>*.css</url-pattern>
</servlet-mapping>  

要配置多个,每种文件配置一个

要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。

Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet"

方案二: 在spring3.0.4以后版本提供了mvc:resources 

(项目中使用了:

      String fileName = upload.getOriginalFilename();

      System.out.println("图片名:"+fileName);
      fileName = UUID.randomUUID().toString()+ fileName.substring(fileName.lastIndexOf("."));
      //String path = request.getSession().getServletContext().getRealPath("upload/draft");
      String path="upload/draft/image/";
      String realPath = request.getSession().getServletContext().getRealPath(path);

      String baseUri = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";

      String imagePath = baseUri+path+fileName; //上传的图片路径

<mvc:resources 的使用方法:

<!--对静态资源文件的访问-->
<mvc:resources mapping="/images/**" location="/images/" />

/images /**映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period可以使得静态资源进行web cache

如果出现下面的错误,可能是没有配置 <mvc:annotation-driven /> 的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name ‘springMVC‘

使用 <mvc:resources/> 元素,把 mapping 的 URI 注册到 SimpleUrlHandlerMapping的urlMap 中,
key 为 mapping 的 URI pattern值,而 value为 ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问.
另外需要注意的一点是,不要对 SimpleUrlHandlerMapping 设置 defaultHandler. 因为对 static uri 的 defaultHandler 就是ResourceHttpRequestHandler,
否则无法处理static resources request.

方案三 ,使用<mvc:default-servlet-handler/>

本文原始链接:http://unmi.cc/spring-mvc-access-static-resources-jpgjscss, 来自:隔叶黄莺 Unmi Blog

<mvc:default-servlet-handler/>

会把 "/**" url,注册到 SimpleUrlHandlerMapping 的 urlMap 中,把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet.

补充说明:多个HandlerMapping的执行顺序问题:

DefaultAnnotationHandlerMapping 的 order 属性值是:0

<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping 的 order 属性值是: 2147483646

<mvc:default-servlet-handler/>自动注册的 SimpleUrlHandlerMapping 的 order 属性值是:2147483647

spring 会先执行 order 值比较小的。当访问一个 a.jpg 图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,我们没有叫 a.jpg 的 Action。再按 order 值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以一定会匹配上,再响应图片。

访问一个图片,还要走层层匹配。真不知性能如何?改天做一下压力测试,与Apache比一比。

最后再说明一下,如何你的 DispatcherServlet 拦截 *.do 这样的 URL,就不存上述问题了。

转自:http://lzy83925.iteye.com/blog/1186609

时间: 2024-11-06 12:43:33

【转】SpringMVC访问静态资源的三种方式的相关文章

SpringMVC访问静态资源的三种方式(转)

本文转自:http://www.iigrowing.cn/springmvc_fang_wen_jing_tai_zi_yuan_de_san_zhong_fang_shi.html 如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题. 如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. <!-- Processes application requests --> <s

SpringMVC访问静态资源的三种方式

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 方案一:激活Tomcat的defaultServlet来处理静态文件 1 <servlet-mapping> 2 <servlet-name>default</servlet-name> 3 <url-pattern>*.jpg</u

转转转!SpringMVC访问静态资源的三种方式

如果你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 问题原因:罪魁祸首是web.xml下对spring的DispatcherServlet请求url映射的配置,原配置如下: <servlet> <servlet-name>spring</servlet-name> <servl

当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了. 目的:可以正常访问静态文件,不要找不到静态文件报404. 方案一:激活Tomcat的defaultServlet来处理静态文件 <servlet-mapping> <servlet-name>default</servlet-name> <url

SpringMVC处理请求释放静态资源的三种方式

方式一 在SpringMVC的配置文件中添加如下语句 <mvc:default-servlet-handler/> 说明:当SpringMVC前端控制器对静态资源进行拦截后,在通过处理器映射器找不到相关处理器的情况下该请求会被tomcat中web.xml中默认配置的Servlet拦截. 方式二 SpringMVC的配置文件中添加指定的目录,使这些路径不经过前端控制器 <mvc:resources mapping="/js/**" location="/js/

SpringMVC访问静态资源

转自:SpringMVC访问静态资源 在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问.该肿么办呢? 在配置文件:web.xml可以看到: <!-- Processes application requests --> <servlet> <servlet-name>appServle

【SpringMVC】SpringMVC访问静态资源

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文要以一个例子来说明SpringMVC访问静态资源 <mvc:resources 的使用方法:<!--对静态资源文件的访问--> <mvc:resources mapping="/images/**" location="/images/" /> /images /**映射到 ResourceHttpRequestHandler

Spring mvc应用 加载静态资源的几种方式

总结几种Spring mvc应用加载静态资源的方式 1.使用服务器的默认Servlet处理 对于不同的服务器,处理静态资源的servlet-name不一样,需要去看服务器具体的配置文件 比如resin-3.1.12,通过查看app-default.xml可以看到默认处理jsp的servlet-name为>resin-jsp 所以可以通过在web.xml中添加静态资源的访问 <servlet-mapping>        <servlet-name>resin-jsp<

SpringMVC返回json数据的三种方式

SpringMVC返回json数据的三种方式:http://blog.csdn.net/shan9liang/article/details/42181345 上述第三种方法:可能会出现这个jar包没有的情况,引入即可,下面pom引入即可 java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException