day19ThreadLocal模式与OSIV模式.docx
《day19ThreadLocal模式与OSIV模式.docx》由会员分享,可在线阅读,更多相关《day19ThreadLocal模式与OSIV模式.docx(31页珍藏版)》请在冰豆网上搜索。
day19ThreadLocal模式与OSIV模式
Day19
过虑器/ThreadLocal/权限/监听器/观察者模式
1、今天的主要内容
学习的方法:
方法三步曲:
第一步:
抄写代码。
(抄)
第二步:
默写代码。
(背)
第三步:
理解代码。
(理解)
1、用过虑器实现以下功能:
1:
对输出的数据进行压缩。
或是对全站进行压缩。
ByteArrayoutputsteam
GzipoutputStream–实现数据压缩
设置三个头:
resp.setContentType("text/html;charset=UTf-8");
resp.setContentLength(dest.length);
resp.setHeader("Content-Encoding","gzip");
2:
用过虑器来管理事务,OSIV模式,与使用代理管理事务对比与分析。
ThreadLocal模式在实际开发中的应用。
参与数据库管理。
将事务下放到Service层。
3:
实现权限过虑器。
-综合示例。
相对比较复杂。
5个表联合工作。
ER实体关系图。
要用两个过虑器实现安全过虑。
认证过虑器和验证过虑器。
2、补以下内容:
补:
CallableStatement调用存储过程
补:
内省在数据封装中起的作用?
数据库反射与类反射共同使用带来的方便。
内省
一个核心类:
PropertyDescriptor。
内省本质上是反射。
补:
JNDI
3、监听器-观察者模式
观察者。
被观察者。
观察事件。
2、以下是课上的记录
3、数据的压缩
GzipOutputStream->>ByteArrayOutputStream。
1:
以下是在某个servlet中对指定的数据进行压缩:
packagecn.itcast.servlet;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.io.StringReader;
importjava.util.zip.GZIPOutputStream;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassGzipServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresp)
throwsServletException,IOException{
//声明准备被压缩的数据
Stringstr="Hello你好Hello你好在内存中声明一Hello你好在"+
"内存中声明一个Hello你好在内存中声明一个Hello你"+
"好在内存中声明一个
容器声明准备被压缩获取准备被压缩"+
"的数据的字节码的数据容器声明准备被压缩获取准备被压缩的数"+
"据的字节码的数据容器声明准备被压缩获取准备被压缩的数据的"+
"字节码的数据个容器声明准备被压缩获取准备被压缩的数据的字节码的"+
"数据在内存中声明一个容器声明准备被压缩获取准备被压缩的数据"+
"的字节码的数据";
//2:
获取准备被压缩的数据的字节码
byte[]src=str.getBytes("UTF-8");
//3:
在内存中声明一个容器
ByteArrayOutputStreamdestByte=newByteArrayOutputStream();
//4:
声明压缩的工具流,并设置压缩的目的地为destByte
GZIPOutputStreamzip=newGZIPOutputStream(destByte);
//5:
写入数据
zip.write(src);
//6:
关闭压缩工具流
zip.close();
System.err.println("压缩之前字节码大小:
"+src.length);
//7:
获取压缩以后数据
byte[]dest=destByte.toByteArray();
System.err.println("压缩以后的字节码大小:
"+dest.length);
//8:
必须要输出压缩以后字节数组
resp.setContentType("text/html;charset=UTF-8");
//9:
必须要使用字节流来输出信息
OutputStreamout=resp.getOutputStream();
//10:
通知浏览器。
这是压缩的数据,要求浏览器解压
resp.setHeader("Content-encoding","gzip");
//11:
通知浏览器压缩数据的长度
resp.setContentLength(dest.length);
//10:
输出
out.write(dest);
}
}
2:
所有页面*。
jsp全部压缩
只要是输出信息,只有两种方式:
Respoonse.getWriter()..输出信息 - 字符流。
所有的jsp页面,编译后,都是通过JspWriter方式输出的信息。
但所有jsp页面都是JspWriter,而jspwriter是对PrintWriter的包装。
Response.getOutputStream()– ―― 字节流。
分析:
如果要实现全站的压缩,请先实现对所有servlet中的resp.getWriter输出的数据都压缩
先实现对一个进行压缩。
第一步:
书写一个类Servlet类。
正常输出信息
:
resp.,getWriter().print(…..);
publicclassOneServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriterout=response.getWriter();
out.println("Hello你好大家同学");
}
}
第二步:
对这上面的这个类进行拦截-Filter,在拦截过程中包装response
实现抽像类:
HttpServletResponseWrapper-
packagecn.itcast.filter;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpServletResponseWrapper;
publicclassGzipFilterimplementsFilter{
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
//声明MyResponse包装类
MyResponseresp=newMyResponse((HttpServletResponse)response);
//放行时,必须要传递自己包装过的类
chain.doFilter(request,resp);
}
publicvoiddestroy(){
}
}
//实现对HttpSerlvetResponse的包装
classMyResponseextendsHttpServletResponseWrapper{
publicMyResponse(HttpServletResponseresponse){
super(response);
}
}
第三步:
为了可以压缩数据,我们必须要拦截getwriter方法
返回的不是apache的Wrtiter对象。
以下是完整的代码:
packagecn.itcast.filter;
publicclassGzipFilterimplementsFilter{
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
//声明MyResponse包装类
MyResponseresp=newMyResponse((HttpServletResponse)response);
//放行时,必须要传递自己包装过的类
chain.doFilter(request,resp);
//目标类调用完成了,返回以后读取a.txt
Filefile=newFile("d:
/a/a.txt");
//声明一个缓存的字符串对象
StringBuildersb=newStringBuilder();
//读取文件
InputStreamin=newFileInputStream(file);
byte[]b=newbyte[1024];
intlen=0;
while((len=in.read(b))!
=-1){
sb.append(newString(b,0,len,"UTF-8"));
}
in.close();
//转成字节开始压缩
byte[]src=sb.toString().getBytes("UTF-8");
//声明缓存容器
ByteArrayOutputStreamdestBytes=newByteArrayOutputStream();
//声明压缩流
GZIPOutputStreamgzip=newGZIPOutputStream(destBytes);
//压缩数据
gzip.write(src);
gzip.close();
//获取压缩以后数据
byte[]dest=destBytes.toByteArray();
System.err.println("压缩之前:
"+src.length);
System.err.println("压缩以后:
"+dest.length);
//输出
//必须要使用原生的response
HttpServletResponseres=(HttpServletResponse)response;
res.setContentType("text/html;charset=UTf-8");
OutputStreamout=res.getOutputStream();
res.setHeader("Content-encoding","gzip");//必须
res.setContentLength(dest.length);
out.write(dest);
}
publicvoiddestroy(){
}
}
//实现对HttpSerlvetResponse的包装
classMyResponseextendsHttpServletResponseWrapper{
publicMyResponse(HttpServletResponseresponse){
super(response);
}
@Override
publicPrintWritergetWriter()throwsIOException{
System.err.println("有人想获取输出流");
PrintWriterout=newPrintWriter(
newOutputStreamWriter(
newFileOutputStream("d:
/a/a.txt"),"UTF-8"));
returnout;
}
}
第四步:
修改包装类Myresponse2,让输出数据放到一个内存缓存区中
packagecn.itcast.filter;
publicclassGzipFilter2implementsFilter{
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
HttpServletResponseresp=(HttpServletResponse)response;
//声明包装类对象
MyResponse2myresp=newMyResponse2(resp);
//放行,调用oneServlet.doGet
chain.doFilter(request,myresp);
//第二步:
从myresp2中读取原生的数据
byte[]src=myresp.getSrc();
//第三步:
开始压缩
ByteArrayOutputStreamdestBytes=newByteArrayOutputStream();
GZIPOutputStreamzip=newGZIPOutputStream(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("Content-Encoding","gzip");
//输出
OutputStreamout=resp.getOutputStream();
out.write(dest);
}
publicvoiddestroy(){
}
}
//第一步:
声明response的包装类
classMyResponse2extendsHttpServletResponseWrapper{
//将这个容器/a.txt,声明成员变量
privateByteArrayOutputStreamsrcByte;
publicMyResponse2(HttpServletResponseresponse){
super(response);
}
//修改增强getWtier方法
@Override
publicPrintWritergetWriter()throwsIOException{
srcByte=newByteArrayOutputStream();
PrintWriterout=
newPrintWriter(
newOutputStreamWriter(srcByte,"UTF-8"));
returnout;
}
//提供一个方法获取原生的数据
publicbyte[]getSrc(){
returnsrcByte.toByteArray();
}
}
第五步:
全部的jsp都要经过压缩
只要是通过包装rersponse,且修改了getWriter方法,返回一个自己的printwiter对象。
声明一个放原数据的容器对象。
就可以实现数据压缩。
publicclassGzipFilter2implementsFilter{
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
HttpServletResponseresp=(HttpServletResponse)response;
//声明包装类对象
MyResponse2myresp=newMyResponse2(resp);
//放行,调用oneServlet.doGet
chain.doFilter(request,myresp);
//第二步:
从myresp2中读取原生的数据
byte[]src=myresp.getSrc();
//第三步:
开始压缩
ByteArrayOutputStreamdestBytes=newByteArrayOutputStream();
GZIPOutputStreamzip=newGZIPOutputStream(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("Content-Encoding","gzip");
//输出
OutputStreamout=resp.getOutputStream();
out.write(dest);
}
publicvoiddestroy(){
}
}
//第一步:
声明response的包装类
classMyResponse2extendsHttpServletResponseWrapper{
//将这个容器/a.txt,声明成员变量
privateByteArrayOutputStreamsrcByte;
privatePrintWriterout;
publicMyResponse2(HttpServletResponseresponse){
super(response);
}
//修改增强getWtier方法
@Override
publicPrintWritergetWriter()throwsIOException{
srcByte=newByteArrayOutputStream();
out=
newPrintWriter(
newOutputStreamWriter(srcByte,"UTF-8"));
returnout;
}
//提供一个方法获取原生的数据
publicbyte[]getSrc(){
if(out!
=null){
out.close();
}
returnsrcByte.toByteArray();
}
}
且它的配置如下:
zip2
cn.itcast.filter.GzipFilter2
zip2
*.jsp
4、同时实现对getoutputstream和getWtier压缩
思想:
在myrespons2这个类中,对getoutputstream也要覆盖。
返回一个Servle