訪問一個數據庫 在一個其於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進行單體測試
開始的時候
最簡單的方法就是設計一個
:
的方案
為你的每一個商務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提供的公共連接池實現[mons
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=
/>
<set
property
property=
minCount
value=
/>
<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=
mons
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=
/>
<set
property
property=
maxWait
value=
/>
<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=
mons
dbcp
BasicDataSource
>
…屬性配置略
同上…
</data
source>
<data
source key=
B
type=
mons
dbcp
BasicDataSource
>
…屬性配置略
同上…
</data
source>
</data
source>
你代碼裡
你可以通過這些key獲得不同的數據源
代碼如下
…
try
{
dataSourceA = getDataSource(request
A
);
dataSourceB = getDataSource(request
B
);
…
你可以根據需要為每一個模塊設置多個數據源
但同一模塊裡每個數據源的key屬性必須唯一
因為Struts模塊系統是以每一個模塊為單位管理命名空間的
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28362.html