用过滤器为JSP文件生成静态页面,这只是一个简单的实例,客户端浏览器第一次请求JSP页面时,服务器将生成对应的HTML文件,以后访问同一JSP文件,将转为访问生成的HTML文件。
一、过滤器

package com.kenfor.lyb.toHtmlfilter;
import java.io.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.*;
public class JspFilter implements Filter { Logger logger = Logger.getLogger(this.getClass()); protected FilterConfig config;
public void init(FilterConfig config)
throws ServletException
{
// Save the config object
this.config = config;
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest) request;
HttpServletResponse hresp = (HttpServletResponse) response;
String name = hreq.getRequestURL().substring(hreq.getRequestURL().lastIndexOf("/") + 1,
hreq.getRequestURL().lastIndexOf("."));
//logger.info("fileName="+name);
String str_uri = hreq.getRequestURI();
//logger.info("str_uri="+str_uri);
String htmpath=hreq.getSession().getServletContext().getRealPath(
"/")
+ "HTML\\"
+ str_uri.substring(0, str_uri.lastIndexOf("/"))
//+"/"+time
+ "/" + name + ".html";
File file = new File(htmpath);
//logger.info("file="+file);
String to=hreq.getContextPath() + "/HTML"
+ str_uri.substring(0, str_uri.lastIndexOf("/"))
+"/"+ name + ".html";
//logger.info(to); if (!file.exists()&&hreq.getRequestURL().indexOf(".jsp")> 0) {
ServletResponse newResponse =new CharResponseWrapper(hresp);
chain.doFilter(request, newResponse);
String text = newResponse.toString();
if (text != null)
{
PrintWriter pw=new PrintWriter(htmpath);
pw.println(text);
pw.close();
hresp.sendRedirect(to);
}
} else { hresp.sendRedirect(to);
} } }

二、响应包装器

package com.kenfor.lyb.toHtmlfilter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
/**
* Simple response wrapper that utilizes a local CharArrayWriter
* for output
*/
public class CharResponseWrapper
extends HttpServletResponseWrapper
{
protected CharArrayWriter charWriter;
protected PrintWriter writer;
protected boolean getOutputStreamCalled;
protected boolean getWriterCalled;
public CharResponseWrapper(HttpServletResponse response)
{
super(response);
// Create the writer
charWriter = new CharArrayWriter();
}
public ServletOutputStream getOutputStream()
throws IOException
{
// Can't call getOutputStream if getWriter
// has already been called
if (getWriterCalled)
{
throw new IllegalStateException(
"getWriter already called");
}
getOutputStreamCalled = true;
return super.getOutputStream();
}
public PrintWriter getWriter()
throws IOException
{
if (writer != null)
{
return writer;
}
// Can't call getWriter if getOutputStream
// has already been called
if (getOutputStreamCalled)
{
throw new IllegalStateException(
"getOutputStream already called");
}
getWriterCalled = true;
writer = new PrintWriter(charWriter);
return writer;
}
public String toString()
{
String s = null;
// Only return a String if the writer was
// used.
if (writer != null)
{
s = charWriter.toString();
}
return s;
}
public char[] toCharArray(){//将响应数据以字符数组返回
return(charWriter.toCharArray());
} }

三、web.xml文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>

<filter>
  <filter-name>jspfilter</filter-name>
  <filter-class>com.kenfor.lyb.toHtmlfilter.JspFilter</filter-class>
</filter>

<filter-mapping> 
  <filter-name>jspfilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
</filter-mapping>

<servlet> 
  <servlet-name>log4j-init</servlet-name> 
  <servlet-class>example.Log4jInit</servlet-class> 
  <init-param> 
   <param-name>log4j</param-name> 
   <param-value>WEB-INF/log4j.properties</param-value> 
  </init-param> 
 <load-on-startup>1</load-on-startup> 
</servlet> 
</web-app>

测试文件:tohtml.jsp

<%@ page contentType="text/html; charset=gb2312" %>
<%
String name = request.getRequestURL().substring(request.getRequestURL().lastIndexOf("/") + 1,
request.getRequestURL().lastIndexOf("."));
String cox=request.getContextPath();

String str_uri = request.getRequestURI();
out.println(request.getRequestURL()+"<br>");
out.println(name+"<br>");
out.println(str_uri+"<br>");
out.println(cox+"<br>");
out.println(request.getParameter("type")); 
%>

第二次请求tohtml.jsp时,运行图:

过滤器为JSP文件生成静态页面的更多相关文章

  1. PHP代码为什么不能直接保存HTML文件——&gt;PHP生成静态页面教程

    1.server会依据文件的后缀名去进行解析,假设是HTML文件则server不会进行语法解析.而是直接输出到浏览器. 2.假设一个页面中所有都是HTML代码而没有须要解析的PHP语法,则没有必要保存 ...

  2. PHP代码为什么不能直接保存HTML文件——>PHP生成静态页面教程

    1.服务器会根据文件的后缀名去进行解析,如果是HTML文件则服务器不会进行语法解析,而是直接输出到浏览器. 2.如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件 ...

  3. Java项目生成静态页面

    第一次做项目需要生成静态页面,网上很多大牛对将网页生成静态页面有很多异议.说一下我的看法. 不外乎有以下因素: 1.从页面加载时间来看:静态页面不需要与数据库建立连接,尤其是访问数据量较大的页面,这种 ...

  4. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  5. .NET生成静态页面并分页

    因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序. 主要的原理就是替换模板里的特殊字符. 1.静态 ...

  6. .net 生成 静态页面

    .net 生成 静态页面 <!--Main.Aspx--> <%@ page language="C#" %> <%@ import namespac ...

  7. C#根据网址生成静态页面

    HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: boo ...

  8. 用 Smarty 生成静态页面入门介绍

    why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...

  9. 比较详细PHP生成静态页面教程

    一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客 ...

随机推荐

  1. Java Web 之HttpServletRequest对象初识

    通过request对象获得请求行 获得客户端请求方式:String getMethod(); 获得请求的资源: String getRequestURL(); String getQueryStrin ...

  2. Oracle 行转列(pivot、wm_concat、decode)使用总结

    CREATE TABLE CC (Student NVARCHAR2(2),Course NVARCHAR2(2),Score INT ); INSERT into CC select N'张三',N ...

  3. 423 Locked

    TortoiseSVN提交提示423 Locked的解决办法 . 此办法是阅读官方文档(TortoiseSVN-1.6.16-zh_CN.pdf) 4.21 锁部分提供的办法: 首先选择选择要提交的文 ...

  4. Delphi Win API 函数 MulDiv

    Delphi Win API 函数 MulDiv 原型:function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; st ...

  5. CSS text-indent 属性

    text-indent 属性首行文本缩进,有点像padding-left的效果.

  6. 报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

    n = int(input("请输入人数:")) list_p = list(range(1,n+1)) #将所有人放在一个数字里面 count = 0 #设置一个变量,用户计算报 ...

  7. php strtolower()函数 语法

    php strtolower()函数 语法 作用:把所有字符转换为小写.大理石量具 语法:strtolower(string) 参数: 参数 描述 string 必须,规定要转换的字符串 说明:str ...

  8. Codeforces 814C - An impassioned circulation of affection

    原题链接:http://codeforces.com/contest/814/problem/C 题意:有长度为n的一个字符串,q个询问,每个询问由数字m和字符c组成,问最多在字符串中替换m个字符,使 ...

  9. Agri-Net —poj1258

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44670   Accepted: 18268 Descri ...

  10. url 上回调函数(JSONP原理)

    1.JSONP原理:就是跨域的 js程序(get请求对应url,获取到文本数据,在script标签中,就是按照 js 程序执行,)执行时  调用  当前程序中写好的函数,并且把跨域的数据(即参数),传 ...