Struts 2 學習筆記

來源:互聯網
上載者:User

一:Struts2和Struts1 的比較
 在Action實作類別方面的對比:Struts 1要求Action類繼承一個抽象基類;

 線程模式方面的對比:Struts 1 Action是單例模式並且必須是安全執行緒的,因為僅有Action的一個執行個體來處理所有的請求。
 Struts 2 Action對象為每一個請求產生一個執行個體,因此沒有安全執行緒問題。

 Servlet依賴方面的對比:Struts 1 Action依賴於Servlet API,因為Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
 Struts 2 Action不再依賴於Servlet API,從而允許Action脫離Web容器運行,從而降低了測試Action的難度。

 封裝請求參數的對比:Struts 1使用ActionForm對象封裝使用者的請求參數,所有的ActionForm必須繼承一個基類:ActionForm。
 Struts 2直接使用Action屬性來封裝使用者請求屬性,避免了開發人員需要大量開發ActionForm類的煩瑣,

 Action執行控制的對比:Struts 1支援每一個模組對應一個請求處理(即生命週期的概念),但是模組中的所有Action必須共用相同的生命週期。
 Struts 2支援通過攔截器堆棧(Interceptor Stacks)為每一個Action建立不同的生命週期。開發人員可以根據需要建立相應堆棧,
 從而和不同的Action一起使用。

二:#,%,$三種符號的使用
 # 的三種用法
 1. 訪問OGNL上下文和Action上下文,#相當於ActionContext.getContext();下表有幾個ActionContext中有用的屬性:     
 parameters    包含當前HTTP請求參數的Map    #parameters.id[0]作用相當於request.getParameter("id")  
 request   包含當前HttpServletRequest的屬性(attribute)的Map    #request.userName相當於request.getAttribute("userName")  
 session   包含當前HttpSession的屬性(attribute)的Map   #session.userName相當於session.getAttribute("userName")  
 application   包含當前應用的ServletContext的屬性(attribute)的Map     #application.userName相當於application.getAttribute("userName")  
 attr 用於按request > session > application順序訪問其屬性(attribute)    #attr.userName相當於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到為止  
  2. 用於過濾和投影(projecting)集合,如books.{?#this.price<100};  
 對於集合元素,ognl運算式可以使用in和not in來判斷某個元素是否在指定的元素集合中,如
 <s:if test=" 'a' in {'a','b'.'c'}"> or <s:if test=" 'a' not in {'a','b'.'c'}"> 
 除了in和not in,此外還允許使用某個規則來獲得集合對象的子集,常用的有如下3個操作符:
 ?:獲得所有符合邏輯的元素
 ^:獲得符合邏輯的第一個元素
 $:獲得符合邏輯的最後一個元素
 如:<s:iterator value="persons.{?#this.age > 25}">,擷取集合persons中age>25的子集合再做遍曆。

  3. 構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
 
 %的用法
 %符號的用途是在標誌的屬性為字串類型時,計算OGNL運算式的值。
 構造Map:
 <s:set name="person" value="#{'name':'zxx','age':21}" />
 <p>The value of key "foo1″ is <s:property value="#person['name']" /></p>
 <p>不使用%:<s:url value="#person['name']" /></p>
 <p>使用%:<s:url value="%{#person['name']}" /></p>

 <p>不使用%:<s:property value="#person['name']" /></p>
 <p>使用%:<s:property value="%{#person['name']}" /></p>

 結果顯示為:
 The value of key "foo1″ is zxx
 不使用%:#person['name']
 使用%:zxx
 不使用%:zxx
 使用%:zxx
 可以看出:<s:property>比<s:url>要強悍很多

 

三:Struts2 國際化
 國際化檔案命名格式:名稱_語言代碼_國家代碼.Properties
 比如在src下建立globalMessages_zh.properties.
 編輯globalMessages_zh.properties檔案label.title=hello,world

 在struts.properties 檔案中加入這句話
 struts.custom.i18n.resources=globalMessages
 或者直接在struts.xml中加入
 <constant name="struts.custom.i18n.resources" value="globalMessages"></constant>
 jsp 中訪問:<s:text name="label.title"/>

 

四:Struts2 IOC
 1. Struts 2會為每一個請求建立一個Action對象,所以在定義Action時,使用scope="prototype"。
 這樣Spring就會每次都返回一個新的Action對象了;

 2. 因為ServiceImpl被配置為預設的scope(也即是singleton,唯一的),所以在實現時應保證其安全執行緒.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.