Struts HOW-TO 系列 之 資料庫訪問 (轉)

gugu99發表於2007-08-17
Struts HOW-TO 系列 之 資料庫訪問 (轉)[@more@]

HOW-TO 系列

++怎樣訪問++

[訪問一個資料庫]

在一個其於Struts的應用的設計過程中,最好能在/表示層(presentation layer)和你的商務邏輯類(包含所有資料訪問操作的層)的中間,定義一個Action類,作為小型的介面卡(thin adapter)。

所以,你可以先定義一些商務(business API),這些API就是簡單的類。你可以傳遞一些引數給這些,並從這些物件返回一個Java Bean或者Java Bean的集合。這個Action類負責這些物件,並把它們返回的值傳遞給web/表示層。

通常,你可以為每一個你需要呼叫的商務方法/商務類API建立一個Action類。理想情況下,所有的資料庫訪問程式碼都被封裝進了這些商務API類裡,所以Struts並不知道你正在使用的持久層(persistent layer)(甚至都不知道你使用了持久層)。它只需要傳遞一個主鍵(Key)或者一個查詢引數,然後處理返回的結果bean或者bean集合。這樣,你就可以在其他的應用環境裡複用這些商務API類,你還可以對這些獨立於Struts或HTTP環境的商務API進行單體測試。

開始的時候,最簡單的方法就是設計一個1:1的方案,為你的每一個商務API入口(entry-point)定義一個Action類。當你的豐富了以後,你也可以使用DispatchAction組合這些Action類。你甚至可以定義一個簡單的""Action,用來呼叫所有的這些商務類。你可以在contrib目錄裡找到Scaffold設計的ProcessAction,這是一個"框架"Action的完整實現。使用這種方案可以使用更少的Action類,但你必須對Struts和MVC框架的底層實現有較深的理解。不要害怕在開始的時候定義過多的Action,Struts的方案可以給予你充分的自由在以後重構你的設計,因為你可以靈活的改變你的Action類,而不會對應用造成影響。

在理想情況下,商務邏輯層(business logic layer)應該封裝所有的資料訪問細節,包括資料庫連線的獲得。但是,一些應用程式的設計要求呼叫者可以從一個Data物件來獲得資料庫連線。遇到這種情況時,Struts DataSource管理器可以使你在需要的時候配置這些DataSource資源。

Struts DataSource管理器在Struts配置(Struts-config.)裡定義。這個管理器可以用來分發和配置任何實現了javax..DataSource介面的資料庫連線池(connection pool)。如果你的MS或者容器內建了符合這些要求的連線池,你可以優先選用它。


[Jakarta的公共連線池實現 - BasicDataSource]

如果你的手頭沒有連線池的本地(native)實現,你可以使用Jakarta提供的公共連線池實現[org..commons.dbcp.BasicDataSource],它可以和DataSource管理器"合作"的很好。另外,Struts還在它的util包裡包含了一個GenericDataSource類,這也是一個連線池實現。但是這只是一個非常簡單的實現方案,不推薦使用,因為它可能在Struts的以後版本中被BasicDataSource或其它的資料來源實現替換掉。

下面是一段Struts-config.xml配置檔案中的資料來源配置(使用GenericDataSource資料來源實現),你可以更改相應的設定以適合你自己的系統。


 <!-- configuration for GenericDataSource wrapper --&gt
 
 
    property="autoCommit"
  value="false"/>
    property="description"
  value="Example Data Source Configuration"/>
    property="Class"
  value="org.postgresql.Driver"/>
    property="maxCount"
  value="4"/>
    property="minCount"
  value="2"/>
    property="pass"
  value="mypassword"/>
    property="url"
  value=":postgresql://localhost/mydatabase"/>
    property="user"
  value="myusername"/>
 

 

使用BasicDataSource資料來源實現的配置方案如下:


 <!-- configuration for commons BasicDataSource --&gt
 
   property="driverClassName"
  value="org.postgresql.Driver" />
   property="url"
  value="jdbc:postgresql://localhost/mydatabase" />
   property="username"
  value="me" />
   property="password"
  value="test" />
   property="maxActive"
  value="10" />
   property="maxWait"
  value="5000" />
   property="defaultAutoCommit"
  value="false" />
   property="defaultReadOnly"
  value="false" />
   property="validationQuery"
  value=" COUNT(*) FROM market" />
 

注意,你可以在你的應用系統中定義不止一個資料來源,你可以根據需要定義多個資料來源,併為它們分別起一個邏輯名(logical name)。這樣做可以給你的應用系統提供更好的性和可測量性(scalability),你還可以定義一個專用於測試的資料來源。

配置好DataSource以後,你就可以在你的應用系統中使用這些資料來源了。下面這段程式碼演示了怎樣在Action類的execute方法中透過這些資料來源來生成資料庫連線。

public ActionForward execute(
 ActionMap mapping,
 ActionFoform,
 HttpRequest request,
 HttpServletResponse response)
 throws Exception
{
 DataSource dataSource;
 Connection cnn;

 try
 {
 dataSource = getDataSource(request);
 cnn = dataSource.getConnection();
 // 資料連線已經建立了,你可以做你想做的事情了
 }
 catch (SQLException e)
 {
 getServlet().log("處理資料庫連線", e);
 }
 finally
 {
 // 在finally塊裡包含這些程式碼
 // 用以保證連線最後會被關閉
 try
 {
 cnn.close();
 }
 catch (SQLException e)
 {
 getServlet().log("關閉資料庫連線", e);
 }
 }
}

注意:如果你使用公共的BasicDataSource,你提供給pingQuery屬性的查詢語句(如果你設定了話)必須至少要能返回一行記錄。

例子:SELECT COUNT(*) FROM VALIDTABLE

你可以把VALIDTABLE替換成你的資料庫中包含的任何有效的表。

[使用多個資料來源]

如果你需要在模組(Module)中使用多於一個的資料來源,你可以在配置檔案的元素裡包含一個key屬性。


 
 …屬性配置略, 同上…
 

 
 …屬性配置略, 同上…
 

你程式碼裡,你可以透過這些key獲得不同的資料來源。程式碼如下:


try
{
 dataSourceA = getDataSource(request, "A");
 dataSourceB = getDataSource(request, "B");

你可以根據需要為每一個模組設定多個資料來源。但同一模組裡每個資料來源的key屬性必須唯一,因為Struts模組系統是以每一個模組為單位管理名稱空間的。

[更多的內容請參考:]

-archive.com/Struts-user@jakarta.apache.org/msg24621.html">

















轉換/資料傳遞(Tranormation/Data Transfer)



[提供動態結果集(dynamic result set)]

大多數的資料庫查詢結果都會跟你的已經使用的ActionForms一一對應,你只需要把你的查詢結果集合提交給相應的ActionForm就可以了。但有時候,結果集(ResultSet)裡有些欄位並不是ActionForm的屬性,或者更糟。

幸運的是,Struts的自定義標籤集並不關心你傳遞給他們的bean型別。你甚至可以直接輸出結果集。但是由於結果集會一直保持著與資料庫的連線,並且由於它們把所有的資料都直接傳遞給了,使得頁面變得零亂不堪。那麼我們該怎麼做呢?

從Struts 1.1開始,你可以使用新增加的ResultSetDynaClass來把你的結果集轉換成一個DynaBeans的ArrayList。Struts自定義標籤集可以像一般的JavaBean一樣使用DynaBean的屬性。(關於DynaActionForm類更詳細的資訊,請參考Struts手冊)。

ResultSetDynaClass類已經包含在於BeanUtils.jar包中,所以你現在所要做的,只需要拿出這個工具,實現自己的傳遞方案吧…………


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-962862/,如需轉載,請註明出處,否則將追究法律責任。

相關文章