JavaWeb 过滤器应用之页面静态化
- 页面静态化是把servlet请求的资源所做输出保存到html中, 然后重定向到 html 页面,
二次访问时,这个html已经存在,那么直接重定向,不用再去访问servlet!
// StaticFilter
public class StaticFilter implements Filter{
private FilterConfig config;
public void destory(){}
public void init(FilterConfig fConfig) throws ServletException{
this.config = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException{
/*
* 思路:
* 1. 第一次访问时,查找请求对应的html页面是否存在,如果存在,则重定向到html;
* 2. 如果不存在,放行! 把 servlet 访问数据库后,输出给客户端的数据保存到一个
* html文件中, 在重定向到html
*
* 获取 Category 参数!
* Category有四种可能:
* null 对应 null.html
* 1 对应 1.html
* 2 对应 2.html
* 3 对应 3.html
*
* html 页面的保存路径: htmls 目录下
*/
// 判断对应的 html 文件是否存在, 如果存在,直接重定向!
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String category = request.getParameter("category");
// 获取对应的文件名
String htmlPage = category + ".html";
//得到文件的存放目录
String htmlPath = config.getServletContext().getRealPath("/htmls");
// 创建文件
File destFile = new File(htmlPath,htmlPage);
// 如果该文件存在
if(destFile.exists()){
response.sendRedirect(request.getContextPath()+"/htmls/"+htmlPage);
return;
}
/*
* 如果该文件不存在, 生成html
* 首先放行, show.jsp 会做出很多的输出, 我们要让它不再输出给客户端, 而是输出给我们指定
* 的一个 html 文件中
*
* 调包 response, 让它的 getWriter() 与一个html 文件绑定, 那么 show.jsp 的输出就到了
* html 文件中
*/
StaticResponse sr = new StaticResponse(resp,destFile.getAbsolutePath());
// 放行, 即生成了html 文件
chain.doFilter(request,sr);
// 这时,页面已经存在, 重定向到html文件
res.sendRedirect(req.getContextPath()+"/htmls/"+htmlPage);
}
}
// response 的装饰类, StaticResponse.java
public class StaticResponse extends HttpServletResponseWrapper {
private HttpServletResponse response;
private PrintWriter pw;
// 参数 path, 表示 html 文件的路径
public StaticResponse(HttpServletResponse response, String path)
throws FileNotFoundException {
super(response);
this.response = response;
// 创建一个与html文件路径绑定在一起的流对象
pw = new PrintWriter(path, "utf-8");
}
// 增强的方法
public PrintWriter getWriter(){
// 返回一个与html绑定在一起的 printWriter 对象
// jsp 会使用它进行输出, 这样数据都输出到 html 文件中
return pw;
}
}
参考资料:
JavaWeb 过滤器应用之页面静态化的更多相关文章
- JavaWeb笔记——利用过滤器实现页面静态化
1.说明 页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面. * 核心思路为拦截请求,实现请求转发指向静态页面 ...
- JavaWeb页面静态化之使用freemarker模板生成一个html静态页面
题外话: 页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术 从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...
- MVC页面静态化
MVC 页面静态化 最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc ...
- MVC 页面静态化
最近工作需要,实现页面静态化,以前在ASP时代,都是FSO自己手动生成的. 新时代,MVC了,当然也要新技术,网上一搜,找到一种解决方案,是基于MVC3的,实现原理是通过mvc提供的过滤器扩展点实现页 ...
- 利用ResultFilter实现asp.net mvc 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- ASP.NET MVC中,动态处理页面静态化
首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...
- ASP.NET MVC中,动态处理页面静态化 【转载】
首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...
- 利用ResultFilter实现asp.net mvc3 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- freemark 页面静态化
1. 页面静态化是什么? 页面静态化有非常多含义,在WEB开发中.静态网页一般理解为站点中大部分超级链接所引用的页面是单独的HTML静态页面文件(如.htm..html等页面文件,html语言本身是静 ...
随机推荐
- (六)Oracle学习笔记—— 约束
1. 约束介绍 表虽然建立完成了,但是表中的数据是否合法并不能有所检查,而如果要想针对于表中的数据做一些过滤的话,则可以通过约束完成,约束的主要功能是保证表中的数据合法性. 按照约束的分类,一共有五种 ...
- nginx频率限制
nginx官方版本限制IP的连接和并发分别有两个模块: HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制. ...
- 改变Fragment的默认动画
FragmentTransaction ft = getFragmentManager().beginTransaction(); //设置进入退出动画 ft.setCustomAnimations( ...
- Docker 方式运行 jenkins
原文地址:https://testerhome.com/topics/5798 简介说明 docker 是官方推荐的一种 jenkins 启动方式. 打开 jenkins 的官网,点击进入的是: ht ...
- vue 跨域:使用vue-cli 配置 proxyTable 实现跨域问题
路径在/config/index.js 中,找到dev.proxyTable.如下配置示例: proxyTable: { '/api': { // 我要请求的地址 target: 'http://oa ...
- ORA-1092 : opitsk aborting process---killed by oom killer
oracle version:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production os versi ...
- C语言基础(18)-内存
一.内存布局 1.1 代码区 代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段.代码区是可读不可写的. 代码区中的所有的内容在程序加载到内存的时候就确定了,运 ...
- mysql workbench 将查询结果导出 sql 文件
之前一直使用的是plsql,因为换了家公司所以改成mysql了,我使用的时候mysql免费的客户端工具 workbench, 因为之前没用过,所以有很多功能找不到. 这里将用到的功能记录一下: 1:将 ...
- Java时间类总结
java.util.Date 包含有年月日时分秒,精确到毫秒级别. 官方解释: // The class Date represents a specific instant in time, wit ...
- HTML5 Canvas绘图详解 drawImage() 方法 有图有真相!
步骤 1 2 3 4 5 简介 是一个新的HTML元素,这个元素可以被Script语言(通常是JavaScript)用来绘制图形.例如可以用它来画图.合成图象.或做简单的(和不那么简单的)动画. ...