如何將jsp動態網頁轉換成靜態頁面

來源:互聯網
上載者:User

如果我可以將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 源碼代碼如下
/** * start file filecapturefilter.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecapturefilter implements filter
{
private string protdirpath;
public void init(filterconfig filterconfig)
throws servletexception
{
protdirpath = filterconfig.getservletcontext().getrealpath("/");
}
public void dofilter(servletrequest request,servletresponse response,filterchain
chain)
throws ioexception, servletexception
{
string filename = protdirpath + "forum/lastest.html";
printwriter out = response.getwriter();
filecaptureresponsewrapper responsewrapper = new
filecaptureresponsewrapper((httpservletresponse)response);
chain.dofilter(request, responsewrapper);
// fill responsewrapper up
string html = responsewrapper.tostring();
//得到的html 頁面結果字串
// responsewrapper.writefile(filename);
// dump the contents 寫成html 檔案,也可以儲存在記憶體
//responsewrapper.writeresponse( out );
// back to browser
//responsewrapper.sendredirect("lastestthread.jsp");
}
public void destroy() {}
}
/** * end file filecapturefilter.java */
/** * start file filecaptureresponsewrapper.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecaptureresponsewrapper
extends httpservletresponsewrapper
{
private chararraywriter output;
public string tostring()
{
return output.tostring();
}
public filecaptureresponsewrapper(httpservletresponse response)
{
super(response);
output = new chararraywriter();
}
public printwriter getwriter()
{
return new printwriter(output);
}
public void writefile(string filename)
throws ioexception
{
filewriter fw = new filewriter(filename);
fw.write( output.tochararray() );
fw.close();
}
public void writeresponse(printwriter out)
{
out.print( output.tochararray() );
}
}
/** * end file filecaptureresponsewrapper.java */
附件原始碼
不過採用resin 伺服器的話,以上代碼會失效。因為resin 沒有實現getwriter 方法,而
是採用getoutputstream 取而代之,所以必須修改些代碼來迎合resin 運行環境:
/** * start file filecaptureresponsewrapper.java */
package com.junjing.filter;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class filecaptureresponsewrapper
extends httpservletresponsewrapper
{
private chararraywriter output;
public string tostring()
{
return output.tostring();
}
public filecaptureresponsewrapper(httpservletresponse response)
{
super(response);
output = new chararraywriter();
}
public printwriter getwriter()
{
return new printwriter(output);
}
public void writefile(string filename)
throws ioexception
{
filewriter fw = new filewriter(filename);
fw.write( output.tostring());
fw.close();
}
public servletoutputstream getoutputstream()
throws java.io.ioexception
{
return new servletoutputstream();
}
public void write(int b)
throws ioexception
{
output.write(b);
}
public void write(byte b[])
throws ioexception
{
output.write(new string(b,"gbk"));
}
public void write(byte b[], int off, int len)
throws ioexception
{
output.write(new string(b, off, len));
}
};
}

public void writeresponse(printwriter out)
{
out.print(output.tochararray());
}
}
/** * end file filecaptureresponsewrapper.java */  
.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.