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初步