先前,我們已經提到,JSP程式都是模組,並且具有強大的表達-請求(presentation-request)功能。建立一個完美的資料庫存取是一個具有挑戰的過程,而JDBC介面能夠很好地完成這個過程。然而,嵌入JSP程式碼中的JDBC程式碼,與SQL指令嵌入在JDBC一樣,可以充分利用JSP的功能,為客戶端建立一個整潔而簡單的API。為了達到這個目的,我們可以考慮到使用JSP操作來建立資料庫介面元件。
完美的JSP設計模式是Model-View-Controller (MVC)。傳統三層體系為:Model為程式邏輯與資料;View為檢視;以及Controller為請求處理。遵循這個模型,一個JSP程式包含客戶端-伺服器「對話框」的每一「行」的頁面。在一個典型的程式中,你可以看到一個查詢頁面,一個驗證頁面,一個資料庫插入頁面,一個資料庫更新頁面,等等。
在上一篇的文章中,我們討論到如何在每一頁中嵌入JDBC,以確保程式的結構更加合理。然而,建立可執行的SQL指令,就像變數透過JDBC指令而傳遞一樣,也有可能增加程式的複雜度。
JDBC設計的JSP操作
JSP資料庫操作的另一個方法是,在不使用JDBC的情況下為資料庫建立一些操作的集合。使用這個方法,你可以得到兩種好處:第一,你可以消除使用JDBC的必要,這就使得很多工作得以簡化;第二,你的設計和程式碼的組織更加合理(比如可讀性,靈活性,以及可維護性)。
你仍然需要一些驅動程序,但你首先簡化以上的操作。 JSP程式中的操作都是一些邏輯塊,通常由其它的JSP程式開發者編寫和利用,但你可以把它們當成子程式來使用。使用JSP操作的意義是標準化某些功能,以及最大程度地減少嵌入在JSP的Java程式碼數量。
JSP提供了一套標準擴充的類別。透過這些類,你可以透過一個標籤管理器器(tag handler)定義一個操作。這裡有兩個JSP定義的Java介面:Tag介面和BodyTag接口,分別是由TagSupport類別和BodyTagSupport類別執行。
你可以建立通用JSP用途的一個標籤庫,而且你也可以執行標籤管理器(tag handler)以擴展類別的支援。以下是實現這些流程的步驟。
首先,執行一個標籤管理器的類別:
packagecom.myactions;
(import statements go here)
public class MyActionTag extends TagSupport {
…
}
接著,編譯這段程式碼,並將類別檔案放置在程式的類別庫中。然後,你將需要一個Tag Library Descriptor (TLD)文件,這是一個XML文件,以匹配你的操作名稱和相應的標籤管理器的類別。
<tag>
<name>MyAction</name>
<tagclass>com.myactions.MyActionTag</tagclass>
<bodycontent> (whatever) </bodycontent>
<attribute>myData</attribute>
</tag>
</tag>
相關的Trialware
假設你已經建立一個名為MyAction的動作,這是一個與com.myactions.MyActionTag類別相符的TLD。 TLD檔案必須位於程式的TLDs路徑。
當你從一個JSP頁呼叫操作時,TLD告訴JSP正確的類別以使用操作。這就帶來極大的方便,而且只需要少量的程式碼。
但是,從何引入SQL?首先,你需要建立具有連線功能的資料庫存取。你可以使用javax介面來完成,而javax可見於JDBC 2.0 Optional工具箱。 JDBC 2.0的javax.sql.DataSource類別提供了你所需要的連線。
此時,SQL位於什麼地方?它在bean中。你可以使用JDBCcreateStatement和PreparedStatement在bean中建立一個方法。將這個方法成為一個公共的Vector,並正確地將你的SQL宣告傳遞到這個方法。
總結你的資料庫bean執行一個嵌入在操作體的SQL語句,你可以傳遞一個語句給SQL語句,或是用它來執行一個預先的動作。可以透過標籤管理器來執行你的操作。由於JDBC被嵌入於函式庫程式碼中,你將無法在JSP程式中明確地使用它。
初次使用這種方法會覺得它比JDBC中的嵌入SQL,以及JSP中的嵌入JDBC更加複雜,但是,你建立SQL操作並將它們存放在一個TLD,你只需做一次,在所有的JSP程式中就可以存取這些操作。這就是這種方法的優點。
下次,我們將會講述到JSP頁和會話(sessions)之間的資料傳遞。