过滤器为JSP文件生成静态页面

用过滤器为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时,运行图:

时间: 2024-12-24 10:19:05

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

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

1.服务器会根据文件的后缀名去进行解析,如果是HTML文件则服务器不会进行语法解析,而是直接输出到浏览器. 2.如果一个页面中全部都是HTML代码而没有需要解析的PHP语法,则没有必要保存为PHP文件,这样反而会降低运行效率. 3.如果是需要PHP控制HTML代码的输出,比如需要PHP判断用户是否登陆,如果登陆则输出A,未登录则输出B.这就需要PHP来进行控制了.HTML不能实现这样的功能 PHP生成静态页面教程 ,一些基本的概念 一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可

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

1.server会依据文件的后缀名去进行解析,假设是HTML文件则server不会进行语法解析.而是直接输出到浏览器. 2.假设一个页面中所有都是HTML代码而没有须要解析的PHP语法,则没有必要保存为PHP文件,这样反而会减少执行效率. 3.假设是须要PHP控制HTML代码的输出,比方须要PHP推断用户是否登陆,假设登陆则输出A,未登录则输出B.这就须要PHP来进行控制了.HTML不能实现这种功能 PHP生成静态页面教程 ,一些主要的概念 一,PHP脚本与动态页面. PHP脚本是一种serve

动态Jsp文件生成对应Html文件

1.在 index.jsp文件中,加入一条超链接,用来访问将 Jsp 转换成Html的servlet <a href="servlet/GeneraticServlet">把template文件夹下的jsp都生成静态html文件</a> 2. 在项目根目录下新建一个template文件夹,将要转换成静态html的 jsp页面放入,我新建的的文件为MyJsp1.jsp, MyJsp2.jsp, MyJsp3.jsp, 内容类似 <body> 这是第&l

freemark生成静态页面

到freemark的官方网站下载: http://sourceforge.net/projects/freemarker/files/freemarker/2.3.20/freemarker-2.3.20.tar.gz/download 建一个web project,如下: 建成的项目结构如下: 模板文件如下(test.ftl): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html

Java项目生成静态页面

第一次做项目需要生成静态页面,网上很多大牛对将网页生成静态页面有很多异议.说一下我的看法. 不外乎有以下因素: 1.从页面加载时间来看:静态页面不需要与数据库建立连接,尤其是访问数据量较大的页面,这种页面大多要查很多结果集,因此建立连接次数就增多了,时间不可观,而静态页面则省去了这些时间. 2.从便于搜索引擎抓取的角度来讲:搜索引擎更喜欢静态的网页,静态网页与动态网页相比,搜索引擎更喜欢静的,更便于抓取,搜索引擎SEO排名更容易提高,一些大门户站页面大多都采用静态或伪静态网页来显示,更便于搜索引

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

HoverTree开源项目中HoverTreeWeb.HVTPanel的Index.aspx文件 是后台管理的首页. 包含生成留言板首页,以及显示用户名,退出等功能. 根据网址生成页面的方法: bool CreateHtmlFile(string url, string path) { //http://keleyi.com/a/bjae/3d10wfax.htm string m_content = Utils.GetHtmlByUrl(Utils.GetAbsolutePath() + ur

html模板生成静态页面及模板分页处理

它只让你修改页面的某一部分,当然这“某一部分”是由你来确定的.美工先做好一个页面,然后我们把这个页面当作模板(要注意的是这个模板就没必要使用EditRegion3这样的代码了,这种代码是Dreamwerver为了方便自己设计而弄的标识),把这个模板中我们需要改变的地方用一个与HTML可以区分的字符代替,如“{title}”.“[title]”.在生成静态页面的时候只需要把数据和这些字符串替换即可.这就是模板的含义了. 新建一个php页面和一个html页面[模板页];注:如果是从数据库调用数据,则

PHP生成静态页面的方法

在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化,今天就以PHP实例教程形式讨论PHP生成静态页面的方法...."><LINKhref="http://www.php100.com//statics/st 在PHP网站开发中为了网站推广和SEO等需要,需要对网站进行全站或局部静态化处理,PHP生成静态HTML页面有多种方法,比如利用PHP模板.缓存等实现页面静态化

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

一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合, 也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 -----> 由服务器指定的PHP解析器对 脚本进行解析形成HTML语言形式 ----> 将解析后的HTML语句以包的方式传回给浏览器.由此不难看出,在页面发送到浏览器后,P