1、day19ThreadLocal模式与OSIV模式Day19过虑器/ThreadLocal/权限/监听器/观察者模式1、 今天的主要内容学习的方法: 方法三步曲: 第一步:抄写代码。(抄) 第二步:默写代码。(背) 第三步:理解代码。(理解)、用过虑器实现以下功能:1:对输出的数据进行压缩。或是对全站进行压缩。 ByteArrayoutputsteam GzipoutputStream 实现数据压缩 设置三个头: resp.setContentType(text/html;charset=UTf-8); resp.setContentLength(dest.length); resp.setH
2、eader(Content-Encoding,gzip);2:用过虑器来管理事务,OSIV模式,与使用代理管理事务对比与分析。 ThreadLocal模式在实际开发中的应用。 参与数据库管理。 将事务下放到Service层。3:实现权限过虑器。综合示例。相对比较复杂。 5个表联合工作。 ER实体关系图。 要用两个过虑器实现安全过虑。认证过虑器和验证过虑器。2、补以下内容:补:CallableStatement调用存储过程补:内省在数据封装中起的作用?数据库反射与类反射共同使用带来的方便。 内省 一个核心类:PropertyDescriptor。 内省本质上是反射。补:JNDI3、监听器观察者模
3、式 观察者。被观察者。观察事件。2、 以下是课上的记录3、数据的压缩GzipOutputStream - ByteArrayOutputStream。:以下是在某个servlet中对指定的数据进行压缩:package cn.itcast.servlet;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStream;import java.io.PrintWriter;import java.io.StringReader;import java.util.zip.GZIPO
4、utputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class GzipServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse resp) thro
5、ws ServletException, IOException /声明准备被压缩的数据 String str = Hello你好Hello你好在内存中声明一Hello你好在 + 内存中声明一个Hello你好在内存中声明一个Hello你 + 好在内存中声明一个容器声明准备被压缩获取准备被压缩 + 的数据的字节码的数据容器声明准备被压缩获取准备被压缩的数 + 据的字节码的数据容器声明准备被压缩获取准备被压缩的数据的 + 字节码的数据个容器声明准备被压缩获取准备被压缩的数据的字节码的 + 数据在内存中声明一个容器声明准备被压缩获取准备被压缩的数据 + 的字节码的数据; /2:获取准备被压缩的数据的
6、字节码 byte src = str.getBytes(UTF-8); /3:在内存中声明一个容器 ByteArrayOutputStream destByte = new ByteArrayOutputStream(); /:声明压缩的工具流,并设置压缩的目的地为destByte GZIPOutputStream zip = new GZIPOutputStream(destByte); /5:写入数据 zip.write(src); /6:关闭压缩工具流 zip.close(); System.err.println(压缩之前字节码大小:+src.length); /:获取压缩以后数据 b
7、yte dest = destByte.toByteArray(); System.err.println(压缩以后的字节码大小:+dest.length); /8:必须要输出压缩以后字节数组 resp.setContentType(text/html;charset=UTF-8); /9:必须要使用字节流来输出信息 OutputStream out = resp.getOutputStream(); /10:通知浏览器。这是压缩的数据,要求浏览器解压 resp.setHeader(Content-encoding,gzip); /11:通知浏览器压缩数据的长度 resp.setContent
8、Length(dest.length); /10:输出 out.write(dest); :所有页面*。jsp全部压缩 只要是输出信息,只有两种方式: Respoonse.getWriter().输出信息字符流。所有的jsp页面,编译后,都是通过JspWriter方式输出的信息。 但所有jsp页面都是JspWriter,而jspwriter是对PrintWriter的包装。Response.getOutputStream() 字节流。分析:如果要实现全站的压缩,请先实现对所有servlet中的resp.getWriter输出的数据都压缩 先实现对一个进行压缩。第一步:书写一个类Servlet类
9、。正常输出信息 : resp.,getWriter().print(.);public class OneServlet extends HttpServlet public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException response.setContentType(text/html;charset=UTF-8); PrintWriter out = response.getWriter(); out.println(Hell
10、o你好大家同学); 第二步:对这上面的这个类进行拦截-Filter,在拦截过程中包装response 实现抽像类:HttpServletResponseWrapper package cn.itcast.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletReq
11、uest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class GzipFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest request, Serv
12、letResponse response, FilterChain chain) throws IOException, ServletException /声明MyResponse包装类 MyResponse resp = new MyResponse(HttpServletResponse) response); /放行时,必须要传递自己包装过的类 chain.doFilter(request, resp); public void destroy() /实现对HttpSerlvetResponse的包装class MyResponse extends HttpServletRespons
13、eWrapper public MyResponse(HttpServletResponse response) super(response); 第三步:为了可以压缩数据,我们必须要拦截getwriter方法 返回的不是apache的Wrtiter对象。以下是完整的代码:package cn.itcast.filter;public class GzipFilter implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(Servlet
14、Request request, ServletResponse response, FilterChain chain) throws IOException, ServletException /声明MyResponse包装类 MyResponse resp = new MyResponse(HttpServletResponse) response); /放行时,必须要传递自己包装过的类 chain.doFilter(request, resp); /目标类调用完成了,返回 以后读取a.txt File file = new File(d:/a/a.txt); /声明一个缓存的字符串对象
15、 StringBuilder sb = new StringBuilder(); /读取文件 InputStream in = new FileInputStream(file); byte b = new byte1024; int len = 0; while(len=in.read(b)!=-1) sb.append(new String(b,0,len,UTF-8); in.close(); /转成字节开始压缩 byte src = sb.toString().getBytes(UTF-8); /声明缓存容器 ByteArrayOutputStream destBytes = new
16、ByteArrayOutputStream(); /声明压缩流 GZIPOutputStream gzip = new GZIPOutputStream(destBytes); /压缩数据 gzip.write(src); gzip.close(); /获取压缩以后数据 byte dest = destBytes.toByteArray(); System.err.println(压缩之前:+src.length); System.err.println(压缩以后:+dest.length); /输出 /必须要使用原生 的response HttpServletResponse res = (
17、HttpServletResponse) response; res.setContentType(text/html;charset=UTf-8); OutputStream out = res.getOutputStream(); res.setHeader(Content-encoding, gzip);/必须 res.setContentLength(dest.length); out.write(dest); public void destroy() /实现对HttpSerlvetResponse的包装class MyResponse extends HttpServletResp
18、onseWrapper public MyResponse(HttpServletResponse response) super(response); Override public PrintWriter getWriter() throws IOException System.err.println(有人想获取输出流); PrintWriter out = new PrintWriter( new OutputStreamWriter( new FileOutputStream(d:/a/a.txt),UTF-8); return out; 第四步:修改包装类Myresponse2,让
19、输出数据放到一个内存缓存区中package cn.itcast.filter;public class GzipFilter2 implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException HttpServletResponse res
20、p= (HttpServletResponse) response; /声明包装类对象 MyResponse2 myresp = new MyResponse2(resp); /放行,调用oneServlet.doGet chain.doFilter(request, myresp); /第二步:从myresp2中读取原生的数据 byte src = myresp.getSrc(); /第三步:开始压缩 ByteArrayOutputStream destBytes = new ByteArrayOutputStream(); GZIPOutputStream zip = new GZIPOu
21、tputStream(destBytes); zip.write(src); zip.close(); /第三步:输出-使用原生的response resp.setContentType(text/html;charset=UTF-8); /获压缩以后数据 byte dest = destBytes.toByteArray(); System.err.println(压缩之前:+src.length); System.err.println(压缩以后:+dest.length); /设置头 resp.setContentLength(dest.length); resp.setHeader(C
22、ontent-Encoding,gzip); /输出 OutputStream out = resp.getOutputStream(); out.write(dest); public void destroy() /第一步:声明response的包装类class MyResponse2 extends HttpServletResponseWrapper /将这个容器/a.txt,声明成员变量 private ByteArrayOutputStream srcByte; public MyResponse2(HttpServletResponse response) super(respo
23、nse); /修改增强getWtier方法 Override public PrintWriter getWriter() throws IOException srcByte = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter( new OutputStreamWriter(srcByte, UTF-8); return out; /提供一个方法获取原生 的数据 public byte getSrc() return srcByte.toByteArray(); 第五步:全部的jsp都要经过压缩 只要是通过包装re
24、rsponse,且修改了getWriter方法,返回一个自己的printwiter对象。声明一个放原数据的容器对象。就可以实现数据压缩。 public class GzipFilter2 implements Filter public void init(FilterConfig filterConfig) throws ServletException public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletExc
25、eption HttpServletResponse resp= (HttpServletResponse) response; /声明包装类对象 MyResponse2 myresp = new MyResponse2(resp); /放行,调用oneServlet.doGet chain.doFilter(request, myresp); /第二步:从myresp2中读取原生的数据 byte src = myresp.getSrc(); /第三步:开始压缩 ByteArrayOutputStream destBytes = new ByteArrayOutputStream(); GZI
26、POutputStream zip = new GZIPOutputStream(destBytes); zip.write(src); zip.close(); /第三步:输出-使用原生的response resp.setContentType(text/html;charset=UTF-8); /获压缩以后数据 byte dest = destBytes.toByteArray(); System.err.println(压缩之前:+src.length); System.err.println(压缩以后:+dest.length); /设置头 resp.setContentLength(
27、dest.length); resp.setHeader(Content-Encoding,gzip); /输出 OutputStream out = resp.getOutputStream(); out.write(dest); public void destroy() /第一步:声明response的包装类class MyResponse2 extends HttpServletResponseWrapper /将这个容器/a.txt,声明成员变量 private ByteArrayOutputStream srcByte; private PrintWriter out; publi
28、c MyResponse2(HttpServletResponse response) super(response); /修改增强getWtier方法 Override public PrintWriter getWriter() throws IOException srcByte = new ByteArrayOutputStream(); out = new PrintWriter( new OutputStreamWriter(srcByte, UTF-8); return out; /提供一个方法获取原生 的数据 public byte getSrc() if(out!=null) out.close(); return srcByte.toByteArray(); 且它的配置如下: zip2 cn.itcast.filter.GzipFilter2 zip2 *.jsp 4、同时实现对getoutputstream和getWtier压缩 思想: 在myrespons2这个类中,对getoutputstream也要覆盖。 返回一个Servle
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1