JSP动态生成纯静态页面的原理

本文介绍了一种利用JSP动态生成纯静态HTML页面的方法,通过示例代码详细解释了其工作原理。此外还提供了一个使用模板文件批量生成静态页面的例子,有效减轻服务器压力。
JSP动态生成纯静态页面的原理

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

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpServletResponseWrapper;

public class toHtml extends HttpServlet 
{

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

String url=""; 
String name="";

ServletContext sc = getServletContext();

String file_name=request.getParameter("file_name");//你要访问的jsp文件,如index.jsp 
//则你访问这个servlet时加参数.如http://localhost/toHtml?file_name=index

url = "/"+file_name+".jsp";//这是你要生成HTML的jsp文件,如 
//http://localhost/index.jsp的执行结果.

name="/home/resin/resin-2.1.6/doc/"+file_name+".htm";//这是生成的html文件名,如index.htm.

RequestDispatcher rd = sc.getRequestDispatcher(url);

final ByteArrayOutputStream os = new ByteArrayOutputStream();

final ServletOutputStream stream = new ServletOutputStream() 

public void write(byte[] data, int offset, int length) 

os.write(data, offset, length); 
}

public void write(int b) throws IOException 

os.write(b); 

};

final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os));

HttpServletResponse rep = new HttpServletResponseWrapper(response) 

public ServletOutputStream getOutputStream() 

return stream; 
}

public PrintWriter getWriter() 

return pw; 

}; 
rd.include(request, rep); 
pw.flush(); 
FileOutputStream fos = new FileOutputStream(name); //把jsp输出的内容写到xxx.htm 
os.writeTo(fos); 
fos.close(); 
PrintWriter out=response.getWriter(); 
out.print("<p align=center><font size=3 color=red>首页已经成功生成!Andrew</font></p>"); 

}

以上的程序我写好是运行在unix环境下的,如果有朋友在windows下想要使用,一定要注意修改文件目录的表示方法,注意windows环境下的特殊字符.

为了减轻服务器压力,将原来的文章管理系统由JSP文件的从数据库中取数据显示改为由jsp生成静态html文件后直接访问html文件。 
首先应创建一个模板文件,文件名和文件后缀可以随意,但我一般常用的还是 *.template ,因此,这里就以 template.template 为例( 将模板文件放入 /WEB-INF/templates/ 文件夹下 ):

环境:JDK 1.5 +ECLIPSE +TOMCAT 5.0.28 + MYSQL 5.0

数据库TEST ,表名news 
字段: id    int 自动增长 , Title   varchar(20) , Content   varchar(200)   , Author   varchar(10)


template.template:

<html> 
<head> 
    <meta http-equiv = "Content-Type" content = "text/html; charset=gb2312" > 
    <title>#title#</title> 
</head> 
<body bgcolor = "#CCCCCC" > 
    <h3 align = "center" color = "#FFFFFF"> 
        <font color = "#FFFFFF" > 
            #title# 
            <br><hr><br> 
            author: 
        </font> 
        <font color = "red" >#author#</font> 
        <br> 
        <font color = "#FFFFFF" >content:</font> 
        <font color = "red" >#content#</font> 
        <br><hr><br> 
        <font color = "#FFFFFF" >Copy Right 2007 - 2008 &copy; Power by Easyworks.cn</font> 
    </h3> 
</body> 
</html>

由于只是介绍一下原理,所以就只用一个 JSP 页面来处理:

Test.jsp:

<%@ page language = "java" %> 
<%@ page import = "java.util.* , java.io.*" %> 
<%@ page contentType = "text/html; charset=gb2312" pageEncoding = "gb2312" %> 
<% 
    //设置字符编码 
    request.setCharacterEncoding( "gb2312" ); 
    response.setCharacterEncoding( "gb2312" );

    String title = "This is a title 标题"; 
    String author = "Easyoworks.cn 作者"; 
    String content = "This is the Content Area 正文"; 
    String filePath = ""; 
    // 获得模板文件的路径 
    filePath = request.getRealPath( "/" ) + "WEB-INF/templates/template.template"; 
    / 打印出路径 
    out.println( filePath ); // 注释

String templateContent = ""; 
    // 读取模板文件 
    FileInputStream fis = new FileInputStream( filePath ); 

    int length = fis.available(); 
    byte[] bytes = new byte[ length ]; 
    fis.read( bytes ); 
    fis.close(); 
    templateContent = new String( bytes ); 
    // 打印出模板内容 
    out.println( "以下是模板内容:<br>" + templateContent + "<br>以下是置换以后的 html 内容<br>" ); // 注释 
    templateContent = templateContent.replaceAll( "#title#" , title ); 
    templateContent = templateContent.replaceAll( "#author#" , author ); 
    templateContent = templateContent.replaceAll( "#content#" , content ); 
    // 根据时间得出文件名 
    Calendar cld = Calendar.getInstance(); 
    String fileName = String.valueOf( cld.getTimeInMillis() ) + ".html";

    // 生成的 html 文件保存路径 
    fileName = request.getRealPath( "/" ) + fileName; 
    out.println( templateContent ); // 注释 
    // 建立文件输出流 
    FileOutputStream fos = new FileOutputStream( fileName ); 
    byte[] tag_bytes = templateContent.getBytes(); 
    fos.write( tag_bytes ); 
    fos.close(); 
%>

为了将应用进行国际化,可以将页面的编码设为 UTF-8 ,然后设置页面的编码转换就可以了,当然,想我这种喜欢偷懒的也可以加一个 Filer ,最简单不过的了。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值