文档章节

使用Ehcache给页面做缓存

楊家家主
 楊家家主
发布于 2014/11/06 16:28
字数 947
阅读 76
收藏 3

使用Ehcache给页面做缓存

 

 

.准备相关文件

        

         1.下载 JAR

 

         使用Ehcache做页面的缓存,所以只需要下载 ehcache-core和ehcache-web模块

         ehcache 下载地址:http://ehcache.org/modules

        

         2.jar复制到lib文件夹

        

         ehcache-core-XXX.jar

         ehcache-web-XXX.jar 主要针对页面缓存

 

         3.复制配置文件

        

         复制 ehcache.xml  到 src 目录。保证编译后会复制到web-inf/classes下面

        

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">

    <!-- 緩存文件存放目錄 :默認為這個路徑,也可以自定義路徑-->
    <diskStore path="java.io.tmpdir"/>
    <!-- 設置默認的 -->
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
    <!-- 
        配置自定义缓存
        maxElementsInMemory:缓存中允许创建的最大对象数
        eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
        timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,
                    两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,
                    如果该值是 0 就意味着元素可以停顿无穷长的时间。
        timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,
                    这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
        overflowToDisk:内存不足时,是否启用磁盘缓存。
        memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。
        
        注意:cache节点中得 name 指向一个cachingFiter,默认使用 SimplePageCachingFilter就够用了。
    -->
    <cache name="SimplePageCachingFilter" 
           maxElementsInMemory="10000" 
           eternal="false"
           overflowToDisk="false" 
           timeToIdleSeconds="900" 
           timeToLiveSeconds="1800"
           memoryStoreEvictionPolicy="LFU" />
 
</ehcache>



 

二.写FILTER对路径进行拦截。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.yhl.jfinal_helloword.cache;

import java.util.Enumeration;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.constructs.blocking.LockTimeoutException;
import net.sf.ehcache.constructs.web.AlreadyCommittedException;
import net.sf.ehcache.constructs.web.AlreadyGzippedException;
import net.sf.ehcache.constructs.web.filter.FilterNonReentrantException;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

/**
 * 页面缓存过滤器
 * @version 1.0
 * @author YHL
 */
public class PageEhCacheFilter extends SimplePageCachingFilter{
    private final static Logger log = Logger.getLogger(PageEhCacheFilter.class);
    
    private final static String FILTER_URL_PATTERNS = "patterns"; //WEB.XML中配置要过滤的地址
    private static String[] cacheURLs;
    private static boolean cache_index=false;

    private void init() throws CacheException {
        String patterns = filterConfig.getInitParameter(FILTER_URL_PATTERNS);
        cacheURLs = StringUtils.split(patterns, ",");
    }

    protected void doFilter(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain)
            throws AlreadyGzippedException, AlreadyCommittedException, FilterNonReentrantException, LockTimeoutException, Exception {
        if (cacheURLs == null) {
            init();
        }

//        String url = request.getRequestURI();
        String url = request.getServletPath();
        boolean flag = false;
        if (cacheURLs != null && cacheURLs.length > 0) {
            for (String cacheURL : cacheURLs) {
                if (url.startsWith(cacheURL.trim())) {
                    flag = true;
                    break;
                }
            }
        }
//      
        // 如果包含我们要缓存的url 就缓存该页面,否则执行正常的页面转向
        if (flag) {
            String query = request.getQueryString();
            if ( !StringUtils.isBlank( query )) {
                query = "?" + query;
            }
            log.info("当前请求被缓存:" + url + (!StringUtils.isBlank(query)&& !query.equalsIgnoreCase("null")?query:"" ) );
            super.doFilter(request, response, chain);
        } else {
            chain.doFilter(request, response);
        }
    }

    @SuppressWarnings("unchecked")
    private boolean headerContains(final HttpServletRequest request, final String header, final String value) {
        logRequestHeaders(request);
        final Enumeration accepted = request.getHeaders(header);
        while (accepted.hasMoreElements()) {
            final String headerValue = (String) accepted.nextElement();
            if (headerValue.indexOf(value) != -1) {
                return true;
            }
        }
        return false;
    }

    /**
     * 兼容ie6、7 使用gzip压缩
     */
    @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;
    }
}



.配置web.xml

            注意:一定要将ehcachefilter 配置在 其他 filter之前。

                         还有注意filter-class的包名和文件名。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
   
    
    <!-- 缓存、gzip压缩核心过滤器 -->
    <filter>
        <filter-name>PageEhCacheFilter</filter-name>
        <filter-class>com.yhl.jfinal_helloword.cache.PageEhCacheFilter</filter-class>
        <init-param>
            <description>使用绝对路径进行匹配。url.starWith(缓存路径)</description>
            <param-name>patterns</param-name>
            <param-value>/hello,/index.jsp</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>PageEhCacheFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    
     <filter>
        <filter-name>jfinal</filter-name>
        <filter-class>com.jfinal.core.JFinalFilter</filter-class>
        <init-param>
            <param-name>configClass</param-name>
            <param-value>com.yhl.jfinal_helloword.config.DemoConfig</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>jfinal</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    
    
    <!-- 缓存配置结束 -->
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>




.测试

           如果是动态页面,可以根据页面变化来判断是否缓存。

            也可以在jsp中添加<%=new Date()%> 通过刷新页面,看时间的变化进行判断。

© 著作权归作者所有

共有 人打赏支持
楊家家主
粉丝 7
博文 12
码字总数 4573
作品 0
临沂
程序员
缓存之EHCache(第三个记录)

六、在页面中使用EHCache缓存 简单的来说,如果一个应用中80% 的时间内都在访问20% 的数据,那么,这时候就应该使用缓存了。 在80/20 原则生效的地方,我们都应该考虑是否可以使用缓存。但即...

heroShane
2014/03/02
0
0
ehcache使用

Ehcache 整合Spring 使用页面、对象缓存 Ehcache在很多项目中都出现过,用法也比较简单。一般的加些配置就可以了,而且Ehcache可以对页面、对象、数据进行缓存,同时支持集群/分布式缓存。如...

机智如wo
2016/07/25
50
0
ehcache整合spring

一、准备工作 如果你的系统中已经成功加入Spring、Hibernate;那么你就可以进入下面Ehcache的准备工作。 1、 下载jar包 Ehcache 对象、数据缓存:http://ehcache.org/downloads/destination?...

李永china
2016/04/26
12
0
Ehcache 整合Spring 使用对象缓存、页面缓存

一、准备工作 如果你的系统中已经成功加入Spring、Hibernate;那么你就可以进入下面Ehcache的准备工作。 1、 下载jar包 Ehcache 对象、数据缓存:http://ehcache.org/downloads/destination?...

zmf
2014/09/16
0
0
我们究竟什么时候可以使用Ehcache缓存

一、Ehcache是什么 EhCache是Hibernate的二级缓存技术之一,可以把查询出来的数据存储在内存或者磁盘,节省下次同样查询语句再次查询数据库,大幅减轻数据库压力。 二、Ehcache的使用场景是什...

zyqJustin
2016/05/10
202
0

没有更多内容

加载失败,请刷新页面

加载更多

linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
1
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
2
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
12
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
0
0
Coding and Paper Letter(四十)

资源整理。 1 Coding: 1.Tomislav Hengl撰写的非官方作者指南:Michael Gould•Wouter Gerritsma。 UnofficialGuide4Authors 2.R语言包rwrfhydro,社区贡献的工具箱,用于管理,分析和可视化...

胖胖雕
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部