动态页面静态化:javaEE原生API+装饰者模式实现

先来看看装饰者模式

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

特点

(1) 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。
(2) 装饰对象包含一个真实对象的引用(reference)
(3) 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
(4) 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。

适用性

以下情况使用装饰模式

  1. 需要扩展一个类的功能,或给一个类添加附加职责。
  2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
  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               $
//                  '$               $
//                   $               $
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值