struts數據庫訪問

 來源:http://big5.webasp.net/article/18/17813.htm

 

Struts HOW-TO 系列

++怎樣訪問數據庫++

〔訪問一個數據庫〕

在一個其於Struts的應用系統的設計過程中,最好能在web/表示層(presentation layer)和你的商務邏輯類(包含所有數據訪問操作的層)的中間,定義一個Action類,作為小型的適配器(thin adapter)。

所以,你可以先定義一些商務API(business API),這些API就是簡單的Java類。你可以傳遞一些參數給這些對象,並從這些對像返回一個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)應該封裝所有的數據訪問細節,包括數據庫連接的獲得。但是,一些應用程序的設計要求調用者可以從一個DataSource對像來獲得數據庫連接。遇到這種情況時,Struts DataSource管理器可以使你在需要的時候配置這些DataSource資源。

Struts DataSource管理器在Struts配置文件(Struts-config.xml)裡定義。這個管理器可以用來分發和配置任何實現了javax.sql.DataSource接口的數據庫連接池(connection pool)。如果你的DBMS或者容器內置了符合這些要求的連接池,你可以優先選用它。


〔Jakarta的公共連接池實現 - BasicDataSource〕

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

下面是一段Struts-config.xml配置文件中的數據源配置(使用GenericDataSource數據源實現),你可以更改相應的設置以適合你自己的系統。


<!-- configuration for GenericDataSource wrapper -->
<data-sources>
<data-source>
<set-property
property="autoCommit"
value="false"/>
<set-property
property="description"
value="Example Data Source Configuration"/>
<set-property
property="driverClass"
value="org.postgresql.Driver"/>
<set-property
property="maxCount"
value="4"/>
<set-property
property="minCount"
value="2"/>
<set-property
property="password"
value="mypassword"/>
<set-property
property="url"
value="jdbc:postgresql://localhost/mydatabase"/>
<set-property
property="user"
value="myusername"/>
</data-source>
</data-sources>

使用BasicDataSource數據源實現的配置方案如下:

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

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

配置好DataSource以後,你就可以在你的應用系統中使用這些數據源了。下面這段代碼演示了怎樣在Action類的execute方法中通過這些數據源來生成數據庫連接。

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest 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)中使用多於一個的數據源,你可以在配置文件的<data-source>元素裡包含一個key屬性。

<data-source>
<data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
…屬性配置略, 同上…
</data-source>
<data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
…屬性配置略, 同上…
</data-source>
</data-source>

你代碼裡,你可以通過這些key獲得不同的數據源。代碼如下:


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


你可以根據需要為每一個模塊設置多個數據源。但同一模塊裡每個數據源的key屬性必須唯一,因為Struts模塊系統是以每一個模塊為單位管理命名空間的。

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值