使用SSH做成的网站,首页如何载入数据是一个问题,既要考虑到及时性和性能也要考虑到SEO,javaeye上也有很多相关的讨论。比如问答版块中的:
http://www.iteye.com/problems/27503
http://www.iteye.com/problems/27503
看了一上午,小总结了一下,无非是以下几种方法:
1.使用首页静态化
2.使用ajax动态调用数据库内容
3.部分静态和部分动态调用
4.使用缓存。
根据我们的需求,我使用缓存首页,具体使用Oscache的CacheFilter缓存首页,具体配置记录如下:
1.引入Oscache的jar
2.src下放入Oscache的配置文件oscache.properties
3.web.xml中写入配置:
最简单的配置:
<filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping>
关于详细配置的介绍在这里:http://www.opensymphony.com/oscache/wiki/CacheFilter.html
一下是我的配置:
<filter> <filter-name>CacheFilter</filter-name> <filter-class> com.cache.MyFilterCache </filter-class> <init-param> <param-name>time</param-name> <param-value>-1</param-value> </init-param> <init-param> <param-name>EntryRefreshPolicy </param-name> <param-value>com.cache.MyEntryRefreshPolicy</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>/index.jsp</url-pattern> </filter-mapping>
注意:1.filter-class可以使用Oscache自带的com.opensymphony.oscache.web.filter.CacheFilter,
我是为了方便所以自己写了一个类继承了它,重写了一个createCacheKey方法:
public class MyFilterCache extends CacheFilter{
@Override public String createCacheKey(HttpServletRequest httpRequest, ServletCacheAdministrator scAdmin, Cache cache) { return httpRequest.getServletPath(); } }
2. EntryRefreshPolicy 是一个刷新缓存的控制类,实现EntryRefreshPolicy接口,这个接口只声明了
一个方法needsRefresh,就是是否要刷新,呵呵。网上有人说使用CacheFilter无法自己控制刷新,
只能用时间来控制,我看了一下源码发现是可以实现的。
public class MyEntryRefreshPolicy implements EntryRefreshPolicy { @Override public boolean needsRefresh(CacheEntry entry) { if(CacheUtil.isFLUSH()){//判断是否需要刷新缓存 CacheUtil.setFLUSH(false);//刷新缓存后把需要刷新状态设为false return true; } return false; } }
其中用到了一个工具类:
public class CacheUtil { private static boolean FLUSH=false;//是否刷新缓存 public static boolean isFLUSH() { return FLUSH; } public static void setFLUSH(boolean flush) { FLUSH = flush; } }
3.配置中的time是控制刷新时间的,是int类型单位是s,默认是3600.我写成-1是不让他的这个功能生效。
然后就可以手动的控制是否需要刷新了。
如果不仅需要定时刷新还需要手动刷新的话,就在needsRefresh方法中再总相应的处理。
在我的下一笔文章中实现了定时刷新和手动刷新: Oscache CacheFilter定时刷新和手动刷新缓存URL的实现