在jsp页面中有很多资源都是静态的,很少发生改变。如引入的js,css文件,如果每次加载页面都要到服务器去请求这些文件,会造成一定的浪费,如果将这些资源进行缓存,用户体验就会更好。思路是这样,服务第一次接受静态资源的请求后得到资源输出给客户,输出时设置缓存,下次请求利用浏览器的缓存机制从缓存中获取资源文件。
这就需要做两方面的工作:
第一、静态资源的路径需要添加版本号,如js文件要写出<script src ="/js/menu.js?__V=1248657811953 " type ="text/javascript " >,这里的版本号采用的是js文件的lastModified属性,这样但服务器端的js有改动的话,版本号就会变化,从而重新加载新的js资源文件。这里就需要写相应的jsp tag类了,用于生成合适的资料路径。有关如何定制jsp tag请参考相关的文档。
第二、输出文件时添加缓存,我们这里采用的是在filter中添加缓存,在web.xml中定义如下内容:
<filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>/js/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>/css/*</url-pattern> </filter-mapping>
这样css和js文件的请求都会经过StaticResourceFilter,于是css和js目录下的所有文件都会被缓存,在这个filter里,我们就可以在输出css和js资源时,添加过期头了。代码类似:
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException {
// add expire head.
response.setHeader("Cache-Control", ?);
response.setDateHeader("Expires", ?);
chain.doFilter(request, response);
}
根据自己的需要添加相应的控制。有关response的过期头知识可参考:http://sites.google.com/site/wisedukb/Home/response-expire-header