Struts2的OGNL標籤詳解

南夏發表於2015-12-11

Struts2的OGNL標籤詳解

一、Struts2可以將所有標籤分成3類:

UI標籤:主要用於生成HTML元素的標籤。

非UI標籤:主要用於資料庫訪問,邏輯控制等標籤。

Ajax標籤:用於Ajax支援的標籤。

對於UI標籤,則有可以分為兩類:

表當標籤:表單標籤主要用與生成HTML頁面的from元素,以及普通表單元素的標籤。

非表單標籤:非表單標籤主要用於生成頁面的樹、Tab頁等。

流程控制標籤:主要包含用於實現分頁、迴圈等流程的標籤。

資料訪問標籤:主要包含用於輸出ValueStack中的值,完成國際化等功能的標籤。

Struts2標籤庫分類圖:

二、使用Struts2標籤庫的準備:

1、  在Web.Xml檔案中增加標籤庫d定義。(如果應用使用的是Servlet2.3以前)

2、 現在jsp中使用taglib編輯指令匯入標籤庫,然後才可以使用標籤。

三、Struts2的OGNL標籤:

OGNL是Object Graphic Navigation Language的縮寫,它是一個開源專案。Struts2框架使用OGNL作為預設的表示式語言。

在傳統的OGNL表示式求值中,系統會假設系統只要一個根物件,但Struts2的Stack Context需要多個“根”物件,其中ValueStacke只是多個“根”物件的其中之一。

假設:使用標籤OGNL表示式求值,不是用Struts2的OGNL表示式是求之。如果系統的Context中包含兩個物件:foo物件,它在Context中的名字為foo;bar物件, 並且它在Context中的名為bar。將foo物件設定成Context的根物件。

返回foo.getBlah()方法的返回值#foo.blah

返回bar.getBlah()方法的返回值#bar.blah

可以看出ONGL表示式的語法非正常簡潔。

Struts2不知根據表示式從ValueStack中取的物件,還可以直接從物件中獲取屬性。Struts2提供了一個特殊的OGNL ProperAccessories(屬性訪問器),它可以自動搜尋棧內的所有實體(從上到下),直接找到求值表示式匹配的屬性。

Struts2使用標準的Context來進行OGNL表示式求值,OGNl處理的頂級物件是一個Context,這個Context物件就是一個Map型別例項,在該OGNL的Context中,有一個物件,這個根物件就是OGNL ValueStack,如果需要訪問ValueStack裡的屬性,例如:#取出Valuestack中的bar屬性:${bar};

除此之外:Struts2還提供了一些命名物件,這些命名物件與根物件無關,它們只是存在於Stack Context中。所以,訪問這些物件實現需要使用#字首來指明。

1、paramenters物件:用於訪問HTTP請求引數,

2、request物件:用於訪問HttpServletRequset的屬性(Attribute)的Map。例如#request.userName

3、Session物件:用於訪問HttpSession的屬性。例如#session.userName

4、Application物件:用於訪問ServletContext的屬性。例如#application.userName

5、Attr物件:如果可以訪問到,則訪問PageContext,否則將依次搜尋HttpServletRequset,HttpSession,ServletContext中的屬性。

值得注意的是:當系統建立Action例項後,該Action例項已經被儲存到ValueStack中,故無需書寫#即可訪問Action屬性。

OGNL中的集合(List/Map):

直接生成一個List型別的集合,該List物件中包含三個元素,都個元素之間以英文逗號隔開;

例:

<s:set name="list" value="{'song','li','xing'}" />

直接生成一個Map型別的集合,該Map物件中每個Key-value物件之間以英文冒號隔開:多項之間以英文逗號隔開。

例:

<s:set name="foobar" value="#{'1':'song', '2':'li', '3':'xing'}" />

Set標籤用於蔣某個值放入指定範圍:

Scope:指定變數被放置的範圍,該屬性可以接受aplication、session、requset、page、action。如果該屬性,則預設在OGNL Context中。

Value:賦給變數的值,如果沒有設定該屬性,則將ValueStack棧頂的值付給變數。

對於集合,OGNL提供了兩個與元素:in和not in,其中in判斷某個元素是否在指定集合中;not in則用於判斷某個元素是否不在指定集合中。 in表示式:   <s:if test="'foo' in {'foo','bar'}">     在   </s:if>   <s:else>    不在   </s:else>  not in表示式:  <s:if test="'foo' not in {'foo','bar'}">     不在  </s:if>  <s:else>     在 </s:else>

OGNL還允許通過某個規則取得集合的自己,取得集合子集有三個操作符:

1、?:取出所有符合選擇邏輯的元素

2、^:取出符合集合邏輯的第一個元素

3、$:取出符合選擇邏輯的最後一個元素

例:<s:iterator value="books. {?#this.price > 35}">      <s:property value="title" /> - $<s:property value="price" /><br></s:iterator>

在上面程式碼中,直接在集合後緊跟.{}運算子表明用於取出該集合的子集,{}內的表示式用於獲取符合集合的元素,this指的是為了從大集books刷選資料到小集合,需要對大集合books進行迭代,this代表當前迭代的元素。表示式用於獲取集合中價格大於35的書的集合。

(一)、控制標籤:

Struts2的非UI標籤包括控制標籤和資料標籤,主要用於完成流程控制,以及對ValueStack的控制,資料標籤主要用於訪問ValueStack中的資料;控制標籤可以完成輸出流程控制,例如分支,迴圈等操作,也可以對集合的合併,排列。

控制標籤有:

1、if:用於控制選擇器輸出的標籤;

2、else if: 與if標籤結合使用,用於控制選擇輸出的標籤;

3、else:與if標籤結合使用,用於控制選擇輸出的標籤;

4、append:將多個集合拼接成一個新的集合;

5、generator:字元解析器,用於將一個字串解析成一個集合;

6、Iterator:這是一個迭代器,用於將集合迭代輸出;

7、merge:用於多個集合拼接陳一個新的集合。但與appernd的拼接方式有所不同。

8、sort:用於對集合進行排序;

9、Subset:擷取集合的部分元素,形成新的子集;

If/elseif/else這三個標籤都是用於進行分支控制的,他們都是用於根據一個Boolean表示式的值,來確定是否計算、輸出標籤體的內容。

例:<s:set name="age" value="21" />

<s:if test="#age==23"> 23</s:if><s:elseif test="#age==21"> 21</s:elseif><s:else> 都不等</s:else> 

iterator標籤:

 用於對集合進行迭代,這裡集合包含List、Set和陣列,也可對Map型別的物件進行迭代輸出。Value、id、Status三個屬性都是可選屬性,如果沒有指定value屬性,則使用ValueStack棧頂的集合。

例:

<s:iterator var="u" value="users" status="sts">

     <s:property value="#sts"/>

     <s:property value="#u"/><br/>

 </s:iterator>

如果為<s:iterator/>標籤指定status屬性,即每次迭代時都會有一個IteratorStatus例項,該例項的方法包含如下幾個:

Int getCount():返回當前迭代了幾個元素;

Int getIndex():返回當前元素的索引;

Boolean isEven(): 當前元素的索引是否是偶數;

Boolean isFirst():當前元素是否是第一個元素;

Boolean isLast():當前元素是否是最後一個元素;

Boolean isOdd():當前元素的索引是否是奇數;

append標籤:

用於將多個集合拼接起來,組成一個新的集合,通過陣中的拼接,從而允許通過一個<s:iterator …./>標籤就完成對多個集合的迭代。

merge標籤的用法看起來很像append標籤,也是用於將多個集合拼接成一個集合但是採用的拼接方式與append不同,append是以集合位順序的拼接,merge是以元素位順序拼接;

generator標籤:指定字串按指定分隔符分隔成多個子串,臨時生成多個子串可以使用iterator標籤來迭代輸出。可以理解我generator將一個字串轉化成一個集合,在該標籤的標籤體內,整個臨時生成的集合將位於Valuestack的頂端,但一旦該標籤結束,該集合將被移除Valuestack。

屬性有count:指定生成集合中元素的總數,separator:指定用於解析字串的分隔符;val:指定被解析的字串;converter:制定一個轉化器,該轉化器負責將集合中的每個字串轉化成物件;id:可選屬性,制定了該屬性,則將生成的集合放在pageContext屬性中;

Subset標籤:用於取得集合的子集,該標籤的底層通過org.apache.Struts2.util.Subset.IteratorFilter類提供實現。屬性有:

count:指定生成集合中元素的總數,如果不指定該屬性,預設取得源集合的全部元素。還有source,start,decider屬性;

subset標籤生成的子集放在ValueStack的棧頂,如果該標籤結束後,該標籤生成的子集將被移除出ValueStack棧。

Sort標籤指定集合元素進行排序,進行排序是=時,必須提供自己的排序規則,即使實現自己的Comparator,自己的Comparator需要實現java.util.Comparator介面。屬性有:

Comparator:該屬性指定進行排序的Comparator例項。source:該屬性指定排序的集合。如果不指定該屬性,則對ValueStack棧頂的集合進行排序。

(二)、資料標籤:

資料標籤主要用於提供各種資料範文相關的功能,包含顯示一個Action裡的屬性,以及生成國際化輸出等功能,

資料標籤主要包含:action,bean,date,debug,i18n,include,param,push,set,text,url,property;

1、 action:用於直接在JSP頁面直接呼叫一個Action,通過指定executeResult引數,還可以將該Action的處理結果包含到本頁面中來。如果指定了executeResult引數的屬性值為true,該標籤還會把Action的處理結果包含到本頁面中來。屬性有:

i. id:該屬性會作為該Action的應用ID

ii. name:指定該標籤呼叫哪個Action

iii. nameSpace:指定該標籤呼叫的Action所在的namespace

iv. executeResult:該是屬性指定是否要將action 的處理結果頁面包含到本頁面。預設值為false,即不包含。

v. ignoreContextParams:指定該頁面中的引數是否需要轉入呼叫Action,該引數的預設值是false,即將本頁面的請求引數傳入被呼叫的Action。

2、bean:用於建立一個JavaBEan例項,如果指定id屬性,則可以將建立的JavaBean例項放入Stack Context中。屬性有name:指定要例項化的JavaBean的實現類;id:該屬性是個可選屬性,指定該屬性後該例項JavaBean例項會被放入到Stack Context中(並不是ValueStack) ,從而允許直接通過該id屬性來訪問該JavaBean例項;

3、date:用於格式化輸出一個日期。屬性有:format:根據該屬性指定的格式來個事化日期;nice:該屬性只能為true或false,它用於指定是否輸出指定日期和當前時刻之間的時差;name指定要格式化的日期值;id:制定引用該元素的id值。

4、debug:主要用於輔助除錯,在頁面上生成一個除錯連結,通過該連結到ValueStack和Stack Context中的所有的值資訊;

例:<s:debug />

5、i18n:用於制定國際化資源的檔案的baseName

6、include:用於JSP頁面中包含其他的JSP或Servlet資源,屬性有value:指定需要被包含的JSP頁面或者Servlet;id指定該標籤的ID引用

例:<s:include value=”include-file.jsp”>

<s:param name=”author” value=”yeeku”/>

</s:inlcude>

7、param:通常用作bean標籤,url標籤的子標籤,屬性有name:指定需要設定引數的引數名;value:指定需要設定引數的引數值;id:指定引用該元素的ID

例:<s:param name=”color”>blue</param>

或<s:param name=”color” value=”blue”/>

8、push:用於將某個值放到ValueStack的棧頂。屬性有:value:該屬性指定需要放到ValueStack棧頂的值;id:指定引用該元素的ID

例:<s:push value=”#p”>

<s:property value=”name”/><br>

</s:push>

9、set:用於設定一個新變數,並可以將新變數放入到指定的範圍內,屬性有name:重新生成的新變數的名字;scope:可選屬性,指定新變數被放置的範圍,屬性值有application、session、requset、page、action,沒有指定屬性,則預設為放置到Stack Context中;value:指定將賦值給變數的值,如果沒有制定該屬性,則將ValueStack棧頂的支付給行變數;id:指定該元素的引用ID;

例:<s:set value=”#p” name=”xxx”/>

10、text:用於輸出國際化訊息

11、url:用於生一個URL地址,屬性有:includeParams該屬性指定包含的引數,屬性值只能為none,get,all;scheme用於設定scheme屬性;value指定生成URL的地址值,如果value不提供就有action屬性指定的Action作為URL地址;action指定生成URL的地址為那個Action,如果不提供,就用valuezuoweiURL的地址值;namespace;

method;encode指定是否需要encode指定是否需要encode請求屬性;includeContext指定是否需要將上下文包含在URL地址中;anchor指定URL的錨點;id;

12、property:用於生成輸出某個值,包括輸出ValueStack,Stack,Context和Action Context中得值。屬性有default如果需要輸出的屬性值為null,則顯示的default屬性指定的值;espcape指定是否escape HTML程式碼;value 到指定需要輸出的屬性值,如果沒有指定該屬性,則預設輸出ValueStack棧頂的值;id指定該元素的標識;

(三)、表單標籤

Struts2的表單標籤,可分為兩種:form表單本身和單個表單元素的標籤。Form標籤本身的行為不同於表單元素的標籤。Struts2的表單元素標籤都包含了非常多的屬性,但有很多屬性完全是通用的。

1)、 表單標籤的通用屬性

所有表單標籤處理類都繼承了UIBean類,UIBean包含了一些通用屬性,分為3種:

1、 模板相關屬性

2、 JavaScript相關屬性

3、 通用屬性

除此之外,所有表單元素標籤都存在一個特殊屬性:form,通過該屬性可以實現表單元素和表單之間的互動。例如,我們可以通過${parameters.form.id}來取得表單元素所在表單的ID。下面是表單標籤的通用屬性。

模板相關的通用屬性如下:

1、 templateDir:指定該表單所用的模板檔案目錄。

2、 theme:指定該表單所用的主題

3、 template:指定該表單所用的模板

JavaScript相關的通用屬性如下:

1、 onclick:指定滑鼠在該標籤生成的表單元素上單擊時觸發的JavaScript函式。

2、 ondbclick:指定滑鼠在該標籤生成的表單元素上雙擊時觸發的JavaScript函式。

3、 onmousedown:指定滑鼠在該標籤生成的表單元素上按下時觸發的JavaScript函式。

4、 onmouseup:指定滑鼠在該標籤生成的表單元素上鬆開時觸發的JavaScript函式。

5、 onmouseover:指定滑鼠在該標籤生成的表單元素上懸停時觸發的JavaScript函式。

6、 onmouseout:指定滑鼠移除該標籤生成的表單元素時觸發的函式。

7、 onfocus:指定該標籤生成的表單元素得到焦點時觸發的函式。

8、 onblur:指定該標籤生成的表單元素失去焦點時觸發的函式。

9、 onkeypress:指定單擊鍵盤上某個鍵時觸發的函式。

10、onkeyup:指定鬆開鍵盤上某個鍵時觸發的函式。

11、onkeydown:指定按下鍵盤上某個鍵時觸發的函式。

12、onselect:對下拉選單項等可以選擇表單的元素,指定選中該元素時觸發的JavaScript函式。

13、 onchange:對於文字框等可以接受輸入的表單元素,指定當值改變時觸發的javaScript函式。

因為Html本身的限制,並不是每個Html元素都可以觸發以上的所有函式。因此,上面的屬性並不是對Struts2 的每個標籤都有效。

Struts2還允許為表單元素設定提示,單滑鼠在這些元素上停懸時,系統將出現提示。Struts2將這種特性稱為Tooltip。相關的通用屬性如下:

1、 tooltip:設定此元件的Tooltip。

2、 tooltipIcon:設定Tooltip圖示的URL路徑。

3、 tooltipAboveMousePointer:是否在游標位置上顯示Toopltip。也可以通過設定tooltipOffseY屬性,設定Tooltip與游標位置的垂直位移。

4、 tooltipBgColor:設定Tooltip的背景色。

5、 tooltipBgImg:設定Tooltip的背景圖片。

6、 tooltipBorderWidth:設定Tooltip邊框的寬度

2)、 表單標籤的name和value屬性

Name和value屬性之間存在一個獨特的關係:因為表單元素的name屬性會對映到Action的屬性當對應的Action已經被例項化,且對應屬性有值時,表單元素會顯示出該屬性的值,該值就是表單元素的value值。

3)、 checkboxlist標籤

checkboxlist標籤可以一次建立多個核取方塊,要根據list屬性指定的集合。還有兩個常用的屬性。

1、 listKey:該屬性指定集合元素中的某個屬性作為核取方塊的value值

2、 listValue:該屬性指定集合元素中的某個屬性作為核取方塊的標籤。

4)、 doubleselect標籤

doubleselect標籤會生成一個級聯列表框(會生成兩個下拉選單框),當選第一個列表框時,第二個的內容也會隨之改變。常用屬性如下:

1、 list:指定用於輸出第一個下拉選單框中選項的集合

2、 listKey:該屬性指定集合元素中的某個屬性作為核取方塊的value值

3、 listValue:該屬性指定集合元素中的某個屬性作為核取方塊的標籤。

4、 doubleList:指定用於輸出的第一個下拉選單框中選項的集合

5、 doubleList key:該屬性指定集合元素中的某個屬性作為核取方塊的value值

6、 doubleList Value:該屬性指定集合元素中的某個屬性作為核取方塊的標籤。

7、 doubleName:指定第二個下拉選單框的name屬性。

一、 head標籤

二、 optiontransferseselect標籤

三、 select標籤

四、 radio標籤

五、 optgroup標籤

六、 token標籤

七、 updownselect標籤

非表單標籤

一、 actionerror和actionmessage標籤

二、 component標籤

三、 tree和treenode初步

相關文章