admin 管理员组文章数量: 887021
2024年1月12日发(作者:数数的数能组什么词?)
JSP生成静态HTML页面的几种方法
2008年04月12日 星期六 09:26
一、从数据库中取相应数据并替换掉模板中的对应标签,下面是一个简单的示例
<%@ page contentType="text/html; charset=gb2312"
import=".*,.*"%>
<%
try{
String title="This is Title";
String content="This is Content Area";
String editer="LaoMao";
String filePath = "";
filePath = lPath("/")+"test/";
//(filePath+"
");
String templateContent="";
FileInputStream fileinputstream = new FileInputStream(filePath);//读取模块文件
int lenght = ble();
byte bytes[] = new byte[lenght];
(bytes);
();
templateContent = new String(bytes);
//(templateContent);
templateContent=eAll("###title###",title);
templateContent=eAll("###content###",content);
templateContent=eAll("###author###",editer);//替换掉模块中相应的地方
//(templateContent);
// 根据时间得文件名
Calendar calendar = tance();
String fileame = f(eInMillis()) +".html";
fileame = lPath("/")+fileame;//生成的html文件保存路径
FileOutputStream fileoutputstream = new FileOutputStream(fileame);//建立文件输出流
byte tag_bytes[] = es();
(tag_bytes);
();
}
catch(Exception e){
(ng());
}
%>
2.
###title### |
author:###author### |
###content### |
=======================================================
二、从动态页的URL获取相应页面内容并写入到文件
/*
* Created on 2006-3-4
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package ;
import edReader;
import ;
import tputStream;
import tream;
import treamReader;
import riter;
import LConnection;
import ;
import ;
/**
* @author Administrator
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class MakeHtml {
private static long star = 0;
private static long end = 0;
private static long ttime = 0;
//返回html代码
public static String getHtmlCode(String httpUrl){
Date before = new Date();
star = e();
String htmlCode = "";
try {
InputStream in;
URL url = new (httpUrl);
HttpURLConnection connection =
(HttpURLConnection)nnection();
connection = (HttpURLConnection) nnection();
uestProperty("User-Agent","Mozilla/4.0");
t();
in = utStream();
edReader breader = new BufferedReader(new
InputStreamReader(in , "GBK"));
String currentLine;
while((currentLine=ne())!=null){
htmlCode+=currentLine;
}
} catch (Exception e) {
tackTrace();
}finally{
Date after = new Date();
end = e();
ttime = end-star ;
n("执行时间:"+ttime +"秒");
}
return htmlCode;
}
//存储文件
public static synchronized void writeHtml(String
filePath,String info,String flag) {
PrintWriter pw = null;
try {
File writeFile = new File(filePath);
boolean isExit = ();
if (isExit != true) {
NewFile();
} else {
if (!("NO")) {
();
NewFile();
}
}
pw = new PrintWriter(new FileOutputStream(filePath, true));
n(info);
();
} catch (Exception ex) {
n(sage());
}finally{
();
}
}
public static void main(String[] args) {
String url = "/";
writeHtml("c:/",getHtmlCode(url),"NO");
}
}
三、利用Filter和定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。
import .*;
import t.*;
import .*;
import ar;
public class CacheFilter implements Filter {
ServletContext sc;
FilterConfig fc;
long cacheTimeout = _VALUE;
public void doFilter(ServletRequest req,
ServletResponse res,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request =
(HttpServletRequest) req;
HttpServletResponse response =
(HttpServletResponse) res;
// check if was a resource that shouldn't be cached.
String r = lPath("");
String path =
tParameter(uestURI());
if (path!= null && ("nocache")) {
er(request, response);
return;
}
path = r+path;
String id = uestURI() +
ryString();
File tempDir = (File)ribute(
"r");
// get possible cache
String temp = olutePath();
File file = new File(temp+id);
// get current resource
if (path == null) {
path = lPath(uestURI());
}
File current = new File(path);
try {
long now =
tance().getTimeInMillis();
//set timestamp check
if (!() || (() &&
dified() > dified()) ||
cacheTimeout < now - dified()) {
String name = olutePath();
name =
ing(0,dexOf("/"));
new File(name).mkdirs();
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
CacheResponseWrapper wrappedResponse =
new CacheResponseWrapper(response, baos);
er(req, wrappedResponse);
FileOutputStream fos = new FileOutputStream(file);
(Array());
();
();
}
} catch (ServletException e) {
if (!()) {
throw new ServletException(e);
}
}
catch (IOException e) {
if (!()) {
throw e;
}
}
FileInputStream fis = new FileInputStream(file);
String mt = eType(uestURI());
tentType(mt);
ServletOutputStream sos = putStream();
for (int i = (); i!= -1; i = ()) {
((byte)i);
}
}
public void init(FilterConfig filterConfig) {
= filterConfig;
String ct =
tParameter("cacheTimeout");
if (ct != null) {
cacheTimeout = 60*1000*ong(ct);
}
= vletContext();
}
public void destroy() {
= null;
= null;
}
}
参考文章:
使用Filter实现静态HTML缓冲(一种折中方法)
缓冲是Web应用中必须考虑的一个提高性能的重要手段。对于基于JSP/Servlet技术的站点,常用的缓冲有持久层的数据库连接池缓冲,内存中的值对象缓冲,JSP页面缓冲,以及各种各样的缓冲框架等等,无不是为了提高系统的吞吐量。
然而对于大型站点来说,将JSP页面转换为静态Html也许是最高效的方法,特别适合于数据不经常变化但是页面访问量特别大的站点,如新闻等,通过把JSP动态页面预先转换为静态Html页面,当用户请求此页面时,系统自动导向到对应的Html页面,从而避免解析JSP请求,调用后台逻辑以及访问数据库等操作所带来的巨大开销。
如何将一个已有的JSP站点的动态JSP页面转化为静态Html呢?我们希望在不用更改现有Servlet,JSP的前提下让系统自动将这些JSP转换为Html页。幸运的是,Filter为我们提供了一种实现方案。
Filter是Servlet 2.2规范中最激动人心的特性。Filter能过滤特定URL如/admin/*并进行必要的预处理,如修改Request和Response,从而实现定制的输入输出。更强大的是,Filter本身是一个责任链模式,它能一个接一个地传递下去,从而将实现不同功能的Filter串起来,并且可以动态组合。
要自动生成静态页面,用Filter截获jsp请求并先进行预处理,自动生成Html,是个不错的主意。一个很容易想到的方法是在Filter截获Request后,导向一个Servlet,在这个Servlet中向本机发送一个http请求,然后将响应写入一个文件:
URLConnection urlConn = (localhost/req);
注意要避免递归。
另一个方法是不模拟http,而是定制Response,把服务器返回的JSP响应输出到我们自己的Response中,就可以将响应快速写入Html文件,然后再发送给客户。而且,由于没有http模拟请求,直接读取服务器响应速度非常快。
截获Response的关键便是实现一个WrappedResponse,让服务器将响应写入我们的WrappedResponse中。这类似于一个代理模式,Servlet 2.x已经提供了一个WrappedResponse类,我们只需要复写其中的一些关键方法即可。
WrappedResponse实现了Response接口,它需要一个Response作为构造函数的
参数,事实上这正是代理模式的应用:WrappedResponse充当了代理角色,它会将JSP/Servlet容器的某些方法调用进行预处理,我们需要实现自己的方法。
综上:用Filter实现HTML缓冲的步骤是:
1. 用Filter截获请求,如/?id=123,映射到对应的html文件名为/html/$id=。
2. 查找是否有/html/$id=,如果有,直接forward到此html,结束。
3. 如果没有,实现一个WrappedResponse,然后调用filterChain(request,
wrappedResponse)。
4. 将返回的WrappedResponse写入文件/html/$id=,然后返回响应给用户。
5. 下一次用户发送相同的请求时,到第2步就结束了。
使用这个方法的好处是不用更改现有的Servlet,JSP页,限制是,JSP页面结果不能与Session相关,需要登陆或用户定制的页面不能用这种方法缓冲。
版权声明:本文标题:JSP生成静态HTML页面的几种方法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1705023916h470131.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论