关闭

JSP生成静态的HTML页面

551人阅读 评论(0) 收藏 举报
分类:

转载自: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>
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:174788次
    • 积分:2725
    • 等级:
    • 排名:第13691名
    • 原创:91篇
    • 转载:103篇
    • 译文:0篇
    • 评论:6条
    最新评论