程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> jsp實現將動態網頁轉換成靜態頁面的方法

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

編輯:關於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 源碼代碼如下:

/** * 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程序設計有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved