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

通过上图我们可以知道servlet对象的响应是html,如果我们在servlet对象之后增加个拦截htm响应的功能将html响应保存到服务器,下次访问时直接返回这个静态页面,也就实现了静态化功能。
2、新的请求流程如下图:

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("/");
}
}
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标签是JSP的一大特色,它们简化了动态内容的创建,例如`<jsp:include>`用于包含其他页面,`<jsp:useBean>`用于实例化JavaBean,`<jsp:setProperty>`设置JavaBean的属性,而`<jsp:getProperty>`用于获取属性值。...
【JBuilder2005实战JSP】是一个关于如何使用...它支持JSP标签的可视化设计和动态代码的智能提示,使得开发者能够高效地构建交互式的Web应用程序。通过学习和实践,开发者可以充分利用JBuilder的功能,提升JSP开发效率。
Struts-menu是一个在Java Web开发中用于生成动态菜单的开源组件,主要应用于基于Struts框架的应用程序。...对于想要深入研究的开发者,还可以探索Struts-menu的更多高级特性,如动态加载菜单、国际化支持等。
1. Tomcat:对于Java Web应用,Tomcat是一个轻量级、开源的应用服务器,支持Servlet和JSP。它简单易用,适合小型项目,也可以通过集群技术应对大流量。 2. Jetty:另一款轻量级Java应用服务器,Jetty具有快速、...
4. JSP:JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术。从这一点来看,非常类似Microsoft ASP、PHP等技术。 5. Web配置文件:Web配置文件中可以配置Servlet的名称、类名、映射的URL ...
在【压缩包子文件的文件名称列表】中提到的"java+Web审批流程(转载)"可能是项目的源代码文件、文档或者部署指南。这些文件可能包含以下部分: 1. **源代码**:包括Java源文件(.java),可能分布在不同的包结构下...
状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换. 设计模式之 Memento(注释状态?) 很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对...