1.2 將MVC概念映射到Struts組件中
Struts 的體系結構實現了Model-View-Controller設計模式的概念,它將這些概念映射到web應用程序的組件和概念中。
1.3 Model: 系統狀態和商業邏輯JavaBeans
基于MVC的系統中的 Model 部分可以細分為兩個概念 -- 系統的內部狀態, 能夠改變狀態的行為。用語法術語來說,我們可以把狀態信息當作名詞(事物),把行為當作動詞(事物狀態的改變)。
通常說來,你的應用程序將系統內部的狀態表示為一組一個或多個的JavaBeans,使用屬性(properties)來表示狀態的細節。依賴于你的應用程序的復雜度,這些beans可以是自包含的(以某種方式知道怎樣永久地保存它們的狀態信息),或者可以是正面的(facades),知道當被請求時怎樣從外部數據源(例如數據庫)中取得信息。Entity EJBs通常也用來表示內部狀態。
大型應用程序經常將系統可能的商業邏輯行為表示為可以被維護狀態信息的beans調用的方法。舉個例子,你有一個為每個當前用戶保存在session中的購物車bean,里面是表示當前用戶決定購買物品的屬性。這個bean有一個checkOut()方法用來驗證用戶的信用卡,將定單發給庫房以選擇貨品和出貨。別的系統分別地表示同樣的行為,或許使用Session EJBs。
在一些小型應用程序中,同樣的行為又可能嵌入到作為Controller一部分的 Action 類中。這在邏輯非常簡單或者并不想要在其它環境中重用這些商業邏輯時是恰當的。Struts框架支持所有這些方法,但建議將商業邏輯(“做什么”)和 Action 類(“決定做什么”)分離開。
1.4 View: JSP頁面和表示組件
基于Struts的應用程序中的 View 部分通常使用JSP技術來構建。JSP頁面包含稱為“模版文本”的靜態HTML(或XML)文本,加上插入的基于對特殊行為標記解釋的動態內容。JSP環境包括了其用途由JSP規范來描述的一套標準的行為標記,例如 。另外,還有一個用來定義你自己標記的標準機制,這些自定義的標記組織在“定制標記庫”中。
Struts包括了一個廣闊的便于創建用戶界面,并且充分國際化的定制標記庫,與作為系統 Model 部分一部分的ActionForm beans美妙地相互配合。這些標記的使用將在后面做詳細討論。
除了JSP頁面和其包含的行為及定制標記,商業對象經常需要能夠基于它們在被請求時的當前狀態將自己處理成HTML(或XML)。從這些對象處理過的輸出可以很容易地使用 標準行為標記包括在結果的JSP頁面中。
1.5 Controller: ActionServlet和ActionMapping
應用程序的 Controller 部分集中于從客戶端接收請求(典型情況下是一個運行瀏覽器的用戶),決定執行什么商業邏輯功能,然后將產生下一步用戶界面的責任委派給一個適當的View組件。在Struts中,controller的基本組件是一個 ActionServlet 類的servlet。這個servlet通過定義一組映射(由Java接口 ActionMapping 描述)來配置。每個映射定義一個與所請求的URI相匹配的路徑和一個 Action 類(一個實現 Action 接口的類)完整的類名,這個類負責執行預期的商業邏輯,然后將控制分派給適當的View組件來創建響應。
Struts也支持使用包含有運行框架所必需的標準屬性之外的附加屬性的 ActionMapping 類的能力。這允許你保存特定于你的應用程序的附加信息,同時仍可利用框架其余的特性。另外,Struts允許你定義控制將重定向到的邏輯名,這樣一個行為方法可以請求“主菜單”頁面(舉例),而不需要知道相應的JSP頁面的實際名字是什么。這個功能極大地幫助你分離控制邏輯(下一步做什么)和顯示邏輯(相應的頁面的名稱是什么)。
2. 創建Model組件你用到的應用程序的需求文檔很可能集中于創建用戶界面。然而你應該保證每個提交的請求所需要的處理也要被清楚的定義。通常說來,Model 組件的開發者集中于創建支持所有功能需求的JavaBeans類。一個特殊應用要求的beans的精確特性依賴于具體需求變化會非常的大,但是它們通常可以分成下面討論的幾種類型。然而,首先對“范圍”概念做一個簡短的回顧是有用的,因為它與beans有關。
2.2 JavaBeans和范圍
在一個基于web的應用程序中,JavaBeans可以被保存在(并從中訪問)一些不同“屬性”的集合中。每一個集合都有集合生存期和所保存的beans可見度的不同的規則。總的說來,定義生存期和可見度的這些規則被叫做這些beans的 范圍 。JSP規范中使用以下術語定義可選的范圍(在圓括號中定義servlet API中的等價物):
page - 在一個單獨的JSP頁面中可見的Beans,生存期限于當前請求。(service()方法中的局部變量) request - 在一個單獨的JSP頁面中可見的Beans,也包括所有包含于這個頁面或從這個頁面重定向到的頁面或servlet。(Request屬性)
session - 參與一個特定的用戶session的所有的JSP和servlet都可見的Beans,跨越一個或多個請求。(Session屬性)
application - 一個web應用程序的所有JSP頁面和servlet都可見的Beans。(Servlet context屬性)
記住同一個web應用程序的JSP頁面和servlets共享同樣一組bean集合是很重要的。例如,一個bean作為一個request屬性保存在一個servlet中,就象這樣:
MyCart mycart = new MyCart(...);
request.setAttribute("cart", mycart);
將立即被這個servlet重定向到的一個JSP頁面使用一個標準的行為標記看到,就象這樣:
2.3 ActionForm Beans
Struts框架通常假定你已經為每一個你的應用程序中請求的輸入創建了一個 ActionForm bean(即一個實現了 ActionForm 接口的類)。如果你在你的 ActionMapping 配置文件中定義了這樣的beans(見“創建Controller組件”),Struts的controller servlet在調用適當的 Action 方法前將自動為你執行如下的服務:
用適當的關鍵字檢查用戶的session中是否有適當的類的bean的一個實例。
如果沒有這樣的session范圍的bean,自動建立一個新的bean并添加到用戶的session中。
對每個名字對應于bean中的一個屬性的請求參數,調用相應的set方法。這個操作類似于當你以通配符“*”選擇所有屬性使用標準的JSP行為標記 。
更新的ActionForm bean在被調用時將被傳遞給Acton類的perform()方法,以使這些值能夠立即生效。
當你在寫你的ActionForm beans時,記住以下的原則:
ActionForm 接口本身不需要特殊的實現方法。它是用來標識這些特定的beans在整個體系結構中的作用。典型情況下,一個ActionForm bean只包括屬性的get方法和set方法,沒有商業邏輯。
通常在一個ActionForm bean中只有很少的輸入驗證邏輯。這樣的beans存在的主要理由是保存用戶為相關的表單所輸入的大部分近期值 -- 甚至在錯誤被檢測到時 -- 這樣同樣的頁面可以被重建,伴隨有一組出錯信息,這樣用戶僅僅需要糾正錯誤的字段。用戶輸入的驗證應該在 Action 類中執行(如果是很簡單的話),或者在適當的商業邏輯beans中執行。
為每個表單中出現的字段定義一個屬性(用相關的getXxx()和setXxx()方法)。字段名和屬性名必須按照JavaBeans的約定相匹配。例如,一個名為 username 的輸入字段將引起 setUsername() 方法被調用。
你應該注意一個“表單”在這里討論時的意義并不必須對應于用戶界面中的一個單獨的JSP頁面。在很多應用程序中一個“表單”(從用戶的觀點)延伸至多個頁面也是很平常的。想想看,例如,通常在安裝新的應用程序時使用的導航安裝程序的用戶界面。Struts鼓勵你定義一個包含所有字段屬性的單獨的ActionForm bean。不管字段實際上是顯示在哪個頁面上。同樣的,同一表單的不同的頁面應該提交到相同的Action類。如果你遵照這個建議,在大多數情況下,頁面設計者可以重新組織不同頁面中的字段而不需要改變處理邏輯。
2.4 系統狀態Beans
系統的實際狀態通常表示為一組一個或多個的JavaBeans類,其屬性定義當前狀態。例如,一個購物車系統包括一個表示購物車的bean,這個bean為每個單獨的購物者維護,這個bean中包括(在其它事物之中)一組購物者當前選擇購買的項目。分別地,系統也包括保存用戶信息(包括他們的信用卡和送貨地址)、可獲得項目的目錄和它們當前庫存水平的不同的beans。
對于小規模的系統,或者對于不需要長時間保存的狀態信息,一組系統狀態beans可以包含所有系統曾經經歷的特定細節的信息。或者經常是,系統狀態beans表示永久保存在一些外部數據庫中的信息(例如CustomerBean對象對應于表 CUSTOMERS 中的特定的一行),在需要時從服務器的內存中創建或清除。在大規模應用程序中,Entity EJBs也用于這種用途。
2.5 商業邏輯Beans
你應該把你的應用程序中的功能邏輯封裝成對為此目的設計的JavaBeans的方法調用。這些方法可以是用于系統狀態beans的相同的類的一部分,或者可以是在專門執行商業邏輯的獨立的類中。在后一種情況下,你通常需要將系統狀態beans傳遞給這些方法作為參數處理。
為了代碼最大的可重用性,商業邏輯beans應該被設計和實現為它們不知道自己被執行于web應用環境中。如果你發現在你的bean中你必須import一個 javax.servlet.* 類,你就把這個商業邏輯捆綁在了web應用環境中。考慮重新組織事物使你的 Action 類(Controller任務的一部分,在下面描述)翻譯所有從HTTP請求中請求被處理為對你的商業邏輯beans屬性set方法調用的信息,然后可以發出一個對 execute() 的調用。這樣的一個商業邏輯類可以被重用在除它們最初被構造的web應用程序以外的環境中。
依賴于你的應用程序的復雜度和范圍,商業邏輯beans可以是與作為參數傳遞的系統狀態beans交互作用的普通的JavaBeans,或者使用JDBC調用訪問數據庫的普通的JavaBeans。而對于較大的應用程序,這些beans經常是有狀態或無狀態的EJBs。
2.6 題外話: 訪問關系數據庫
很多web應用程序利用一個關系數據庫(通過一個JDBC driver訪問)來保存應用程序相關的永久數據。其它應用程序則使用Entity EJBs來實現這個目的,他們委派EJBs自己來決定怎樣維護永久狀態。如果你是使用EJBs來實現這個目的,遵照EJB規范中描述的客戶端設計模式。
對于基于直接數據庫訪問的web應用程序,一個普通的設計問題是當需要訪問低層數據庫時怎樣產生一個適當的JDBC連接對象。解決這個問題有幾種方法 -- 以下原則描述了推薦的一種方法:
創建或得到一個允許一組數據庫連接被多個用戶共享的ConnectionPool類。Struts(當前)沒有包括這樣的一個類,但是有很多這樣的類可以得到。
當應用程序初始化時,在應用程序展開(deployment)描述符中定義一個有一個“啟動時加載”值的servlet。我們將把這個servlet叫做 啟動 servlet。在大多數情況下,這個servlet不需要處理任何的請求,所以沒有一個 會指向它。
在啟動servlet的 init() 方法中,配置并初始化一個ConnectionPool類的實例,將其保存為一個servlet context屬性(從JSP的觀點看等同于一個application范圍的bean)。通常基于傳遞給啟動servlet初始化參數來配置聯接緩沖池是很方便的。
在啟動servlet的 destroy() 方法中,包含了釋放聯接緩沖池所打開的聯接的邏輯。這個方法將在servlet容器結束這個應用程序的時候被調用。
當 Action 類需要調用一個需要數據庫聯接的商業邏輯bean中的方法(例如“insert a new customer”)時,將執行下面的步驟:
為這個web應用程序從servelt context屬性中得到一個聯接緩沖池對象。
調用聯接緩沖池對象的 open() 方法來得到一個在 Action 類調用中使用的聯接。
調用商業邏輯bean中合適的方法,將數據庫聯接對象作為一個參數傳遞給它。
調用分配的聯接中的 close() 方法,這將引起這個聯接為了以后其它請求的重用被返回到緩沖池中。
一個通常的編程錯誤是忘記了把數據庫聯接返回給緩沖池,這將最終導致用完所有的聯接。一定要確信 Action 類的邏輯總是返回聯接,甚至在商業邏輯bean拋出一個違例時。
遵照上面推薦的設計模式意味著你能夠編寫你的商業邏輯類而不需要擔心它們怎樣得到一個JDBC聯接來使用-- 簡單地在任何需要訪問數據庫的方法中包含一個Connection參數。當你的商業邏輯類在一個web應用程序中被利用時,分配和釋放適當的聯接是 Action 類的責任。當你使用相同的商業邏輯類時,例如,在一個批處理工作中,提供一個適當的聯接是那個應用程序的責任(這不需要從緩沖池中獲得,因為大多數批處理工作運行于一個單線程環境中)。
Struts 的體系結構實現了Model-View-Controller設計模式的概念,它將這些概念映射到web應用程序的組件和概念中。
1.3 Model: 系統狀態和商業邏輯JavaBeans
基于MVC的系統中的 Model 部分可以細分為兩個概念 -- 系統的內部狀態, 能夠改變狀態的行為。用語法術語來說,我們可以把狀態信息當作名詞(事物),把行為當作動詞(事物狀態的改變)。
通常說來,你的應用程序將系統內部的狀態表示為一組一個或多個的JavaBeans,使用屬性(properties)來表示狀態的細節。依賴于你的應用程序的復雜度,這些beans可以是自包含的(以某種方式知道怎樣永久地保存它們的狀態信息),或者可以是正面的(facades),知道當被請求時怎樣從外部數據源(例如數據庫)中取得信息。Entity EJBs通常也用來表示內部狀態。
大型應用程序經常將系統可能的商業邏輯行為表示為可以被維護狀態信息的beans調用的方法。舉個例子,你有一個為每個當前用戶保存在session中的購物車bean,里面是表示當前用戶決定購買物品的屬性。這個bean有一個checkOut()方法用來驗證用戶的信用卡,將定單發給庫房以選擇貨品和出貨。別的系統分別地表示同樣的行為,或許使用Session EJBs。
在一些小型應用程序中,同樣的行為又可能嵌入到作為Controller一部分的 Action 類中。這在邏輯非常簡單或者并不想要在其它環境中重用這些商業邏輯時是恰當的。Struts框架支持所有這些方法,但建議將商業邏輯(“做什么”)和 Action 類(“決定做什么”)分離開。
1.4 View: JSP頁面和表示組件
基于Struts的應用程序中的 View 部分通常使用JSP技術來構建。JSP頁面包含稱為“模版文本”的靜態HTML(或XML)文本,加上插入的基于對特殊行為標記解釋的動態內容。JSP環境包括了其用途由JSP規范來描述的一套標準的行為標記,例如 。另外,還有一個用來定義你自己標記的標準機制,這些自定義的標記組織在“定制標記庫”中。
Struts包括了一個廣闊的便于創建用戶界面,并且充分國際化的定制標記庫,與作為系統 Model 部分一部分的ActionForm beans美妙地相互配合。這些標記的使用將在后面做詳細討論。
除了JSP頁面和其包含的行為及定制標記,商業對象經常需要能夠基于它們在被請求時的當前狀態將自己處理成HTML(或XML)。從這些對象處理過的輸出可以很容易地使用 標準行為標記包括在結果的JSP頁面中。
1.5 Controller: ActionServlet和ActionMapping
應用程序的 Controller 部分集中于從客戶端接收請求(典型情況下是一個運行瀏覽器的用戶),決定執行什么商業邏輯功能,然后將產生下一步用戶界面的責任委派給一個適當的View組件。在Struts中,controller的基本組件是一個 ActionServlet 類的servlet。這個servlet通過定義一組映射(由Java接口 ActionMapping 描述)來配置。每個映射定義一個與所請求的URI相匹配的路徑和一個 Action 類(一個實現 Action 接口的類)完整的類名,這個類負責執行預期的商業邏輯,然后將控制分派給適當的View組件來創建響應。
Struts也支持使用包含有運行框架所必需的標準屬性之外的附加屬性的 ActionMapping 類的能力。這允許你保存特定于你的應用程序的附加信息,同時仍可利用框架其余的特性。另外,Struts允許你定義控制將重定向到的邏輯名,這樣一個行為方法可以請求“主菜單”頁面(舉例),而不需要知道相應的JSP頁面的實際名字是什么。這個功能極大地幫助你分離控制邏輯(下一步做什么)和顯示邏輯(相應的頁面的名稱是什么)。
2. 創建Model組件你用到的應用程序的需求文檔很可能集中于創建用戶界面。然而你應該保證每個提交的請求所需要的處理也要被清楚的定義。通常說來,Model 組件的開發者集中于創建支持所有功能需求的JavaBeans類。一個特殊應用要求的beans的精確特性依賴于具體需求變化會非常的大,但是它們通常可以分成下面討論的幾種類型。然而,首先對“范圍”概念做一個簡短的回顧是有用的,因為它與beans有關。
2.2 JavaBeans和范圍
在一個基于web的應用程序中,JavaBeans可以被保存在(并從中訪問)一些不同“屬性”的集合中。每一個集合都有集合生存期和所保存的beans可見度的不同的規則。總的說來,定義生存期和可見度的這些規則被叫做這些beans的 范圍 。JSP規范中使用以下術語定義可選的范圍(在圓括號中定義servlet API中的等價物):
page - 在一個單獨的JSP頁面中可見的Beans,生存期限于當前請求。(service()方法中的局部變量) request - 在一個單獨的JSP頁面中可見的Beans,也包括所有包含于這個頁面或從這個頁面重定向到的頁面或servlet。(Request屬性)
session - 參與一個特定的用戶session的所有的JSP和servlet都可見的Beans,跨越一個或多個請求。(Session屬性)
application - 一個web應用程序的所有JSP頁面和servlet都可見的Beans。(Servlet context屬性)
記住同一個web應用程序的JSP頁面和servlets共享同樣一組bean集合是很重要的。例如,一個bean作為一個request屬性保存在一個servlet中,就象這樣:
MyCart mycart = new MyCart(...);
request.setAttribute("cart", mycart);
將立即被這個servlet重定向到的一個JSP頁面使用一個標準的行為標記看到,就象這樣:
<jsp:useBean id="cart" scope="request" class="com.mycompany.MyApp.MyCart"/> |
2.3 ActionForm Beans
Struts框架通常假定你已經為每一個你的應用程序中請求的輸入創建了一個 ActionForm bean(即一個實現了 ActionForm 接口的類)。如果你在你的 ActionMapping 配置文件中定義了這樣的beans(見“創建Controller組件”),Struts的controller servlet在調用適當的 Action 方法前將自動為你執行如下的服務:
用適當的關鍵字檢查用戶的session中是否有適當的類的bean的一個實例。
如果沒有這樣的session范圍的bean,自動建立一個新的bean并添加到用戶的session中。
對每個名字對應于bean中的一個屬性的請求參數,調用相應的set方法。這個操作類似于當你以通配符“*”選擇所有屬性使用標準的JSP行為標記 。
更新的ActionForm bean在被調用時將被傳遞給Acton類的perform()方法,以使這些值能夠立即生效。
當你在寫你的ActionForm beans時,記住以下的原則:
ActionForm 接口本身不需要特殊的實現方法。它是用來標識這些特定的beans在整個體系結構中的作用。典型情況下,一個ActionForm bean只包括屬性的get方法和set方法,沒有商業邏輯。
通常在一個ActionForm bean中只有很少的輸入驗證邏輯。這樣的beans存在的主要理由是保存用戶為相關的表單所輸入的大部分近期值 -- 甚至在錯誤被檢測到時 -- 這樣同樣的頁面可以被重建,伴隨有一組出錯信息,這樣用戶僅僅需要糾正錯誤的字段。用戶輸入的驗證應該在 Action 類中執行(如果是很簡單的話),或者在適當的商業邏輯beans中執行。
為每個表單中出現的字段定義一個屬性(用相關的getXxx()和setXxx()方法)。字段名和屬性名必須按照JavaBeans的約定相匹配。例如,一個名為 username 的輸入字段將引起 setUsername() 方法被調用。
你應該注意一個“表單”在這里討論時的意義并不必須對應于用戶界面中的一個單獨的JSP頁面。在很多應用程序中一個“表單”(從用戶的觀點)延伸至多個頁面也是很平常的。想想看,例如,通常在安裝新的應用程序時使用的導航安裝程序的用戶界面。Struts鼓勵你定義一個包含所有字段屬性的單獨的ActionForm bean。不管字段實際上是顯示在哪個頁面上。同樣的,同一表單的不同的頁面應該提交到相同的Action類。如果你遵照這個建議,在大多數情況下,頁面設計者可以重新組織不同頁面中的字段而不需要改變處理邏輯。
2.4 系統狀態Beans
系統的實際狀態通常表示為一組一個或多個的JavaBeans類,其屬性定義當前狀態。例如,一個購物車系統包括一個表示購物車的bean,這個bean為每個單獨的購物者維護,這個bean中包括(在其它事物之中)一組購物者當前選擇購買的項目。分別地,系統也包括保存用戶信息(包括他們的信用卡和送貨地址)、可獲得項目的目錄和它們當前庫存水平的不同的beans。
對于小規模的系統,或者對于不需要長時間保存的狀態信息,一組系統狀態beans可以包含所有系統曾經經歷的特定細節的信息。或者經常是,系統狀態beans表示永久保存在一些外部數據庫中的信息(例如CustomerBean對象對應于表 CUSTOMERS 中的特定的一行),在需要時從服務器的內存中創建或清除。在大規模應用程序中,Entity EJBs也用于這種用途。
2.5 商業邏輯Beans
你應該把你的應用程序中的功能邏輯封裝成對為此目的設計的JavaBeans的方法調用。這些方法可以是用于系統狀態beans的相同的類的一部分,或者可以是在專門執行商業邏輯的獨立的類中。在后一種情況下,你通常需要將系統狀態beans傳遞給這些方法作為參數處理。
為了代碼最大的可重用性,商業邏輯beans應該被設計和實現為它們不知道自己被執行于web應用環境中。如果你發現在你的bean中你必須import一個 javax.servlet.* 類,你就把這個商業邏輯捆綁在了web應用環境中。考慮重新組織事物使你的 Action 類(Controller任務的一部分,在下面描述)翻譯所有從HTTP請求中請求被處理為對你的商業邏輯beans屬性set方法調用的信息,然后可以發出一個對 execute() 的調用。這樣的一個商業邏輯類可以被重用在除它們最初被構造的web應用程序以外的環境中。
依賴于你的應用程序的復雜度和范圍,商業邏輯beans可以是與作為參數傳遞的系統狀態beans交互作用的普通的JavaBeans,或者使用JDBC調用訪問數據庫的普通的JavaBeans。而對于較大的應用程序,這些beans經常是有狀態或無狀態的EJBs。
2.6 題外話: 訪問關系數據庫
很多web應用程序利用一個關系數據庫(通過一個JDBC driver訪問)來保存應用程序相關的永久數據。其它應用程序則使用Entity EJBs來實現這個目的,他們委派EJBs自己來決定怎樣維護永久狀態。如果你是使用EJBs來實現這個目的,遵照EJB規范中描述的客戶端設計模式。
對于基于直接數據庫訪問的web應用程序,一個普通的設計問題是當需要訪問低層數據庫時怎樣產生一個適當的JDBC連接對象。解決這個問題有幾種方法 -- 以下原則描述了推薦的一種方法:
創建或得到一個允許一組數據庫連接被多個用戶共享的ConnectionPool類。Struts(當前)沒有包括這樣的一個類,但是有很多這樣的類可以得到。
當應用程序初始化時,在應用程序展開(deployment)描述符中定義一個有一個“啟動時加載”值的servlet。我們將把這個servlet叫做 啟動 servlet。在大多數情況下,這個servlet不需要處理任何的請求,所以沒有一個 會指向它。
在啟動servlet的 init() 方法中,配置并初始化一個ConnectionPool類的實例,將其保存為一個servlet context屬性(從JSP的觀點看等同于一個application范圍的bean)。通常基于傳遞給啟動servlet初始化參數來配置聯接緩沖池是很方便的。
在啟動servlet的 destroy() 方法中,包含了釋放聯接緩沖池所打開的聯接的邏輯。這個方法將在servlet容器結束這個應用程序的時候被調用。
當 Action 類需要調用一個需要數據庫聯接的商業邏輯bean中的方法(例如“insert a new customer”)時,將執行下面的步驟:
為這個web應用程序從servelt context屬性中得到一個聯接緩沖池對象。
調用聯接緩沖池對象的 open() 方法來得到一個在 Action 類調用中使用的聯接。
調用商業邏輯bean中合適的方法,將數據庫聯接對象作為一個參數傳遞給它。
調用分配的聯接中的 close() 方法,這將引起這個聯接為了以后其它請求的重用被返回到緩沖池中。
一個通常的編程錯誤是忘記了把數據庫聯接返回給緩沖池,這將最終導致用完所有的聯接。一定要確信 Action 類的邏輯總是返回聯接,甚至在商業邏輯bean拋出一個違例時。
遵照上面推薦的設計模式意味著你能夠編寫你的商業邏輯類而不需要擔心它們怎樣得到一個JDBC聯接來使用-- 簡單地在任何需要訪問數據庫的方法中包含一個Connection參數。當你的商業邏輯類在一個web應用程序中被利用時,分配和釋放適當的聯接是 Action 類的責任。當你使用相同的商業邏輯類時,例如,在一個批處理工作中,提供一個適當的聯接是那個應用程序的責任(這不需要從緩沖池中獲得,因為大多數批處理工作運行于一個單線程環境中)。