页面添加缓存-ehcache

.Web.xml配置

<filter>

<filter-name>PageEhcacheFilter</filter-name>

<filter-class>com.X.PageEhcacheFilter</filter-class>

<init-param>

<param-name>cacheName</param-name>

<param-value>SimplePageCachingFilter</param-value>

</init-param>

<init-param>

<param-name>uris</param-name>

<param-value>/index.html,/channel/</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>PageEhcacheFilter</filter-name>

<url-pattern>*.html</url-pattern>

</filter-mapping>


.过滤器写法

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.List;

 

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

import net.sf.ehcache.CacheException;

import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;

 

/**

 * Servlet Filter implementation class PageEhcacheFilter

 */

public class PageEhcacheFilter extends SimplePageCachingFilter {

// 已配置需要缓存的地址列表

private List<String> cachedUris;

 

@Override

protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws Exception{

// 判断,如果请求的页面包含要缓存的url,就缓存, 否则,执行正常页面访问

String requestURI = request.getRequestURI();

// 判断是当前路径是否需要缓存

boolean cache = isConfiguredCache(request.getContextPath(), requestURI);

if(cache){

try {

super.doFilter(request, response, chain);

} catch (Exception e) {

throw e;

}

} else {

chain.doFilter(request, response);

}

}

@Override

public void doInit(FilterConfig config) throws CacheException {

super.doInit(config);

String patterns = filterConfig.getInitParameter("uris");

String[] strs = patterns.split(",");

cachedUris = new ArrayList<String>();

for (String str : strs) {

cachedUris.add(str);

}

}

 

@Override

protected boolean acceptsGzipEncoding(HttpServletRequest request) {

boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");

boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0");

return acceptsEncoding(request, "gzip") || ie6 || ie7;

}

 

@SuppressWarnings("unchecked")

private boolean headerContains(final HttpServletRequest request,

final String header, final String value) {

logRequestHeaders(request);

final Enumeration<String> accepted = request.getHeaders(header);

while (accepted.hasMoreElements()) {

final String headerValue = accepted.nextElement();

if (headerValue.indexOf(value) != -1) {

return true;

}

}

return false;

}

/**

 * @Title: isConfiguredCache

 * @Description: 判断配置文件中是否配置了当前的路径

 * @param path

 * @param uri

 * @return    设定文件

 * @return boolean    返回类型

 */

private boolean isConfiguredCache(String path, String uri) {

boolean result = false;

String r = uri;

if (null != path && !"".equals(path)) {

r = r.substring(path.length());

}

if (cachedUris.contains(r)) {

result = true;

}

return result;

}

 

}

三.清除缓存的写法

/**

 * @Title: cleanPageCache

 * @Description: 显示/清除页面缓存

 * @param request

 * @param response

 * @return

 * @throws IOException

 *             设定文件

 * @return ModelAndView 返回类型

 */

@RequestMapping(value = "/cleanPageCache.htm")

public ModelAndView cleanPageCache(HttpServletRequestrequest, HttpServletResponse response) throws IOException {

String cacheName = "SimplePageCachingFilter";

Map<Object, Object> objects = CacheManagerAgent.instance().getCachedObjects(cacheName);

 

int count = 0;

JsonArray cacheArray = new JsonArray();

JsonObject cacheObject = null;

for (Entry<Object, Object>obj : objects.entrySet()) {

cacheObject = new JsonObject();

 

Object key = obj.getKey();

 

cacheObject.addProperty("order",count);

cacheObject.addProperty("items",key.toString());

cacheArray.add(cacheObject);

count++;

}

// 获取前台传的参数集合

@SuppressWarnings("unchecked")

Map<String, Object> paramsMap = request.getParameterMap();

// 判断集合是否为空

if (paramsMap !=null) {

for (Object s : paramsMap.keySet()) {

String key = request.getParameter(s.toString());

CacheManagerAgent.instance().remove(cacheName,key);

}

}

ModelAndView view = new ModelAndView("/cleanPageCache");

view.addObject("cacheNames",cacheArray);

return view;

}

 

/**

 * @Title: cleanAllCache

 * @Description: 清除所有的缓存

 * @param request

 * @param response

 * @throws IOException

 *             设定文件

 * @return void 返回类型

 */

@RequestMapping(value = "/cleanAllCache.do", method = { RequestMethod.GET })

public void cleanAllCache(HttpServletRequestrequest, HttpServletResponse response) throws IOException {

String cacheName = "SimplePageCachingFilter";

Map<Object, Object> objects = CacheManagerAgent.instance().getCachedObjects(cacheName);

for (Entry<Object, Object>obj : objects.entrySet()) {

CacheManagerAgent.instance().remove(cacheName,obj.getKey().toString());

}

}

/**

 * @Title: cleanMemoryCacheByKey

 * @Description: 根据key清除内存缓存

 * @param request

 * @param response

 *            设定文件

 * @return void 返回类型

 */

@RequestMapping(value = "/cleanMemoryCacheByKey.do", method = RequestMethod.POST)

public void cleanMemoryCacheByKey(HttpServletRequestrequest, HttpServletResponse response) {

String params = request.getParameter("type");

if (StringUtils.isNotBlank(params)) {

if (params.equalsIgnoreCase("all")) {

// 清除所有缓存

DataCacheUtil.instance().clearMap();

} else {

DataCacheUtil.instance().removeObjectFromMapByKey(params);

}

}

}

@RequestMapping(value = "/cleanMemoryCacheByKey.do", method = RequestMethod.GET)

public void cleanMemoryCacheByKeyGet(HttpServletRequestrequest, HttpServletResponse response) {

String params = request.getParameter("type");

if (StringUtils.isNotBlank(params)) {

if (params.equalsIgnoreCase("all")) {

// 清除所有缓存

DataCacheUtil.instance().clearMap();

} else {

DataCacheUtil.instance().removeObjectFromMapByKey(params);

}

}

}

五.maven配置

<!-- ehcache -->

<dependency>

<groupId>net.sf.ehcache</groupId>

<artifactId>ehcache-web</artifactId>

<version>2.0.4</version>

</dependency>

<dependency>

<groupId>net.sf.ehcache</groupId>

<artifactId>ehcache-core</artifactId>

<version>2.6.11</version>

</dependency>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本工程用于研究如何借助Ehcache缓存框架实现对页面缓存 本工程编码方式:UTF-8 本工程开发工具:MyEclipse 说明: 1、ehcache.xml和ehcache.xsd两个文件可以在下在下载下来的名为“ehcache-core-x.x.x-distribution.tar.gz”压缩文件中找到 2、由于要实现Ehcache缓存页面,所以必须要添加ehcache-web-2.0.4.jar” jar包,该jar包主要用于辅助Ehcache实现页面缓存 注意: 本web工程的发布不要使用Tomcat7,否则会出现如下异常: 2015-3-25 9:53:50 org.apache.catalina.loader.WebappClassLoader loadClass 信息: Illegal access: this web application instance has been stopped already. Could not load net.sf.ehcache.store.disk.DiskStore$KeySet. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. java.lang.IllegalStateException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) at net.sf.ehcache.store.disk.DiskStore.keySet(DiskStore.java:560) at net.sf.ehcache.store.disk.DiskStorageFactory$DiskExpiryTask.run(DiskStorageFactory.java:838) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) 相关jar包下载地址: Ehcache 对象、数据缓存:http://ehcache.org/downloads/destination?name=ehcache-core-2.5.2-distribution.tar.gz&bucket=tcdistributions&file=ehcache
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值