springmvc基础知识(12):静态资源处理

  • 在使用springmvc时我们需要配置一个dispatcherServlet拦截请求。 但是呢,现在很流行使用rest,所以就得配置<url-pattern>/</url-pattern>拦截所有请求。
  • 对于前台页面,页面中使用到的资源比如图片、引用的js、css等在打开页面时是需要向服务器发出请求才能获取的。如果dispatcherServlet将所有的请求都拦截,那么对于这些静态资源就会获取不到,导致页面资源加载失败。
  • 这时候就需要进行一些配置解决这种问题。

方法一

springmvc的xml配置文件中配置:

  • <mvc:default-servlet-handler /> 开启默认的servlet,这个servlet是web容器提供的servlet,在配置了dispatcherServlet后其处理请求的功能就被取代了。这里开启这个默认的servlet,重新获取处理请求的权利。
  • 但是这时候又会出现一个新问题,dispatcherServlet想要处理的Controller请求失效了。那是因为所有请求都交给了默认的servlet处理,而其又没有处理这种请求的能力。可以设置<mvc:annotation-driven />将默认servlet无法处理的请求交给dispatcherServlet处理。
  • 一般Web应用服务器默认的Servlet名称是”default”,因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是”default”,则需要通过default-servlet-name属性显示指定:
<mvc:default-servlet-handler default-servlet-name="xxx" />

常用Web应用服务器的默认Servlet名称

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

方法二

  • 采用<mvc:resources />
  • <mvc:default-servlet-handler />将静态资源的处理经由Spring
    MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring
    MVC框架自己处理静态资源,并添加一些有用的附加值功能。
  • 传统Web容器只能访问放在Web容器的根路径下的静态资源,WEB-INF目录下的资源只有服务器才能访问到,客户端是访问不了的。
  • 而配置了<mvc:resources/>允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如”classpath:”等的资源前缀指定资源位置。
  • 其次,<mvc:resources />依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,一般可将该时间设置为一年,以充分利用浏览器端的缓存。在输出静态资源时,会根据配置设置好响应报文头的Expires和 Cache-Control值。
    在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。

在springMVC-servlet中添加如下配置:

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

上面配置是将根路径下的resources和/WEB-INF/resources目录映射为/resources路径
假设根路径下的resources和/WEB-INF/resources目录里面放了img.png这个图片,可以使用 /resources/img.png取访问。


方法三
如果不使用rest,可以将Spring的全局拦截设置为*.do的拦截

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80422172
今日推荐