`

springMVC对静态资源的处理的三种方式

 
阅读更多
http://my.oschina.net/hnqingping1255/blog/415575
<servlet>  

  <servlet-name>mvc</servlet-name>  

  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  

  <init-param>  

    <param-name>contextConfigLocation</param-name>  

    <param-value>/WEB-INF/classes/conf/spring/mvc-*.xml</param-value>  

  </init-param>  

  <load-on-startup>1</load-on-startup>  

</servlet>  

  

<servlet-mapping>  

  <servlet-name>mvc</servlet-name>  

  <url-pattern>/</url-pattern>  

</servlet-mapping>  



        很明显,该 servlet 对应的 url-pattern 定义成 /,因此该 servlet 会匹配上诸如 /images/a.jpg, /css/hello.css 等这些静态资源,甚至包括 /jsp/stock/index.jsp 这些 jsp 也会匹配。但是并没有定义相应的 Controller 来处理这些资源,因此这些请求通常是无法完成的。

        很麻烦?没有 Struts 方便?此言差矣,因此你在 Struts 定义其核心 filter 的 url-pattern 是 *.action,当然不会对处理 jsp 和静态资源操作影响了。Spring MVC 若也定义类似的 url-pattern,同样不存在问题。

        说到这里,我们应该想一个问题。Tomcat 中,只有 servlet 能够处理请求,即使是 jsp,也会被编译成 servlet。我们即便使用 Struts,定义 *.action 的url-pattern,那 .css, *.gfi 等这些静态资源到底是谁来处理了???你可不要想当然的认为我不是输入了图片的路径了吗?如,/images/a/b/c.gif。请注意,servlet 容器中,只有 servlet 采用处理资源!

        由 servlet 处理这些资源那是一定了。不过,不同的 servlet 容器/应用服务器,处理这些静态资源的 servlet 的名字不大一样:

Tomcat, Jetty, JBoss, and GlassFish:默认 Servlet 名字为 "default"

Google App Engine:默认 Servlet 名字为 "_ah_default"

Resin:默认 Servlet 名字为 "resin-file"

WebLogic:默认 Servlet 名字为 "FileServlet"

WebSphere:默认 Servlet 名字为 "SimpleFileServlet"


    ◇ 方案一:激活 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> 



        每种类型的静态资源需要分别配置一个 servlet-mapping,同时,要写在 DispatcherServlet 的前面, 让 defaultServlet 先拦截。

但是这样还会有个问题,就是无法访问到classpath下的资源文件,看了tomcat的DefaultServlet的配置项,似乎也没有可以指定目录的地方。



    ◇ 方案二:Spring 3.0.4 以后版本提供了 <mvc:resources />

   

<!-- 处理静态资源 -->  

    <!-- 上传的图片缓存1个月,其他js,css,img资源缓存一年 -->  

    <mvc:resources mapping="/res/**" location="/res/" cache-period="2592000"/>   

    <mvc:resources mapping="/resources/**" location="/resources/" cache-period="31536000"/>   

    <mvc:resources mapping="/css/**" location="/css/" cache-period="31536000"/>  

    <mvc:resources mapping="/js/**" location="/js/" cache-period="31536000"/>  

    <mvc:resources mapping="/img/**" location="/img/" cache-period="31536000"/>  

    <mvc:resources mapping="/images/**" location="/images/" cache-period="31536000"/> 


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

        使用 <mvc:resources /> 元素,会把 mapping 的 URI 注册到 SimpleUrlHandlerMapping 的 urlMap 中,key 为 mapping 的 URI pattern 值,而 value 为 ResourceHttpRequestHandler,这样就巧妙的把对静态资源的访问由 HandlerMapping 转到 ResourceHttpRequestHandler 处理并返回,所以就支持 classpath 目录, jar 包内静态资源的访问。




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

        补充说明下以上提到的 HandlerMapping 的 order 的默认值:

DefaultAnnotationHandlerMapping:0

<mvc:resources /> 自动注册的 SimpleUrlHandlerMapping:2147483646

<mvc:default-servlet-handler/> 自动注册的 SimpleUrlHandlerMapping:2147483647

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

        Spring MVC 中,访问一个图片,还要走层层匹配。性能肯定好不到哪里去。不仅仅是 Spring MVC,即便 Struts,它们毕竟存活于 servlet 容器,只要由 servlet 容器处理这些静态资源,必然要将这些资源读入 JVM 的内存区中。所以,处理静态资源,我们通常会在前端加 apache 或 nginx。

另外,性能最好的应该是直接利用容器的DefaultServlet,让它最先拦截静态资源请求,这样就避免了后续的转发等操作,提高了性能,但是无法访问classpath下的资源文件。而通过mvc:resources标签可以简单配置匹配规则和资源文件路径,应该说是最简单快捷的一种方式,当然这大概也是mvc命名空间设计的初衷。

另外,若想结合两者的话,自己倒是可以尝试写一个Servlet来处理,不过估计有难度且麻烦。
分享到:
评论

相关推荐

    SpringMVC访问静态资源

    在Spring MVC框架中,处理动态请求是其核心功能,但同时它也需要支持对静态资源的访问,例如HTML、CSS、JavaScript、图片等。...通过灵活的配置,开发者可以根据项目需求来定制最佳的静态资源处理策略。

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

    方案一适用于希望完全控制静态资源处理的情况,方案二适用于需要在Spring MVC内管理静态资源的场景,而方案三则提供了一种简洁的解决方案,不需要对每种静态资源类型进行显式配置。理解并灵活运用这些方法,可以提高...

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...

    springmvc静态资源增强处理

    Spring Framework 4.1 mvc添加了静态资源增强处理功能.本源码仅是一个简单使用例子.详细参考;http://blog.csdn.net/xiejx618/article/details/40478275

    springmvc静态资源访问

    Spring MVC作为一款流行的Java Web框架,提供了灵活的方式来处理这些静态资源的请求。本文将详细介绍如何在Spring MVC中配置和使用静态资源访问,并解释何时以及为何需要这样做。 #### 二、为什么需要处理静态资源 ...

    SpringMVC访问静态资源的方法

    总结来说,SpringMVC提供了多种方式来处理静态资源,包括直接在`servlet-context.xml`中配置资源映射、使用`&lt;mvc:default-servlet-handler/&gt;`标签以及自定义`WebMvcConfigurerAdapter`。根据项目需求,你可以选择...

    SpringMVC 拦截器不拦截静态资源的三种处理方式方法

    这种方式的优势在于,无需在拦截器配置中进行大量排除,静态资源处理更自然。但是,需要确保默认Servlet的配置位于Spring的DispatcherServlet之前,且可能会影响其他已有的静态资源处理逻辑。 ### 方案三:修改全局...

    springmvc-demo03-静态资源访问处理.zip

    在Spring MVC框架中,静态资源处理是一个至关重要的部分,它涉及到网页应用中JavaScript、CSS、图片等非Java代码文件的访问。Spring MVC默认情况下,并不直接处理这些静态资源,而是交由Web服务器(如Tomcat)来处理...

    SpringMvc静态资源访问实现方法代码实例

    SpringMvc静态资源访问实现方法代码实例 ...SpringMvc静态资源访问实现方法代码实例为开发者提供了一定的参考价值,无论是使用官方推荐的方法还是xml方式或java方式,都可以解决静态资源访问的问题。

    SSM笔记-SpringMVC的CRUD和静态资源

    总结,SpringMVC为Web开发提供了强大的CRUD操作支持和静态资源处理机制,结合注解驱动的请求映射,可以轻松构建高效、可维护的Web应用。同时,数据绑定和验证功能进一步增强了应用的健壮性。通过理解并熟练运用这些...

    SpringMVC专栏8、RESTful案例static静态资源

    在Spring MVC中,`/static`是默认的静态资源目录,当浏览器发起对这些静态资源的请求时,Spring MVC会自动处理并返回相应的文件。 1. **配置静态资源**: 在Spring MVC的配置中,我们可以通过`...

    springMVC静态资源

    然而,有时我们可能需要自定义静态资源的路径或者对静态资源的处理方式进行调整。这可以通过在Spring MVC的配置类中添加`WebMvcConfigurer`接口的实现来完成。例如,我们可以在`addResourceHandlers`方法中指定额外...

    SpringBoot静态资源处理共5页.pdf.zip

    以上是SpringBoot静态资源处理的一些核心概念和配置方式。理解并掌握这些知识点,可以帮助开发者更有效地管理和优化应用中的静态资源。如果需要深入学习,可以查阅解压后的"SpringBoot静态资源处理共5页.pdf"文档,...

    springmvc 其他引用资源(reference)

    - 静态资源处理:可以通过配置让 DispatcherServlet 放过静态资源请求,如 CSS、JavaScript 文件。 - 国际化:使用 LocaleResolver 和 MessageSource 支持多语言环境。 3. **控制器(Controller)**: - 控制器...

    详解SpringMVC中设置静态资源不被拦截的问题

    总的来说,Spring MVC中处理静态资源不被拦截的关键在于正确配置静态资源的处理方式,使其独立于拦截器路径之外。理解这一点对于优化应用性能和用户体验至关重要。通过上述方法,你可以确保静态资源的正常加载,避免...

    详解springmvc拦截器拦截静态资源

    静态资源通常是应用程序中不会经过后端处理的文件,它们通常存储在特定的目录下,如 `/static` 或 `/resources`。为了确保静态资源能够正常访问,我们需要在 Spring MVC 的配置中明确指定它们的映射路径,如下所示:...

    SpringMVC使用的Swagger UI静态资源

    **Spring MVC 使用 Swagger UI 静态资源** Swagger 是一个强大的工具,专为 RESTful API 设计,它允许开发者通过 YAML 或 JSON 语言编写接口定义,进而生成清晰、交互式的文档,同时支持代码生成,方便客户端和...

    springMVC笔记

    2. springmvc-servlet.xml配置文件说明:这个配置文件中需要定义组件扫描、静态资源处理、注解驱动以及视图解析器等信息。 - 组件扫描(component-scan):指定SpringMVC需要管理的包路径,它会自动扫描这些路径...

    解决springMVC 跳转js css图片等静态资源无法加载的问题

    另一种解决方案是在Spring MVC的配置文件(如`spring-mvc.xml`)中添加对静态资源的处理。这可以通过配置`ResourceHandlerRegistry`来实现,如下所示: ```xml **" location="/static/" /&gt; ``` 这段代码告诉Spring ...

    SpringMVC_staticpage

    3. **静态资源处理**: SpringMVC可以通过配置允许直接访问项目中的静态资源目录,如`/static`, `/resources`等,这样可以直接返回静态HTML文件。 4. **预渲染(Prerendering)**: 当动态内容需要转化为静态页面时,...

Global site tag (gtag.js) - Google Analytics