JSP生成静态的HTML页面

转载 2015年07月09日 15:08:28

转载自:http://suntengjiao1.blog.163.com/blog/static/992110882012925111712224/

同时可以参考http://www.oschina.net/code/snippet_1862802_37160?p=4#comments这篇文章 特别是下面的评论 很精彩


整体思路:请求 jsp之后,  服务器会把 资源jsp  放入到 response.getOutputStream() 中。得到这个流信息,然后  生成 html或者shtml等文件 

什么是静态化?静态化就是将动态的jsp转换为静态的html; (如果直接修改response的输出位置行不行呢?不让它输出到HTTP 不输出到浏览器 而是直接将其修改为输出到硬盘上行不行呢?? 如果可以的话 那么此次请求 岂不是没有响应了??? 希望高手给点指示)

为什么要静态化?提高性能加快访问速度,静态化的页面html不需要访问数据库等操作所以要比动态的jsp快很多。
怎样实现静态化
实现静态化的方法很多,本文章要说明的是通过过滤器实现jsp的静态化。
1、我们先了解下jsp页面的请求流程

JSP的静态化 - 程序民工 - suntengjiao1的博客
 
通过上图我们可以知道servlet对象的响应是html,如果我们在servlet对象之后增加个拦截htm响应的功能将html响应保存到服务器,下次访问时直接返回这个静态页面,也就实现了静态化功能。
2、新的请求流程如下图
JSP的静态化 - 程序民工 - suntengjiao1的博客
 
 实现上图拦截servlet响应、判断是否已经静态化功能最好的方法就是拦截器filter。

3、具体实现包括,两个类一个配置,两个类分别是FileCaptureFilter(过滤器)和FileCaptureResponseWrapper(静态化)。
FileCaptureFilter(过滤器):负责判断是否已经静态化,调用FileCaptureResponseWrapper(静态化)实现静态化,加载静态化html生成html响应。
FileCaptureResponseWrapper(静态化):继承 HttpServletResponseWrapper,覆写PrintWriter getWriter()方法获得servlet响应内容,负责生成静态化的html、负责将响应返回给客户。
FileCaptureFilter 具体代码如下:
package cn.ce.sale.customer.filter;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.ce.framework.exception.api.NoLoginException;
import cn.ce.framework.security.api.LoginConstant;
import cn.ce.framework.security.api.LoginUser;

public class FileCaptureFilter implements Filter{

private String protDirPath;
private FilterConfig filterConfig;
@Override
public void destroy() {
// TODO Auto-generated method stub
}

@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain
chain) throws IOException, ServletException {
//
LoginUser loginUser = (LoginUser) ((HttpServletRequest)request).getSession().getAttribute(LoginConstant.USER);
        if (loginUser == null)
            throw new NoLoginException();
String fileName = "/forum/userId_"+loginUser.getUserId()+".html";
 File file = new File(filterConfig.getServletContext().getRealPath(fileName));
 // 判断缓存文件是否存在或者是否重新设置了缓存内容
if (!file.exists()) {// 如果缓存文件不存在
fileName=protDirPath+fileName;
FileCaptureResponseWrapper responseWrapper = new
FileCaptureResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, responseWrapper);
//得到的html 页面结果字符串
//String html = responseWrapper.toString();
// 写成html 文件
responseWrapper.writeFile(fileName);
// back to browser
responseWrapper.writeResponse();
}else{
// 转发至缓存文件
request.getRequestDispatcher(fileName).forward(request, response);

}
}

@Override
public void init(FilterConfig arg0) throws ServletException {
this.filterConfig=arg0;
protDirPath = arg0.getServletContext().getRealPath("/");
}
}

  FileCaptureResponseWrapper  具体代码如下:
package cn.ce.sale.customer.filter;

import java.io.CharArrayWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class FileCaptureResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter output;
private HttpServletResponse response;
public String toString()
{
return output.toString();
}
public FileCaptureResponseWrapper(HttpServletResponse response)
{
super(response);
this.response=response;
output =new CharArrayWriter();
}
//覆写getWriter()
public PrintWriter getWriter()
{
return new PrintWriter(output);
}
public void writeFile(String fileName)throws IOException
{
// FileWriter fw = new FileWriter(fileName,"utf-8");
// fw.write( output.toCharArray(),"utf-8" );
// PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileName),"utf-8"));
FileOutputStream fos=new FileOutputStream(fileName);
OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
osw.write(output.toCharArray());
osw.close();
}
public void writeResponse() throws IOException
{
PrintWriter out = response.getWriter();
// 重置响应输出的内容长度
response.setContentLength(-1);
out.print( output.toCharArray() );
out.flush();
out.close();
}
}

web.xml过滤器配置如下:
<filter>
<filter-name>FileCaptureFilter</filter-name>
<filter-class>
cn.ce.sale.customer.filter.FileCaptureFilter
</filter-class>
</filter>
    <filter-mapping>
<filter-name>FileCaptureFilter</filter-name>
<url-pattern>/order/customer/addCust/*</url-pattern>
</filter-mapping>

JSP 生成静态HTML页面

JSP 生成静态HTML页面
  • JavaAlpha
  • JavaAlpha
  • 2015年09月18日 13:02
  • 2358

动态jsp生成静态html网页

网站提高性能的方案有很多,网站架构方面考虑,最初的性能优化可以考虑提高单台服务器的配置。把数据库 和代码分别部署在两台服务器,页面缓存,数据缓存,静态化,分布式,代码读写分离,负载均衡。这些东西...
  • scyxm0426
  • scyxm0426
  • 2016年02月03日 17:07
  • 2564

Jsp生成静态的html文件

为了减轻服务器压力,将原来的文章管理系统由JSP文件的从数据库中取数据显示改为由jsp生成静态html文件后直接访问html文件。下面是一个简单的示例 1.buildhtml.jsptry{Strin...
  • Coolingverse
  • Coolingverse
  • 2006年06月26日 23:20
  • 1292

jsp生成静态的html文件

---转自互联网为了减轻服务器压力,提高网页被搜索引擎抓取的机会。将原来的文章管理系统由JSP文件的从数据库中取数据显示, 改为由jsp生成静态html文件后直接访问html文件。下面是一个简单的示例...
  • wongtw
  • wongtw
  • 2007年06月25日 21:46
  • 1136

jsp生成静态html页面

/** * 菜鸟研究一下生成静态页面,因为我是看着API来翻译的,所以如果有不对的话请指出来 * 参数requestPageUrl想要生成html的jsp文...
  • a673341766
  • a673341766
  • 2012年04月18日 17:08
  • 688

使用Spring计时器和velocity模板定时生成静态html/jsp文件

当一个页面不是经常需要更新的话,就需要为它定时生成一个静态文件,这样可以减轻服务器压力,相应的也减少了用户等待时间。 首先看一下一个主jsp文件: 新闻快讯 ...
  • gundumw100
  • gundumw100
  • 2017年04月10日 18:00
  • 304

jsp生成静态的hmtl文件

jsp生成静态的hmtl文件为了减轻服务器压力,将原来的文章管理系统由JSP文件的从数据库中取数据显示改为由jsp生成静态html文件后直接访问html文件。下面是一个简单的示例1.buildhtml...
  • pharaohsprince
  • pharaohsprince
  • 2007年01月17日 22:28
  • 806

JSP 静态生成html的原理

在性能上讲,即使将JSP或ACTION转换成HTML文件还是不如将某张JSP或某个ACTION缓存起来再作应响这种策略。但是,对大型的系统,JSP页面和ACTION可能成千上万,页每张JSP或每个AC...
  • a416090287
  • a416090287
  • 2015年09月24日 09:30
  • 1583

jsp通过include指令引入html乱码的解决方法

在jsp中使用导入html页面时,如果html页面里有中文,就会产生乱码。检查jsp文件和html文件的编码,编码一致,都是统一使用的utf-8,检查生成的Servlet类文件,发现里面直接就乱码了。...
  • gnail_oug
  • gnail_oug
  • 2016年06月18日 22:11
  • 15296

JSP页面和HTML页面的区别和功能

说明:  (1)HTML页面是静态页面,也就是事先由用户写好放在服务器上,由web服务器向客户端发送。  (2)JSP页面是有JSP容器执行该页面的Java代码部分然后实时生成的HTML页面,因而说是...
  • sleepbird
  • sleepbird
  • 2006年08月02日 11:50
  • 6251
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP生成静态的HTML页面
举报原因:
原因补充:

(最多只允许输入30个字)