隨筆 - 72  文章 - 28  trackbacks - 0
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(4)

          隨筆分類(66)

          隨筆檔案(72)

          文章檔案(19)

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          1. 一、什么是OGNL,有什么特點?   
          2.   
          3. OGNL(Object-Graph Navigation Language),大概可以理解為:對象圖形化導航語言。是一種可以方便地操作對象屬性的開源表達式語言。OGNL有如下特點:    
          4.   
          5. 1、支持對象方法調用,形式如:objName.methodName();   
          6.   
          7. 2、支持類靜態的方法調用和值訪問,表達式的格式為@[類全名(包括包路)]@[方法名  值名],例如:   
          8.   
          9. @java.lang.String@format('foo %s''bar')或@tutorial.MyConstant@APP_NAME;   
          10.   
          11. 3、支持賦值操作和表達式串聯,例如:   
          12.   
          13. price=100discount=0.8calculatePrice(),這個表達式會返回80;   
          14.   
          15. 4、訪問OGNL上下文(OGNL context)和ActionContext;   
          16.   
          17. 5、操作集合對象。   
          18.   
          19.     
          20.   
          21. 二、使用OGNL表達式   
          22.   
          23. OGNL要結合struts標簽來使用。由于比較靈活,也容易把人給弄暈,尤其是“%”、“#”、“$”這三個符號的使用。由于$廣泛應用于EL中,這里重點寫%和#符號的用法。   
          24.   
          25. 1、“#”符號有三種用途:   
          26.   
          27. (1)、訪問非根對象(struts中值棧為根對象)如OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:   
          28.   
          29.     
          30.   
          31. 名稱   
          32.  作用   
          33.  例子   
          34.     
          35. parameters   
          36.  包含當前HTTP請求參數的Map   
          37.  #parameters.id[0]作用相當于request.getParameter("id"   
          38.     
          39. request   
          40.  包含當前HttpServletRequest的屬性(attribute)的Map   
          41.  #request.userName相當于request.getAttribute("userName"   
          42.     
          43. session   
          44.  包含當前HttpSession的屬性(attribute)的Map   
          45.  #session.userName相當于session.getAttribute("userName"   
          46.     
          47. application   
          48.  包含當前應用的ServletContext的屬性(attribute)的Map   
          49.  #application.userName相當于application.getAttribute("userName"   
          50.     
          51.   
          52. 注:attr 用于按request session application順序訪問其屬性(attribute),#attr.userName相當于按順序在以上三個范圍(scope)內讀取userName屬性,直到找到為止。用于過濾和投影(projecting)集合,如books.{?#this.price<100};構造Map,如#{'foo1':'bar1''foo2':'bar2'}。   
          53.   
          54.     
          55.   
          56. (2)、用于過濾和投影(projecting)集合,如: books.{?#this.price>35    
          57.   
          58. books.{?#this.price>35}   
          59.   
          60. (3)、構造Map,如: #{'foo1':'bar1''foo2':'bar2'    
          61.   
          62. #{'foo1':'bar1''foo2':'bar2'}這種方式常用在給radio或select、checkbox等標簽賦值上。如果要在頁面中取一個map的值可以這樣寫:    
          63.   
          64. <s:property value="#myMap['foo1']"/>     
          65.   
          66. <s:property value="#myMap['foo1']"/>   
          67.   
          68. 2、“%”符號的用途是在標簽的屬性值被理解為字符串類型時,告訴執行環境%{}里的是OGNL表達式。   
          69.   
          70. 這是一開始最讓我不能理解的符號,原因是一些相關資源在表述時不太準備,經過一翻痛苦的探索,終于明白了它的用途。實際上就是讓被理解為字符串的表達式,被真正當成ognl來執行。很有點類似javascript里面的eval_r()功能,例如 :   
          71.   
          72. var oDiv eval_r("document.all.div"+index)     
          73.   
          74. var oDiv eval_r("document.all.div"+index)   
          75.   
          76. 當index變量為1時,語句就會被當作var oDiv document.all.div1  var oDiv document.all.div1來執行。%{}就是起這個作用。舉例:    
          77.   
          78. <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      
          79.   
          80. <s:property value="#myMap['key1']"/>      
          81.   
          82. <s:url value="#myMap['key1']" />    
          83.   
          84. <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   
          85.   
          86. <s:property value="#myMap['key1']"/>   
          87.   
          88. <s:url value="#myMap['key1']"/>   
          89.   
          90. 上面的代碼第2行會在頁面上輸出“value1”,而第3行則會輸出"#myMap['key1']"這么一個字符串。 如果將第3行改寫成這樣:    
          91.   
          92. <s:url value="%{#myMap['key1']}"/>     
          93.   
          94. <s:url value="%{#myMap['key1']}"/>   
          95.   
          96. 則輸出為“value1”。   
          97.   
          98.     
          99.   
          100.     
          101.   
          102. 這說明struts2里不同的標簽對ognl的表達式的理解是不一樣的。如果當有的標簽“看不懂”類似“#myMap['key1']”的語句時,就要用%{}來把這括進去,“翻譯”一下了。   
          103.   
          104. 3、“$”有兩種用途   
          105.   
          106. (1)、在國際化資源文件中,引用OGNL表達式。   
          107.   
          108. (2)、在Struts 2配置文件中,引用OGNL表達式:    
          109.   
          110. <action name="saveUser" class="userAction" method="save">   
          111.   
          112. <result type="redirect">listUser.action?msg=${msg}</result>   
          113.   
          114. </action>   
          115.   
          116. <action name="saveUser" class="userAction" method="save"      
          117.   
          118. <result type="redirect">listUser.action?msg=${msg}</result>   
          119.   
          120. </action>  

          posted @ 2014-01-08 13:58 kelly 閱讀(213) | 評論 (0)編輯 收藏
               摘要: Ibatis介紹與用例   一、介紹 ibatis 是一種“半自動化”的ORM實現。iBATIS是以SQL為中心的持久化層框架。能支持懶加載、關聯查詢、繼承等特性。iBATIS不同于一般的OR映射框架(eg:hibernate)。OR映射框架,將數據庫表、字段等映射到類、屬性,那是一種元數據(meta-data)映射。iBATIS則是將SQL查詢的參數和結果...  閱讀全文
          posted @ 2014-01-07 15:50 kelly 閱讀(377) | 評論 (0)編輯 收藏
               摘要: 深入Struts2的配置文件 本部分主要介紹struts.xml的常用配置。 1.1.    包配置: Struts2框架中核心組件就是Action、攔截器等,Struts2框架使用包來管理Action和攔截器等。每個包就是多個Action、多個攔截器、多個攔截器引用的集合。 在struts.xml文件中package元素用于定義包配置,每個pack...  閱讀全文
          posted @ 2014-01-07 15:39 kelly 閱讀(177) | 評論 (0)編輯 收藏
               摘要: 首頁要在web.xml中添加相應的struts配置: <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.ActionServlet </servle...  閱讀全文
          posted @ 2013-12-27 14:56 kelly 閱讀(200) | 評論 (0)編輯 收藏

          1   編寫目的 

          本文詳細介紹了DBCP連接池的各個配置參數的含義,并通過實際例子演示不同的參數設置可能參數的結果。

          2   適用對象 

            項目實施人員

          3   參考資料 

          4   知識文件主要內容4.1連接池知識簡介 

          總所周知建立數據庫連接是一個非常耗時耗資源的行為,因此現代的Web中間件,無論是開源的Tomcat、Jboss還是商業的websphere、weblogic都提供了數據庫連接池功能,可以毫不夸張的說,數據庫連接池性能的好壞,不同廠商對連接池有著不同的實現,本文只介紹拜特公司使用較多的開源web中間件Tomcat中默認的連接池DBCP(DataBase connection pool)的使用。

          4.2Tomcat下配置連接池 

          下面以tomcat5.5.26為例來介紹如何配置連接池

          1:需要的jar

          在tomcat的安裝目錄common\lib下有一個naming-factory-dbcp.jar,這個是tomcat修改后的dbcp連接池實現,同時為了能夠正常運行,還需要commons-pool.jar。

          2:建立context文件

          進入到conf\Catalina\localhost新建一個上下文文件,文件的名稱既為將來要訪問是輸入url上下文名稱,例如我們建立一個名為btweb的文件內容如下:

          <Context debug="0" docBase="D:\v10_workspace\build\WebRoot"
          reloadable="false">
          <Resource
          name="jdbc/btdb1"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
          username="v10"
          password="v10"

          driverClassName="oracle.jdbc.driver.OracleDriver"

          url="jdbc:oracle:thin:@127.0.0.1:1521:cahs"
          maxActive="5"
          maxIdle="3"
          maxWait="5000"
          removeAbandoned="true"

          removeAbandonedTimeout="60"

          testOnBorrow="true"
          validationQuery="select count(*) from bt_user"
          logAbandoned="true"


          />
          </Context>

          4.3參數分步介紹 

          u
          數據庫連接相關

          username="v10"
          password="v10"

          driverClassName="oracle.jdbc.driver.OracleDriver"

          url="jdbc:oracle:thin:@127.0.0.1:1521:cahs"

          u
          jndi相關

          name="jdbc/btdb1"
          type="javax.sql.DataSource"
          factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

          factory默認是org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory,tomcat也允許采用其他連接實現,不過默認使用dbcp。

          u
          連接數控制與連接歸還策略
          maxActive="5"

          maxIdle="3"

          minIdle=”2”
          maxWait="5000"

          u
            應對網絡不穩定的策略

          testOnBorrow="true"
          validationQuery="select count(*) from bt_user"

          u
          應對連接泄漏的策略
          removeAbandoned="true"

          removeAbandonedTimeout="60"


          logAbandoned="true"

             

          如下圖所示:連接池處于應用程序與數據庫之間,一方面應用程序通過它來獲取連接,歸還連接,另一方面連接又需要從數據里獲取連接,歸還連接。

          步驟1:系統啟動

          系統啟動時,初始化連接池,由于沒有任何請求連接池中連接數為0。

          maxActive="5"

          表示并發情況下最大可從連接池中獲取的連接數。如果數據庫不是單獨,供一個應用使用,通過設置maxActive參數可以避免某個應用無限制的獲取連接對其他應用造成影響,如果一個數據庫只是用來支持一個應用那么maxActive理論上可以設置成該數據庫可以支撐的最大連接數。maxActive只是表示通過連接池可以并發的獲取的最大連接數。

          從圖上我們可以看到連接的獲取與釋放是雙向,當應用程序并發請求連接池時,連接池就需要從數據庫獲取連接,那么但應用程序使用完連接并將連接歸還給連接池時,連接池是否也同時將連接歸還給數據庫呢?很顯然答案是否定的,如果那樣的話連接池就變得多此一舉,不但不能提高性能,反而會降低性能,那么但應用成歸還連接后,連接池如何處理呢?

          maxIdle="3"

          如果在并發時達到了maxActive=5,那么連接池就必須從數據庫中獲取5個連接來供應用程序使用,當應用程序關閉連接后,由于maxIdle=3,因此并不是所有的連接都會歸還給數據庫,將會有3個連接保持在連接池種中,狀態為空閑。

          minIdle=2

          最小默認情況下并不生效,它的含義是當連接池中的連接少有minIdle,系統監控線程將啟動補充功能,一般情況下我們并不啟動補充線程。

          問題:如何設置maxActive和maxIdle?

          理論上講maxActive應該設置成應用的最大并發數,這樣一來即便是在最大并發的情況下,應用依然能夠從連接池中獲取連接,但是困難時的是我們很難準確估計到最大并發數,設置成最大并發數是一種最優的服務質量保證,事實上,如果某個用戶登錄提示系統繁忙,那么在他再次登錄時,可能系統資源已經充足,對于拜特資金管理系統我們建議將maxActive設置為系統注冊人數的十分之一到二十分之一之間。例如系統的注冊人數為1000,那么設置成50-100靠近100的數字,例如85或90。


          maxIdle對應的連接,實際上是連接池保持的長連接,這也是連接池發揮優勢的部分,理論上講保持較多的長連接,在應用請求時可以更快的響應,但是過多的連接保持,反而會消耗數據庫大量的資源,因此maxIdle也并不是越大越好,同上例我們建議將maxIdle設置成

          50-100中靠近50的數字,例如55。這樣就能在兼顧最大并發同時,保持較少的數據庫連接,而且在絕大多情況,能夠為應用程序提供最快的相應速度。

          testOnBorrow="true"

          validationQuery="select count(*) from bt_user"

          我們知道數據庫連接從本質上架構在tcp/ip連接之上,一般情況下web服務器與數據庫服務器都不在同一臺物理機器上,而是通過網絡進行連接,那么當建立數據庫連接池的機器與數據庫服務器自己出現網絡異常時,保持在連接池中的連接將失效,不能夠在次使用,傳統的情況下只能通過重新啟動,再次建立連接,通過設置以上兩個參數,但應用程序從連接池中獲取連接時,會首先進行活動性檢測,當獲取的連接是活動的時候才會給應用程序使用,如果連接失效,連接將釋放該連接。validationQuery是一條測試語句,沒有實際意義,現實中,一般用一條最為簡單的查詢語句充當。

          removeAbandoned="true"

          removeAbandonedTimeout="60"

          logAbandoned="true"

          有時粗心的程序編寫者在從連接池中獲取連接使用后忘記了連接的關閉,這樣連池的連接就會逐漸達到maxActive直至連接池無法提供服務?,F代連接池一般提供一種“智能”的檢查,但設置了removeAbandoned="true"時,當連接池連接數到達(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)時便會啟動連接回收,那種活動時間超過removeAbandonedTimeout="60"的連接將會被回收,同時如果logAbandoned="true"設置為true,程序在回收連接的同時會打印日志。removeAbandoned是連接池的高級功能,理論上這中配置不應該出現在實際的生產環境,因為有時應用程序執行長事務,可能這種情況下,會被連接池誤回收,該種配置一般在程序測試階段,為了定位連接泄漏的具體代碼位置,被開啟,生產環境中連接的關閉應該靠程序自己保證。

          posted @ 2013-12-20 23:01 kelly 閱讀(1533) | 評論 (0)編輯 收藏
          僅列出標題
          共15頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 阜城县| 和静县| 泗阳县| 姚安县| 林芝县| 阳山县| 阜宁县| 西平县| 焉耆| 中西区| 竹山县| 文山县| 嘉义县| 肇州县| 滁州市| 临泉县| 沛县| 乌兰察布市| 新竹县| 满洲里市| 突泉县| 克东县| 密山市| 女性| 日土县| 旌德县| 阳城县| 石屏县| 尼勒克县| 宾川县| 灵山县| 蓝山县| 邹平县| 新乡市| 集安市| 永新县| 汝城县| 交口县| 定兴县| 高淳县| 永嘉县|