jsp實現將動態網頁轉換成靜態頁面的方法_JSP編程

來源:互聯網
上載者:User

本文執行個體講述了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 源碼代碼如下:

/** * 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 */

希望本文所述對大家的JSP程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.