Filter-缓存数据到内存:学习笔记
标签:
SQL Server
CacheFilter
import java.io.IOException;import java.util.HashMap;import java.util.Map;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 cn.itcast.web.decorator.MyResponse;//单例public class CacheFilter implements Filter { //实例变量[每个线程共享] private Map<String,byte[]> cache = new HashMap<String,byte[]>(); public void destroy() { } public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; //NO1:取得客户端访问的资源路径 String uri = request.getRequestURI(); //NO2:根据uri去缓存中查询对应的页面资源有没有 byte[] data = cache.get(uri); //NO3:如果没有 if(data==null){ //将请求和响应放行到web资源中 MyResponse myResponse = new MyResponse(response); chain.doFilter(request,myResponse); //NO4:将刚取得的数据放入到缓存中,便于下次重用 data = myResponse.getBuffer(); cache.put(uri,data); System.out.println("从服务端取得资源"); //NO5:如果有,直接从缓存中了得数据 } //NO6:向浏览器输出数据 response.getOutputStream().write(data); } public void init(FilterConfig filterConfig) throws ServletException { }}
压缩资源:
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ShowServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { PrintWriter pw = response.getWriter(); ServletOutputStream sout = response.getOutputStream(); sout.write(data.getBytes("UTF-8")); MyServletOutputStream mySout = myResponse.getOutputStream(); sout.write("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA".getBytes()); //mySout.write("AAAAAA".getBytes[]); }}
MyResponse
import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;//对response对象的装饰/包装public class MyResponse extends HttpServletResponseWrapper{ private HttpServletResponse response; //缓存 private ByteArrayOutputStream bout = new ByteArrayOutputStream(); private PrintWriter pw; public MyResponse(HttpServletResponse response) { super(response); this.response = response; } //重写父类方法,目的是将字节输出到缓存中去[字节] public ServletOutputStream getOutputStream() throws IOException { return new MyServletOutputStream(bout); } //重写父类方法,目的是将字符输出到缓存中去[字符] public PrintWriter getWriter() throws IOException { pw = new PrintWriter(new OutputStreamWriter(bout,"UTF-8")); return pw; } //取得缓存中的数据 public byte[] getBuffer(){ if(pw!=null){ pw.flush(); } return bout.toByteArray(); }}//带有缓存功能ServletOutputStreamclass MyServletOutputStream extends ServletOutputStream{ private ByteArrayOutputStream bout; public MyServletOutputStream(ByteArrayOutputStream bout) { this.bout = bout; } public void write(int b) throws IOException { } public void write(byte[] bytes) throws IOException { //将字节数组的内容写入缓存 bout.write(bytes); //确保所有字节数组内容进入缓存 bout.flush(); }}
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦