Jsp呼叫Javeabean指令UseBean中有Scope設置,一般有Application session page等設置,Page就是每頁
重新產生usebean中的javabean新對象,一般情況是用這種,如果多個Jsp程式間為共享數據,可以使用
session
而application的意思,該javabean將一直存在,與session相對用戶來說,application是相對應用程序
的,一般來說,一個用戶有一個session,並且隨著用戶離開而消失;而application則是一直存在,類似
一個servlet程序,類似整個系統的"全域變數",而且只有一個實例。
MVC中控制功能
因此application這個特性,很適合用來做MVC中的控制功能,一般傳統MVC是用servlet做控制功能,V
基本上
是Jsp頁面,M就是中間件Javabean之類。但隨著Jsp功能的完善和推廣,逐漸有替代servlet之趨勢,我們在實踐中更多使用的也是Jsp,有時
為了
省卻麻煩的事情,就使用Jsp代替servlet.尤其是其控制功能。實際上,這個控制功能是封裝在一個Javabean中,Jsp使用scope=application來調用這個Javabean,這樣
,具備控制功能的javabean就類似servlet常駐內存,並和後台各種中間件交互操作。
「首頁」的展現
在實際應用中,我們經常有多個用戶要同時訪問一個頁面,如首頁,這個首頁中有很多功能要運行,比如
目錄分類,首頁程序要從數據庫中讀入樹形數據並展開,輸出到首頁,這個功能是封裝在Javabean中的。
那麼首頁Jsp呼叫這個Javabean時,使用scope=application, 再通過樹形資料的緩衝演算法,這樣,多個
使用者
同時造訪首頁時,首頁JSp就無需每次啟動Javabean然後再反覆讀取資料庫了。無疑大大提高速度。
所以如果你的首頁Jsp訪問量很高,那麼就應該在這方面多花點時間優化。
資料庫連線緩衝
< jsp:useBean id="cods"
class="oracle.jdbc.pool.OracleConnectionCacheImpl"
scope="application" />
< event:application_OnStart>
< %
cods.setURL("jdbc:oracle:thin:@HOST:PORT:SID");
cods.setUser("scott");
cods.setPassword("tiger");
cods.setStmtCache (5);
%>
< /event:application_OnStart>
< %@ page import="java.sql.*, javax.sql.*, oracle.jdbc.pool.*" %>
< !------------------------------------------------ ----------------
* This is a JavaServer Page that uses Connection Caching over
application
* scope. The Cache is created in an application scope in
globals.jsa file.
* Connection is obtained from the Cache and recycled back once
done.
------------------------------------------------ --------------------!>
< HTML>
< HEAD>
< TITLE>
ConnCache JSP
< /TITLE>
< /HEAD>
< BODY BGCOLOR=EOFFFO>
< H1> Hello
< %= (request.getRemoteUser() != null? ", " +
request.getRemoteUser() : "") %>
! I am Connection Caching JSP.
< /H1>
< HR>
< B> I get the Connection from the Cache and recycle it back.
< /B>
< P>
< %
try {
Connection conn = cods.getConnection();
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery ("SELECT ename, sal " +
"FROM scott.emp ORDER BY ename");
if (rset.next()) {
%>
< TABLE BORDER=1 BGCOLOR="C0C0C0">
< TH WIDTH=200 BGCOLOR="white"> < I>Employee Name< /I> < /TH>
< TH WIDTH=100 BGCOLOR="white"> < I>Salary< /I> < /TH>
< TR> < TD ALIGN=CENTER> < %= rset.getString(1) %> < /TD>
< TD ALIGN=CENTER> $< %= rset.getDouble(2) %> < /TD>
< /TR>
< % while (rset.next()) {
%>
< TR> < TD ALIGN=CENTER> < %= rset.getString(1) %> < /TD>
< TD ALIGN=CENTER> $< %= rset.getDouble(2) %> < /TD>
< /TR>
< % }
%>
< /TABLE>
< % }
else {
%>
< P> Sorry, the query returned no rows! < /P>
< %
}
rset.close();
stmt.close();
conn.close(); // Put the Connection Back into the Pool
} catch (SQLException e) {
out.println("< P>" + "There was an error doing the query:");
out.println ("< PRE>" + e + "< /PRE>
< P>");
}
%>
< /BODY>
< /HTML>
使用application快取資料庫的連接,每次使用時,從緩衝中取出,用完就返回。