熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Struts HOW-TO 系列 之數據庫訪問

2022-06-13   來源: Java開源技術 

  訪問一個數據庫
  在一個其於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入口(entrypoint)定義一個Action類當你的經驗豐富了以後你也可以使用DispatchAction組合這些Action類你甚至可以定義一個簡單的框架Action用來調用所有的這些商務類你可以在contrib目錄裡找到Scaffold設計的ProcessAction這是一個框架Action的完整實現使用這種方案可以使用更少的Action類但你必須對Struts和MVC框架的底層實現有較深的理解不要害怕在開始的時候定義過多的ActionStruts的配置方案可以給予你充分的自由在以後重構你的設計因為你可以靈活的改變你的Action類而不會對應用程序造成影響
  
  在理想情況下商務邏輯層(business logic layer)應該封裝所有的數據訪問細節包括數據庫連接的獲得但是一些應用程序的設計要求調用者可以從一個DataSource對象來獲得數據庫連接遇到這種情況時Struts DataSource管理器可以使你在需要的時候配置這些DataSource資源
  
  Struts DataSource管理器在Struts配置文件(Strutsconfigxml)裡定義這個管理器可以用來分發和配置任何實現了javaxsqlDataSource接口的數據庫連接池(connection pool)如果你的DBMS或者容器內置了符合這些要求的連接池你可以優先選用它
  
  Jakarta的公共連接池實現 BasicDataSource
  如果你的手頭沒有連接池的本地(native)實現你可以使用Jakarta提供的公共連接池實現[monsdbcpBasicDataSource]它可以和DataSource管理器合作的很好另外Struts還在它的util包裡包含了一個GenericDataSource類這也是一個連接池實現但是這只是一個非常簡單的實現方案不推薦使用因為它可能在Struts的以後版本中被BasicDataSource或其它的數據源實現替換掉
  
  下面是一段Strutsconfigxml配置文件中的數據源配置(使用GenericDataSource數據源實現)你可以更改相應的設置以適合你自己的系統
  
  <! configuration for GenericDataSource wrapper >
  <datasources>
  <datasource>
  <setproperty
  property=autoCommit
  value=false/>
  <setproperty
  property=description
  value=Example Data Source Configuration/>
  <setproperty
  property=driverClass
  value=orgpostgresqlDriver/>
  <setproperty
  property=maxCount
  value=/>
  <setproperty
  property=minCount
  value=/>
  <setproperty
  property=password
  value=mypassword/>
  <setproperty
  property=url
  value=jdbc:postgresql://localhost/mydatabase/>
  <setproperty
  property=user
  value=myusername/>
  </datasource>
  </datasources>
  
  使用BasicDataSource數據源實現的配置方案如下
  <datasources>
  <! configuration for commons BasicDataSource >
  <datasource type=monsdbcpBasicDataSource>
  <setproperty
  property=driverClassName
  value=orgpostgresqlDriver />
  <setproperty
  property=url
  value=jdbc:postgresql://localhost/mydatabase />
  <setproperty
  property=username
  value=me />
  <setproperty
  property=password
  value=test />
  <setproperty
  property=maxActive
  value= />
  <setproperty
  property=maxWait
  value= />
  <setproperty
  property=defaultAutoCommit
  value=false />
  <setproperty
  property=defaultReadOnly
  value=false />
  <setproperty
  property=validationQuery
  value=SELECT COUNT(*) FROM market />
  </datasource>
  </datasources>
  
  注意你可以在你的應用系統中定義不止一個數據源你可以根據需要定義多個數據源並為它們分別起一個邏輯名(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 = dataSourcegetConnection();
  // 數據連接已經建立了你可以做你想做的事情了
  }
  catch (SQLException e)
  {
  getServlet()log(處理數據庫連接 e);
  }
  finally
  {
  // 在finally塊裡包含這些代碼
  // 用以保證連接最後會被關閉
  try
  {
  cnnclose();
  }
  catch (SQLException e)
  {
  getServlet()log(關閉數據庫連接 e);
  }
  }
  }
  
  注意如果你使用公共的BasicDataSource你提供給pingQuery屬性的查詢語句(如果你設置了話)必須至少要能返回一行記錄
  
  例子SELECT COUNT(*) FROM VALIDTABLE
  
  你可以把VALIDTABLE替換成你的數據庫中包含的任何有效的表
  
  使用多個數據源
  如果你需要在模塊(Module)中使用多於一個的數據源你可以在配置文件的<datasource>元素裡包含一個key屬性
  
  <datasource>
  <datasource key=A type=monsdbcpBasicDataSource>
  …屬性配置略 同上…
  </datasource>
  <datasource key=B type=monsdbcpBasicDataSource>
  …屬性配置略 同上…
  </datasource>
  </datasource>
  
  你代碼裡你可以通過這些key獲得不同的數據源代碼如下
  
  …
  try
  {
  dataSourceA = getDataSource(request A);
  dataSourceB = getDataSource(request B);
  …
  
  你可以根據需要為每一個模塊設置多個數據源但同一模塊裡每個數據源的key屬性必須唯一因為Struts模塊系統是以每一個模塊為單位管理命名空間的
  

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28362.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.