程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Unmi的Struts2學習筆記(八)

Unmi的Struts2學習筆記(八)

編輯:關於JAVA

吾同人數進寺廟,卻從未點過一柱香。概因精神世界裡終無所寄托。既不為生 兒還是女而籌算,也無須因落下虧心事要請得神靈庇佑。想來,真要的東西,阿 彌陀佛也給不了。在物價飛漲之際,誰能給你加薪,何來民主,看看這輩子能不 能有機會參與選一回國家領導人,少說幾句了,就這點言論自由了。

1. Struts 2 標簽庫以 OGNL 表達式為基礎,對集合、對象的訪問功能更強了 。Struts 2 的標簽用統一的前綴,一般為 "s",不再像 Struts1 那樣分 <html:.../>、<bean:.../>、<logic:.../> 等多個命名空間 的標簽。如果在 JSP 2.0 之前用過 JSTL,也就知道什麼是 OGNL 表達式的。

2. Struts2 提供了很多 Struts1 標簽沒有的東西,如日歷、樹型控件、Tab 頁等;同時可借助 DWR,有標簽支持 Ajax,除此還提供了主題、模板,還允許在 頁面中使用自定義組件。Struts2 標簽都定義在 URI 為 "/struts-tags" 的命名 空間下,Struts2 的標簽庫功能很強大,使用起來卻更簡單。

3. 同 Struts1 相比,Struts2 的標簽庫不依賴於作何表現層技術,即大部分 標簽,不光能在 JSP 中用,還能在 Velocity 和 FreeMarker 等模板中用。 Struts1 中要支持 EL,必須引入 struts-el.jar 和 JSTL 類庫;而 Struts2 默 認支持 OGNL、JSTL、Groovy 和 Velocity 表達式。

4.Struts2 的標簽定義文件是在 Struts2-core-2.x.x.jar 的 META-INF 目錄 中的 struts-tags.tld。相比 Struts1 的標簽定義是在 struts.jar 的 META- INF/tld 目錄下的 struts-bean.tld、struts-html.tld等(Struts1 從 1.3 開始 ,包也分成了 struts-core-1.3.x.jar 和 struts-taglib-1.3.x.jar,所以 struts-bean.tld、struts-html.tld 等就在 struts-taglib-1.3.x.jar 的 META-INF/tld 目錄下)。

5. Servlet 2.4 開始的應用在啟動時會遞歸搜索 classpath 下的 tld 文件 加載;Servlet 2.3 的應用在啟動時好像會自動搜索 WEB-INF 目錄下的 tld 文 件加載,再之前的 Servlet 版本就必須在 web.xml 文件中加上<taglib>來指定 tld。

6. XWork 在原有的 OGNL 基礎上增加了對 ValueStack 的支持。Struts2 的 Stack Context 需要多個“根”對象,其中 ValueStack 只是多個“根”對象的 其中之一。如果要訪問的屬性屬於根對象,則可以直接訪問該屬性,否則必須使 用一個命名空間,如 #bar。

ValueStack 是以屬性名為 "struts.valueStack" 的 com.opensymphony.xwork2.util.OgnlValueStack 對象存在於 request 中的。

7. Struts2 中,系統的 ValueStatck 是 OGNL 表達式的第一個根對象 (key=com.opensymphony.xwork2.util.ValueStack.ValueStack),如果最近的 Action 存在,則 Action 上下文是第二個根對象 (key=com.opensymphony.xwork2.ActionContext.name,只是 Action 的名字而已 )。可以用 <s:debug/>顯示出 Stack Contenxt 和Value Stack Contents 。

8. 標准 OGNL 表達式是:"#" 表示從根開始,例如 request 是一個根

<s:property value = "#request['struts.request_uri']" /> 輸出 當前請求的 URI,因為 "struts.request_uri" 包含有 ".",不然也可以用 #request.xxx 的形式。

如果,只寫成屬性名,說明是根對象的 name 屬性,但 Struts2 會有多個根 對象,會不明確,因此這個時候 <s:property value="${name}"/>就會訪 問 ValueStack 中的對象的屬性 name-- ValueStack 是 OGNL 表達式的一個根對 象。

9. Struts2 提供了一個特殊的 OGNL 訪問器,對 ValueStack 從上至下搜索 匹配。例如,ValueStack 中 有兩個實例 Animal(name,species) 和 Login (name,salary),括號中表示所含屬性。如下的 Action 類

public class LoginActionimplements ModelDriven<Animal>{
   privateAnimalanimal = new Animal();
    private Stringname ="Unmi";
    privateString salary = "little";
    public Animal getModel(){
      return animal;
   }
    ...............................................
  }

就會在 ValueStack 中壓入兩個對象,分別是 LoginAction 實例和animal 實例,animal 在棧頂,那麼

<s:property value="species"/>  顯示 animal 的 species 屬性

<s:property value="salary"/>  顯示LoginAction 實例的salary 屬性

<s:property value="name"/>  顯示 animal 的name 屬性,因為自 棧頂向下先匹配到 animal 的 name 屬性

此時,如果我需要獲取 LoginAction 實例的 name 誰能告訴我如何取,如果 已知 LoginAction 的實例名的話,還能

<s:property value="?LoginAction?.name" /> 這裡怎麼才能行得通 呢?壓棧也不帶實例名稱的啊!

幸好,還可以通過索引來訪問 ValueStack 中的對象

<s:property value="[1].name"/> 顯示 LoginAction 實例的 name 屬性 "Unmi"。這樣寫就會從棧的第二個位置找起,首先找到的就是 LoginAction 實例了。

這一部分還有些含混不清,ValueStack 還能如何壓入值。

10. 最後,Struts2 還在 Stack Context 中放了一些命名對象,parameters 、request、session、application、attr 來訪問對應屬性。如 request ['name'] 或 request.name 訪問請求 name 屬性。特別說明一下 attr 對象,依 次搜索 PageContext、HttpServletReqeust、HttpSession、ServletContext 中 相應屬性。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved