• Spring MVC 访问静态资源


      配置web.xml中的DispatcherServlet:

     1 <servlet>  
     2     <servlet-name>SpringMVC</servlet-name>         
     3     <servletclass>
     4         org.springframework.web.servlet.DispatcherServlet
     5     </servlet-class>  
     6      <load-on-startup>1</load-on-startup>  
     7 </servlet>  
     8 
     9 <servlet-mapping>  
    10     <servlet-name>SpringMVC</servlet-name>  
    11     <url-pattern>/</url-pattern>  
    12 </servlet-mapping>

      通过上面url-pattern的配置,所有URL请求都将被SpringMVC的DispatcherServlet拦截(即所有请求交给SpringMVC去处理)。于是,静态资源无法正确访问。如果 DispatcherServlet拦截类似于*.do这样的URL,就不存在该问题了。

      

      3种解决方案

      方案一 激活Tomcat的defaultServlet来处理静态资源

     1 <servlet-mapping>
     2     <servlet-name>default</servlet-name>
     3     <url-pattern>*.jpg</url-pattern>
     4 </servlet-mapping>
     5 
     6 <servlet-mapping>
     7     <servlet-name>default</servlet-name>
     8     <url-pattern>*.js</url-pattern>
     9 </servlet-mapping>
    10 
    11 <servlet-mapping>
    12     <servlet-name>default</servlet-name>
    13     <url-pattern>*.css</url-pattern>
    14 </servlet-mapping>

      写在SpringMVC的DispatcherServlet前面, 请求先由Tomcat的defaultServlet拦截,静态资源请求不会交给SpringMVC去处理,性能最好。

      备注: 

      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

      mvc:resources允许静态资源放在任何地方,如WEB-INF目录下、类路径下,也可以将js等静态文件打到jar包中。

    1 <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    2 <mvc:resources mapping="/resources/**" location="/resources/" />
    3 <mvc:resources mapping="/images/**" location="/images/" />
    4 <mvc:resources mapping="/js/**" location="/js/" />

      mapping:映射。

      location:本地资源路径,必须是webapp(WebContent和WebRoot也可以)根目录下的路径。

      两个*表示映射所有的URL,包括子路径(即接多个/)。如果出现错误—WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC',可能没有配置

    1 <mvc:annotation-driven />

      <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/>

      如果是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理;如果不是静态资源的请求,由DispatcherServlet处理。

    1 <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。

      SpringMVC根据order属性值升序排列顺序依次执行多个HandlerMapping。

      注意:静态资源访问路径可能会受到Controller层前缀URL的影响,需要加上一个或多个../来消除。

      参考资料

      SpringMVC 之<mvc:default-servlet-handler />

      SpringMVC访问静态资源

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

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

      SpringMVC下JS中发送请求自动加前缀的问题

  • 相关阅读:
    翻转整数
    无重复字符的最长子串
    字节问题
    django model中get()和filter()方法的区别
    leetcode 290 Word Pattern(map的应用)
    leetcode 130 Surrounded Regions(BFS)
    leetcode 27 Remove Element
    leetcode 102 Binary Tree Level Order Traversal(DFS||BFS)
    leetcode 111 Minimum Depth of Binary Tree(DFS)
    leetcode 104 Maximum Depth of Binary Tree(DFS)
  • 原文地址:https://www.cnblogs.com/WJQ2017/p/8051386.html
Copyright © 2020-2023  润新知