关于java 页面缓存html

13123123 发布于 2014/04/24 11:21
阅读 1K+
收藏 4

香蕉派 的社区网站用到三大技术spring mvc 还有redis   memcache  我打算把关于 缓存页面代码进行分享 求吐槽 求优化改良


public Cache getCacheByKey(String key){
		Cache cache  =  this.getCache().get(key);
		
		if(cache!= null){//如果超过设定的时间 那么进行removed 操作
			if((new Date().getTime()/1000)-cache.getCreateDate() > cache.getExpire()){
				this.getCache().remove(key);
				return null;
			}
		}
		return cache;
	}




@RequestMapping("/home.do")
	public String home(HomeForm hForm, HttpServletRequest request,
			HttpServletResponse reponse,ModelMap map) throws Exception {
		Message message = null;
		message = (Message) usersService.loginCheck(reponse, request);
		//如果登录了 检查cookie    登录了不需要进行缓存数据 因为是根据用户的好友关系推荐数据的 动态的
		if (message.getErrorCode() == ISCHECK_OK_USER) {
			
			map.put("user", message.getUser());
			Topic topic = new Topic();//初始化第一页数据
			topic.setPage(1);
			map.put("topicList", ((Message)topicService.loadTopicByPage(topic)).getData());
			map.put("home", 1);
			return "personal.index";
		} else {//如果没有登录进行缓存操作
			
			
			Cache cache = Resources.getMe().getCacheByKey(INDEX_CACHE);
			/*
			 * 缓存静态页面
			 */
			if(cache== null){
				request.setAttribute(IS_CACHE, true);
				request.setAttribute("key", INDEX_CACHE);
				request.setAttribute("ex",INDEX_DATE );
				message = (Message) topicHomeService.loadIndexData(hForm);//加载引导页数据
				map.put("topicList", message.getData());
				map.put("labelList", message.getData1());
				map.put("groupList", message.getData2());
				
				return "banner.home";
			}else{
				reponse.getOutputStream().write(cache.getContent());
				reponse.getOutputStream().flush();
				reponse.getOutputStream().close();
				return null;	
			}
		}
	}



package com.banner.action;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.ehcache.constructs.web.GenericResponseWrapper;

import com.banner.Data.Code;
import com.banner.Data.Resources;
import com.banner.cache.Cache;

public class CacheFilter implements Filter,Code{

    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain arg2) throws IOException, ServletException {
        String url = ((HttpServletRequest)request).getRequestURI();
        /**
         * 静态资源不需要缓存操作
         */
        if(url.indexOf(".js")!=-1 ||url.indexOf(".css")!=-1||url.indexOf(".jpg")!=-1||url.indexOf(".png")!=-1||url.indexOf(".jif")!=-1||url.indexOf(".bmp")!=-1 ){
            
            arg2.doFilter(request, response);
        }else{
            /**
             * 调用渲染后的生成jsp
             */
          final ByteArrayOutputStream outstr = new ByteArrayOutputStream();
            final GenericResponseWrapper wrapper = new GenericResponseWrapper(
                    (HttpServletResponse) response, outstr);
            arg2.doFilter(request, wrapper);
            wrapper.flush();
            OutputStream out = new BufferedOutputStream(response.getOutputStream());
          
                //需要缓存操作
                if(request.getAttribute(IS_CACHE) != null  && request.getAttribute(IS_CACHE).toString().equals("true")){//如果缓存进行缓存操作
                    
                    Cache cache = new Cache();//缓存对象
                    cache.setCreateDate(new Date().getTime());//获取当前时间
                    cache.setContent(outstr.toByteArray());//获取渲染后的html 
                    cache.setExpire(Long.valueOf(request.getAttribute("ex").toString()));//获取设定的超时时间
                    String key = request.getAttribute("key").toString();//获取设定的主键
                    Resources.getMe().getCache().put(key,cache );
                    
                    out.write(outstr.toByteArray());//输出流
                }else{
                    
                    out.write(outstr.toByteArray());
                }
                
           
            
            out.flush();
        }
//            outstr.toByteArray();
//            System.out.println(new String(outstr.toByteArray()));
                   
    }

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    
    }

}



package com.banner.cache;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V>{
	
	
	   //定义缓存的容量  
    private int capacity;  
    private static final long serialVersionUID = 1L;  
    //带参数的构造器     
    public LRULinkedHashMap(int capacity){  
        //调用LinkedHashMap的构造器,传入以下参数  
        super(16,0.75f,true);  
        //传入指定的缓存最大容量  
        this.capacity=capacity;  
    }  
    //实现LRU的关键方法,如果map里面的元素个数大于了缓存最大容量,则删除链表的顶端元素  
    @Override  
    public boolean removeEldestEntry(Map.Entry<K, V> eldest){    
        return size()>capacity;  
    }  
   
}

加载中
0
飘逸的逸
飘逸的逸

com.banner 不是 com. banana 么? 

13123123
13123123
哈哈 故意这样写的
0
纠结名字

静态资源不需要缓存的判断绝对有问题,我猜是gif而不是jif。url.indexOf(".js")考虑过.jsp的感受吗?

13123123
13123123
我们jsp不混村
0
_hadooper
_hadooper

页面上面搞个oscache,妥妥的

13123123
13123123
e
_hadooper
_hadooper
@13123123 缓存页面哦,oscache有标签的,怎么和session扯上关系
13123123
13123123
oscache 在session 操作是不行的
0
h
hermanlei
为什么不把那个Filter换成springMVC的拦截器实现,这样还能更好的获取spring的上下文
返回顶部
顶部