先来看看装饰者模式
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
特点
(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
适用性
以下情况使用装饰模式
- 需要扩展一个类的功能,或给一个类添加附加职责。
- 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
- 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
优点
1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
页面静态化的优势
页面静态化,其实就是将动态生成的jsp页面,变成静态的HTML页面,让用户直接访问。有一下几方面好处:
1,首先就是访问速度,不需要去访问数据库,或者缓存来获取哪些数据,浏览器直接加载渲染html页即可。所以可以大大的提高访问效率;
2,从网站优化来分析,搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高。
3,从安全角度讲,静态网页不宜遭到黑客攻击,如果黑客不知道你网站的后台、网站采用程序、数据库的地址,静态网页, 更不容易受到黑客的攻击。
4,从网站稳定性来讲,如果程序、数据库出了问题,会直接影响网站的访问,而静态网页就避免了如此情况,不会因为程序等,而损失网站数据,影响正常打开,损失用户体验,影响网站信任度。
实现原理
在javaweb中,JSP在首次执行的时候会被服务器解析成,java文件再被编译成.class文件然后才会被执行,其实JSP就是一个servlet。在执行的时候该servlet使用输出流向客户端输出HTML格式的字符串。我们要做的就是把向浏览器输出的字符串输出到一个HTML文件中,再经由一个过滤器去过滤请求,直接重定向到已经生成的静态文件。
以下为代码:给出装饰类实现与过滤器实现
import java.io.File;
import java.io.IOException;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 过滤器用于过滤动态请求并判断该请求所需静态文件是否生成
*
* @author Administrator
*
*/
@WebFilter("/DongTaiYeMianJingTaiHua")
public class DongTaiYeMianJingTaiHuaFilter implements Filter {
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;// 强转为与http协议相关的响应对象
HttpServletRequest req = (HttpServletRequest) request;// 强转为与http协议相关的请求对象
String realPath = request.getRealPath("/dtymjth/html");// 获取文件目录
String filename = "list.html";// 确定文件名
File file = new File(realPath, filename);// 创建文件对象
if (file.exists()) {// 判断文件是否存在
// 存在则直接重定向到该静态文件
res.sendRedirect(req.getContextPath() + "/dtymjth/html/list.html");
// 方法结束
return;
}
// 以下为不存在情况
// 首先创建response的装饰类
ZhuangShiResponse zsres = new ZhuangShiResponse(res, file.getAbsolutePath());
// 放行让servlet请求数据库创建静态文件
chain.doFilter(request, zsres);
// 重定向到静态文件
zsres.sendRedirect(req.getContextPath() + "/dtymjth/html/list.html");
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
}
}
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 自己的装饰类继承javax.servlet.http.HttpServletResponseWrapper这个类
* 只需要重写需要装饰的方法
*
* @author Administrator
*
*/
public class ZhuangShiResponse extends HttpServletResponseWrapper {
private PrintWriter wt;//自定义的输出流用来输出到文件
/**
* 构造器
* @param response 被装饰的类
* @param path 传入一个路径,创建输出流用
*/
public ZhuangShiResponse(HttpServletResponse response, String path) {
super(response);
// TODO Auto-generated constructor stub
try {
PrintWriter wt = new PrintWriter(path);//创建输出流。将HTML输出到文件
this.wt = wt;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 重写获取方法 获取的是装饰后的输出流
*/
@Override
public PrintWriter getWriter() throws IOException {
// TODO Auto-generated method stub
System.out.println("调用装饰类的方法");
return wt;
}
}
神兽保佑n(≧▽≦)n
// d*##$.
// zP"""""$e. $" $o
//4$ '$ $" $
//'$ '$ J$ $F
// 'b $k $> $
// $k $r J$ d$
// '$ $ $" $~
// '$ "$ '$E $
// $ $L $" $F ...
// $. 4B $ $$$*"""*b
// '$ $. $$ $$ $F
// "$ R$ $F $" $
// $k ?$ u* dF .$
// ^$. $$" z$ u$$$$e
// #$b $E.dW@e$" ?$
// #$ .o$$# d$$$$c ?F
// $ .d$$#" . zo$> #$r .uF
// $L .u$*" $&$$$k .$$d$$F
// $$" ""^"$$$P"$P9$
// JP .o$$$$u:$P $$
// $ ..ue$" "" $"
// d$ $F $
// $$ ....udE 4B
// #$ """"` $r @$
// ^$L '$ $F
// RN 4N $
// *$b d$
// $$k $F
// $$b $F
// $"" $F
// '$ $
// $L $
// '$ $
// $ $