一: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,唯一的),所以在實現時應保證其安全執行緒.