亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

StrutsHOW-TO系列之數據庫訪問

2019-11-18 13:53:23
字體:
來源:轉載
供稿:網友

  訪問一個數據庫
  在一個其于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="descr  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="pass
Word"
  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模塊系統是以每一個模塊為單位治理命名空間的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区精品99久久| 国产精品成人一区二区三区吃奶| 永久免费精品影视网站| 欧美黑人xxxⅹ高潮交| 国产日韩欧美综合| 久久影视电视剧免费网站| 亚洲精品免费网站| 久久免费视频在线| 久久久极品av| 国产欧美日韩精品丝袜高跟鞋| 欧美华人在线视频| 亚洲人高潮女人毛茸茸| 亚洲成人性视频| 欧美日韩午夜剧场| 美女久久久久久久久久久| 久久精品国产亚洲7777| 黑人巨大精品欧美一区二区| 日韩av中文字幕在线免费观看| 久久99久久亚洲国产| 色偷偷88888欧美精品久久久| 青青草原一区二区| 精品久久久久国产| 日韩小视频在线| 久久久精品久久| 国产精品香蕉av| 国产成人高清激情视频在线观看| 在线精品国产欧美| 国产激情久久久| 青青草国产精品一区二区| 日韩欧美亚洲范冰冰与中字| 国产美女久久精品香蕉69| 亚洲精品美女免费| 亚洲精品小视频在线观看| 色综合久久中文字幕综合网小说| 91在线中文字幕| 国产综合视频在线观看| 欧美精品免费播放| 米奇精品一区二区三区在线观看| 国产一区二区日韩精品欧美精品| 欧亚精品中文字幕| 国产97色在线|日韩| 97精品欧美一区二区三区| 精品久久久久久久久久久| 久久午夜a级毛片| 国产成人精品日本亚洲| 亚洲精品国产福利| 激情av一区二区| 国产精品久久久久久超碰| 欧美成人国产va精品日本一级| 久久九九免费视频| 国精产品一区一区三区有限在线| 国产精品亚洲视频在线观看| 亚洲国产另类 国产精品国产免费| 亚洲人成电影网| 久久噜噜噜精品国产亚洲综合| 96pao国产成视频永久免费| 欧美高清视频免费观看| 亚洲天天在线日亚洲洲精| 国产精品一区二区三区免费视频| 久久噜噜噜精品国产亚洲综合| 中文字幕亚洲欧美| 亚洲欧美精品suv| 伊人亚洲福利一区二区三区| 亚洲欧洲在线播放| 欧美电影在线观看高清| 亚洲人成网站色ww在线| 日韩免费电影在线观看| 久99九色视频在线观看| 久久成人这里只有精品| 亚洲精品电影网站| 久久噜噜噜精品国产亚洲综合| 亚洲精品v欧美精品v日韩精品| 国产精品第三页| 日韩日本欧美亚洲| 亚洲图片欧洲图片av| 欧美日韩免费在线观看| 91社影院在线观看| 原创国产精品91| 日韩大陆毛片av| 欧美日在线观看| 2019最新中文字幕| 青青久久av北条麻妃黑人| 亚洲国产精品va在线观看黑人| 国产精品劲爆视频| 55夜色66夜色国产精品视频| 久久综合色影院| 国产日韩欧美在线| 在线看片第一页欧美| 欧美激情国产日韩精品一区18| 国产成人精品999| 国产区精品视频| 日韩美女视频在线观看| 日韩av一区在线观看| 日韩在线精品一区| 中文字幕综合在线| 一本色道久久综合狠狠躁篇的优点| 亚洲va电影大全| 久久网福利资源网站| 欧美福利小视频| 大量国产精品视频| 国产啪精品视频网站| 日韩在线观看免费全集电视剧网站| 亚洲а∨天堂久久精品9966| 亚洲va男人天堂| 4k岛国日韩精品**专区| 欧美精品电影在线| 欧美高清在线观看| 久久精品国产96久久久香蕉| 国产精品欧美亚洲777777| 国产精品久久久久久久久久免费| 韩国精品美女www爽爽爽视频| 亚洲国产精品成人va在线观看| 亚洲欧美三级在线| 欧美视频不卡中文| 九九热精品视频在线播放| 午夜精品理论片| 国产精品啪视频| 91精品国产免费久久久久久| 亚洲国产精品yw在线观看| yellow中文字幕久久| 亚洲欧美国产一区二区三区| 久久99久国产精品黄毛片入口| 日本久久久久久久| 国产在线高清精品| 亚洲精品免费网站| 国产不卡视频在线| 亚洲第一偷拍网| 亚洲精品综合精品自拍| 精品一区二区三区四区在线| 57pao成人国产永久免费| 亚洲一区中文字幕在线观看| 亚洲国产精久久久久久久| 不卡av电影在线观看| 日本人成精品视频在线| 亚洲天堂第一页| 97人人爽人人喊人人模波多| 亚洲色图av在线| 欧美午夜精品伦理| 搡老女人一区二区三区视频tv| 国产婷婷97碰碰久久人人蜜臀| 欧美性xxxx18| 国产97色在线|日韩| 岛国av午夜精品| 日韩有码在线观看| 国产精品久久久精品| 美女黄色丝袜一区| 国产精品成人国产乱一区| 亚洲女人天堂色在线7777| 26uuu日韩精品一区二区| 成人精品福利视频| 午夜美女久久久久爽久久| 日韩精品免费在线观看| 中文字幕少妇一区二区三区| 亚洲天堂免费视频| www.久久色.com| 91国偷自产一区二区三区的观看方式| 国产第一区电影| 日韩成人av网址| 狠狠综合久久av一区二区小说| 伊人伊成久久人综合网小说| 日韩精品在线免费播放| 久久久精品视频在线观看| 91日韩在线播放| 在线播放精品一区二区三区|