文档章节

使用Ehcache给页面做缓存

楊家家主
 楊家家主
发布于 2014/11/06 16:28
字数 947
阅读 77
收藏 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()%> 通过刷新页面,看时间的变化进行判断。

© 著作权归作者所有

共有 人打赏支持
楊家家主
粉丝 8
博文 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 整合Spring 使用页面、对象缓存

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

IT_小翼
2013/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS 选择器参考手册

CSS 选择器参考手册 选择器 描述 [attribute] 用于选取带有指定属性的元素。 [attribute=value] 用于选取带有指定属性和值的元素。 [attribute~=value] 用于选取属性值中包含指定词汇的元素。...

Jack088
今天
1
0
数据库篇一

数据库篇 第1章 数据库介绍 1.1 数据库概述  什么是数据库(DB:DataBase) 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据...

stars永恒
今天
2
0
Intellij IDEA中设置了jsp页面,但是在访问页面时却提示404

在Intellij IDEA中设置了spring boot的jsp页面,但是在访问时,却出现404,Not Found,经过查找资料后解决,步骤如下: 在Run/Debug Configurations面板中设置该程序的Working Directory选项...

uknow8692
昨天
3
0
day24:文档第五行增内容|每月1号压缩/etc/目录|过滤文本重复次数多的10个单词|人员分组|

1、在文本文档1.txt里第五行下面增加如下内容;两个方法; # This is a test file.# Test insert line into this file. 分析:给文档后增加内容,可以用sed 来搞定;也可以用while do done...

芬野de博客
昨天
4
0
深入理解JVM—JVM内存模型

深入理解JVM—JVM内存模型 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存...

onedotdot
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部