jsp实现将动态网页转换成静态页面的方法
本文实例讲述了jsp实现将动态网页转换成静态页面的方法。分享给大家供大家参考。具体如下:
如果我可以将jsp动态网页转换成静态页面,那么访问的时候就不需要频繁的访问数据库了。
jsp显示内容缓存技巧
前段时间做自己社区的论坛,在jive的基础上做一个页面显示所有论坛的帖子,可以称之为总版,模仿forum类的接口做个superforum并且实现cachable,不过因为这个页面刷新量比较大,虽然被cache了,我还是想办法进行页面的缓存,感觉用jsp产生的html静态内容当缓存,页面访问速度应该有所提高。
首先想到的一种办法,是采用java.net的urlconnection把服务器上的jsp抓过来做缓存,不过我觉得这样做太见外了,自己服务器上的东西,为何要用http去访问.于是想另外一个办法,把jsp的out对象的输出控制到自己希望的地方.比如输出到静态文件,又或者保存成全局的字符串变量.这样的话,浏览就不需要执行jsp,只是浏览该html了.仅仅在数据有更新的时候进行一次update操作,把jsp重新输出为html.
我觉得,浏览事件比数据插入或更新发生的次数多的时候.不妨试试这个办法来提高页面访问速度.
整件事情有点像把jsp当作模板,生成静态的html页面.
将如下代码写入web-xml:
<filter> <filter-name>filecapturefilter</filter-name> <filter-class>com.junjing.filter.filecapturefilter</filter-class> </filter> <filter-mapping> <filter-name>filecapturefilter</filter-name> <url-pattern>/latest.jsp</url-pattern> </filter-mapping>
latest.jsp是我要cache的页面
java源码代码如下:
/***startfilefilecapturefilter.java*/
packagecom.junjing.filter;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
publicclassfilecapturefilterimplementsfilter
{
privatestringprotdirpath;
publicvoidinit(filterconfigfilterconfig)
throwsservletexception
{
protdirpath=filterconfig.getservletcontext().getrealpath("/");
}
publicvoiddofilter(servletrequestrequest,servletresponseresponse,filterchain
chain)
throwsioexception,servletexception
{
stringfilename=protdirpath+"forum/lastest.html";
printwriterout=response.getwriter();
filecaptureresponsewrapperresponsewrapper=new
filecaptureresponsewrapper((httpservletresponse)response);
chain.dofilter(request,responsewrapper);
//fillresponsewrapperup
stringhtml=responsewrapper.tostring();
//得到的html页面结果字符串
//responsewrapper.writefile(filename);
//dumpthecontents写成html文件,也可以保存在内存
//responsewrapper.writeresponse(out);
//backtobrowser
//responsewrapper.sendredirect("lastestthread.jsp");
}
publicvoiddestroy(){}
}
/***endfilefilecapturefilter.java*/
/***startfilefilecaptureresponsewrapper.java*/
packagecom.junjing.filter;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
publicclassfilecaptureresponsewrapper
extendshttpservletresponsewrapper
{
privatechararraywriteroutput;
publicstringtostring()
{
returnoutput.tostring();
}
publicfilecaptureresponsewrapper(httpservletresponseresponse)
{
super(response);
output=newchararraywriter();
}
publicprintwritergetwriter()
{
returnnewprintwriter(output);
}
publicvoidwritefile(stringfilename)
throwsioexception
{
filewriterfw=newfilewriter(filename);
fw.write(output.tochararray());
fw.close();
}
publicvoidwriteresponse(printwriterout)
{
out.print(output.tochararray());
}
}
/***endfilefilecaptureresponsewrapper.java*/
附件源代码:
不过采用resin服务器的话,以上代码会失效。因为resin没有实现getwriter方法,而是采用getoutputstream取而代之,所以必须修改些代码来迎合resin运行环境:
/***startfilefilecaptureresponsewrapper.java*/
packagecom.junjing.filter;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.io.*;
publicclassfilecaptureresponsewrapper
extendshttpservletresponsewrapper
{
privatechararraywriteroutput;
publicstringtostring()
{
returnoutput.tostring();
}
publicfilecaptureresponsewrapper(httpservletresponseresponse)
{
super(response);
output=newchararraywriter();
}
publicprintwritergetwriter()
{
returnnewprintwriter(output);
}
publicvoidwritefile(stringfilename)
throwsioexception
{
filewriterfw=newfilewriter(filename);
fw.write(output.tostring());
fw.close();
}
publicservletoutputstreamgetoutputstream()
throwsjava.io.ioexception
{
returnnewservletoutputstream();
}
publicvoidwrite(intb)
throwsioexception
{
output.write(b);
}
publicvoidwrite(byteb[])
throwsioexception
{
output.write(newstring(b,"gbk"));
}
publicvoidwrite(byteb[],intoff,intlen)
throwsioexception
{
output.write(newstring(b,off,len));
}
};
}
publicvoidwriteresponse(printwriterout)
{
out.print(output.tochararray());
}
}
/***endfilefilecaptureresponsewrapper.java*/
希望本文所述对大家的JSP程序设计有所帮助。