三大框架課件ajaxjquery等課程b.講義第四章struts2標簽庫_第1頁
三大框架課件ajaxjquery等課程b.講義第四章struts2標簽庫_第2頁
三大框架課件ajaxjquery等課程b.講義第四章struts2標簽庫_第3頁
三大框架課件ajaxjquery等課程b.講義第四章struts2標簽庫_第4頁
三大框架課件ajaxjquery等課程b.講義第四章struts2標簽庫_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章Struts2標簽庫學習目標Struts2標簽庫概述Struts2數(shù)據標簽Struts2控制標簽Struts2表單標簽Struts2非表單標簽Struts2標簽庫概述Struts2標簽庫的組成Struts2框架的標簽庫可以分為以下三類:用戶界面標簽(UI標簽):主要用來生成HTML元素的標簽。表單標簽:主要用于生成HTML頁面的FORM元素,以及普通表單元素的標簽。非表單標簽:主要用于生成頁面上的tree,Tab頁等。非用戶界面標簽(非UI標簽):主要用于數(shù)據訪問,邏輯控制。數(shù)據訪問標簽:主要包含用于輸出值棧(ValueStack)中的值,完成國際化等功能的標簽。流程控制標簽:主要包含用于實現(xiàn)分支,循環(huán)等流程控制的標簽。AJAX標簽:用于支持Ajax效果Struts2標簽庫在早期的WEB開發(fā)中,JSP視圖控制和顯示技術主要依靠Java腳本來實現(xiàn),這樣一來,JSP頁面重新嵌入了大量的Java腳本代碼,給開發(fā)帶來了極大的不方便。從JSP1.1規(guī)范后,JSP增加了自定義標簽庫的支持。標簽庫是一種組件技術,通過標簽庫,可以將復雜的Java腳本代碼封裝在組件中,開發(fā)者只需要使用簡單的代碼就可以實現(xiàn)復雜的Java腳本功能。提供了Java腳本的復用性,提高了開發(fā)者的開發(fā)效率。Struts2標簽庫相對struts1.x進行了巨大的改進,支持OGNL表達式,不再依賴任何表現(xiàn)層技術。Struts2標簽的使用我們可以在struts2-core-2.0.11.jar壓縮文件的META-INF目錄下找到struts-tags.tld文件,這個文件里定義了Struts2的標簽。要在jsp中使用Struts2的標志,先要指明標志的引入。通過jsp的代碼的頂部加入以下的代碼:

<%@taglibprefix="s"uri="/struts-tags"%>Struts2標簽語法(一)Struts2的標簽都支持動態(tài)數(shù)據的訪問,標簽的屬性都可以使用OGNL表達式,struts2標簽的屬性具有類型,這些類型可以簡單地分為字符串類型和非字符串類型,對于字符串類型的屬性,如果要訪問動態(tài)數(shù)據,需要使用%{…}這樣的語法,例如:<s:includevalue=“%{url}”/>Include標簽的value屬性是字符串類型,Struts2將對這個屬性進行解析,查找符合%{…}樣式的字符串,然后將花括號之間的內容作為OGNL表達式進行求值。如果屬性中沒有%{…}樣式的字符串,那么屬性的值將被直接看成是字符串數(shù)據。例如:<s:includevalue=“urlTag.action”/>對于非字符串類型的屬性值,將直接作為OGNL表達式進行求值。例如:<s:propertyvalue=“username”/>property標簽的value屬性是Object類型,它的值username將作為OGNL表達式進行求值,結果是值棧中位于棧頂?shù)膶ο蟮膗sername屬性的值。如果要為非字符串類型的屬性直接指定字符串數(shù)據,那么需要使用OGNL中的字符串常量,即用單引號(‘)或雙引號(“)將字符串括起來。例如:<s:propertyvalue=“’zhangsan‘”/>value屬性的值‘zhangsan’作為字符串常量,計算結果就是zhangsan,因此輸出zhangsan。Struts2標簽語法(二)除上述用法之外,也可以使用%{…}這樣的語法來指定字符串常量。例如:<s:propertyvalue=“%{‘zhangsan’}”/>在這種情況下,%{}將被忽略,花括號中的內容將作為表達式被計算??偨Y一下,struts2標簽的屬性按照下列的三個規(guī)則進行計算。(1)所有的字符串屬性類型都會解析“%{…}”這樣的語法。(2)所有的非字符屬性類型都不會被解析,而是直接被看作一個OGNL表達式進行求值(3)對于第二個規(guī)則的例外情況是,如果非字符串屬性使用了“%{…}”語法,那么%{…}將被忽略,花括號中的內容將作為表達式計算。如果大家在使用標簽時,忘記了某個屬性是字符串類型,還是非字符串類型,那么有一個簡單的方法,那就是不考慮它是什么類型,統(tǒng)一使用“%{…}”語法。Struts2通用標簽Struts2中通用標簽可以分為二類:控制標簽和數(shù)據標簽??刂茦撕炗糜诔尸F(xiàn)頁面時控制執(zhí)行流程,數(shù)據標簽用于訪問值棧中的數(shù)據。數(shù)據標簽:用于訪問ActionContext和值棧中的數(shù)據。數(shù)據標簽包括:Property(顯示后臺值) set push param bean action(加載公共頁面(頁首)、首頁多個模塊的同時加載)

include url a i18n(國際化)

text(國際化)

date(日期)

debug(調試代碼、獲取詳細信息)控制標簽:用于在呈現(xiàn)結果頁面時控制程序的執(zhí)行流程,根據程序執(zhí)行的狀態(tài)輸出不同的結果,控制標簽包括下列標簽:if/elseif/else iterator append mergegenerator subset sort 數(shù)據標簽property標簽property標簽用于輸出值棧中的對象的屬性(property)值,使用value屬性來指定要輸出的對象屬性,如果沒有指定value屬性,那么默認輸出棧頂對象。property標簽屬性在前面的章節(jié)中,我們已經使用過了property標簽,我們再看一個例子:<s:propertyvalue=“username”default=“游客”/>取出棧頂對象(通常是action)的username屬性并輸出,如果沒有找到username屬性,那么輸出”游客”。數(shù)據標簽set標簽Set標簽將一個值賦給指定范圍內變量。Set標簽在某些情況下是比較有用的,例如在頁面中多次引用一個復雜的表達式,我們可以將這個表達式賦給一個變量,然后直接引用變量。帶來的好處就是:提升了性能(表達式的計算只有一次)提高了代碼的可讀性。

set標簽屬性Set標簽以name屬性的值作為鍵(key),將value屬性的值保存到指定的范圍對象中。屬性scope取值中的page,request,session,application同JSP的4種范圍,如果指定了action范圍(默認值),value屬性的值將被同時保存到request范圍和OgnlContext中。示例:訪問地址:數(shù)據標簽push標簽push標簽用于把一個值壓入值棧(位于棧頂),注意和set標簽的區(qū)別,set標簽是將值放到action上下文中。當push標簽結束后,push標簽放入值棧中的對象將被刪除,換句話說,要訪問push標簽壓入棧中的對象,需要在標簽內部去訪問。 push標簽的屬性public

classUser{

privateStringusername;

privateStringemail;

privateStringsex;省略set/get方法}Push標簽示例訪問:數(shù)據標簽param標簽param標簽被用作其他標簽的子標簽,用于為其他標簽提供參數(shù),例如:為bean標簽和include標簽提供參數(shù)。 param標簽的屬性當使用param標簽時,參數(shù)的值可以通過value屬性給出,也可以在標簽體中給出(開始標簽和結束標簽之間的文本)。這二種用法有一些區(qū)別。我們看下面的例子:<paramname=“color”>blue</param><!--(1)--><paramname=“color”value=“blue”/><!--(2)-->在第(1)種情形中,參數(shù)值將作為java.lang.String對象(即字符串)被放入棧中;在第(2)種情形中,參數(shù)值將作為表達式進行計算,如果blue不存在,則color參數(shù)的值為null。在第(1)種情形中,要為color指定字符串值,可以寫為:<paramname=“color”value=“‘blue‘”/>或者<paramname=“color”value=“%{‘blue‘}“/>使用單引號包圍字符串,表明這是一個字符串常量數(shù)據標簽bean標簽bean標簽用于實例化一個JavaBean對象(必須遵照JavaBean規(guī)范),bean標簽的標簽體內可以包含多個param標簽,用于設置Bean的屬性(必須有相應的setter方法)。如果指定了id屬性,則創(chuàng)建的Bean實例將被放入到OgnlContext中。 bean標簽的屬性注意:id屬性是可選的,無論是否指定id屬性,bean標簽創(chuàng)建的JavaBean實例都會被壓入到值棧的頂部,在bean標簽內部可以直接訪問創(chuàng)建的對象,無須使用”#”標記,當bean標簽結束的時候,bean標簽創(chuàng)建的實例將從值棧中刪除。如果指定了id屬性,那么bean標簽創(chuàng)建的JavaBean實例還將被放到OgnlContext中,這樣在bean標簽的外部,也可以訪問創(chuàng)建的對象了,不過此時就要使用”#”標記了。bean標簽示例說明在沒有指定id屬性的情況下,創(chuàng)建的User對象只被壓入值棧,在bean標簽的內部使用property標簽可以直接訪問User對象的屬性。在bean標簽外部,由于值棧中的User對象已被刪除,所以無法訪問到User對象的屬性了。在指定了id屬性的情況下,創(chuàng)建的User對象除了被放到值棧中外,還被放到action上下文中,因此在標簽的內部和外部都可以訪問User對象屬性,只不過在標簽外部訪問時需要添加#user前綴,訪問路徑:數(shù)據標簽action標簽通過指定action的名字和可選的名稱空間,action標簽允許你在JSP中直接調用action。如果將標簽的excuteResult屬性設為true,那么action對應的結果輸出也將被包含到本頁面中。在action標簽的標簽體中可以嵌套param標簽,向action傳遞參數(shù)。 action標簽的屬性如果指定了id屬性,則action將被放到OgnlContext中,在action標簽結束后,可以通過#id來引用action.ActionTagAction.javaactionTagSuccess.jspactionTag.jsp示例說明在第一個action標簽調用中,執(zhí)行了結果,但沒有設置ActiontagAction的username和email屬性,所以結果頁面中的這兩項輸出為空。在第二個action標簽調用中,不執(zhí)行結果,調用ActionTagAction的doDefault()方法,在這個方法中,我們在請求對象中設置了greeting屬性,在頁面中使用property標簽,通過表達式#attr.greeting來獲取greeting屬性。在第三個action標簽調用中,執(zhí)行了結果,并通過param標簽設置了ActionTagAction的username和email屬性,在結果頁面中通過property標簽輸出這兩個屬性的值。訪問路徑:數(shù)據標簽include標簽iinclude標簽示例說明在jsp2.jsp中,我們使用JSP的EL表達式來獲取傳的請求參數(shù)。注意:在include標簽內部使用param標簽向被包含的頁面?zhèn)鬟f的請求參數(shù),不能使用如下的property標簽來訪問:<s:propertyvalue=“#parameters.username”/>#parameters引用的實質是一個Map對象,并不等同于HttpServletRequest對象。在包含頁面時,如果頁面中有中文,將會出現(xiàn)亂碼,要解決這個問題,可以在struts.xml文件中配置struts.i18n.encoding屬性,如下:<constantname=“struts.i18n.encoding”value=“gbk”/>訪問路徑:<a標簽<htmlxmlns=""><head><title>A標簽的使用</title><s:headtheme="ajax"/></head><body><s:urlid="as"value="/DivService.action"></s:url><divid="show">初始數(shù)據</div><s:aid="aexe"theme="ajax"href="%{as}"loadingText="加載中……"targets="show">改變上面的數(shù)據</s:a></body></html><url標簽<div標簽數(shù)據標簽i18n和text標簽i18n和text標簽用于對國際化提供支持.i18n標簽用于將一個資源包放入值棧,text標簽用于從資源包中獲取消息。例如<s:i18nname=“ApplicationResources”> <s:textname=“title”/></s:i18n>i18n標簽將基名為ApplicationResources的資源包放入到值棧中,text標簽從資源包中獲取鍵為title的文本消息。注意:i18n標簽放入值棧的資源包只能在i18n標簽的標簽體內訪問,一旦i18n標簽結束,值棧中的資源包將被刪除。text標簽也可以單獨使用,在這種情況下,它將首先查找資源包的基名與調用的Action類名相同的資源包。這意味著你可以在Action類所在的包中創(chuàng)建與Action類名相同的資源文件,例如:在com.neusoft.action包中有一個名為LoginAction的類,你可以在com.neusoft.action包括中創(chuàng)建名為LoginAperties、LoginAction_perties、LoginAction_perties等資源文件(名字中的LoginAction部分稱為基名),當執(zhí)行完LoginAction后,在轉向的結果頁面中使用單獨的text標簽獲取本地化的文本消息,那么text標簽將從com.neusoft.action.LoginAction_perties(根據當前的語言環(huán)境選擇某個資源文件)中讀取name屬性值對應的文本消息。數(shù)據標簽i18n和text標簽如果找不到與Action類名相同的資源包,那么就從默認資源包中獲取消息;如果默認資源包不存在,或者默認資源包中也沒有找到對應的消息,那么text標簽的標簽體內容將作為默認消息被輸出;如果沒有標簽體,那么name屬性的值將直接被輸出。text標簽內部還可以使用嵌套的param標簽,來指定消息文本中的參數(shù),param標簽的順序對應了消息文本中參數(shù)的索引順序。 i18n標簽的屬性 text標簽的屬性·i18n和text標簽示例第一步在項目的src下新建包:com.ibm.action,在這個包中新建TextTagAction類,繼承自ActionSupport類,注意:你的Action類一定要繼承ActionSupport類,因為ActionSupport類對國際化提供了支持,這樣text標簽才能訪問到資源包的基名與你的Action類名相同的資源包。TextAction類沒有任何代碼,這主要是因為ActionSupport基類已經實現(xiàn)了execute()方法,該方法返回Action.SUCCESS,這就足夠了,我們編寫TextAction類的目的是為了通過這個Action來訪問使用了text標簽的結果頁面。i18n和text標簽示例第二步在com.neusoft.action包中新建TextTagAperties,內容如下:username=lisi

now=Nowis{0}.{1},eyou.鍵為now的消息有兩個參數(shù),分別用{0}和{1}來表示。第三步新建ApplicationRperties,內容如下:username=zhangsan

i18n和text標簽示例第四步數(shù)據標簽date標簽date標簽用于格式化輸出日期值,也可用于輸出當前日期值與指定日期值之間的時差 date標簽的屬性注意:1、format屬性用于指定日期的格式化樣式,具體的樣式規(guī)則可以參看java.text.SimpleDateFormat類的API文檔。2、將nice屬性設為true,可以輸出指定日期值和當前日期值之間的時差,此時format屬性失效,也就是說,當nice屬性為true時,即使你指定了format屬性,它也不會起作用3、如果沒有使用nice屬性,也沒有指定format屬性,那么date標簽將會在國際化資源包中查找struts.date.format鍵,并以這個鍵的值作為日期的格式化樣式;如果這個鍵不存在,那么默認將會使用DateFormat.MEDIUM格式化樣式。4、如果找不到name屬性指定的Date對象,那么將返回空。date標簽示例第一步在ApplicationRperties文件中添加struts.date.format鍵 struts.date.format=yyyy/MM/ddhh:mm:ss第二步、可以使用struts2的struts.custom.i18n.resources屬性來設置默認的資源包,編輯struts.xml文件,使用constant元素來配置struts.custom.i18n.resources屬性,內容如下 <constantname=“struts.custom.i18n.resources”value=“ApplicationResources”/>測試:第三步控制標簽控制標簽用于完成流程控制,例如分支,循環(huán)等操作??刂茦撕灠旅鎺讉€:if:用于控制選擇輸出。elseif:同if標簽結合使用,用來控制選擇輸出。else:同if標簽結合使用,用來控制選擇輸出。append:用來將多個集合拼接為一個新的集合。generator:為一個字符串解析器,用來將一個字符串解析為一個集合。iterator:迭代器,用來迭代輸出集合數(shù)據。merge:用來將多個集合拼接為一個新的集合,同append有所區(qū)別。sort:用來對集合排序。subset:用來截取集合的部分集合,開成新的集合子集合??刂茦撕瀒f/elseif/else標簽if/elseif標簽屬性test:為必填屬性,是一個Boolean類型值,決定是否顯示if標簽內容。該標簽標準格式如下:<s:iftest=“表達式”>

……..</s:if><s:elseiftest=“表達式”>

……..</s:elseif><s:else>

………..</s:else>控制標簽if/elseif/else標簽舉例<%@taglibprefix="s"uri="/struts-tags"%><!--定義一個testname屬性-->

<s:setname="testname"value="%{'Java'}"/>

<!--使用if標簽判斷-->

<s:iftest="%{#testname=='Java'}">

<div>

<s:propertyvalue="%{#testname}"/>

</div>

</s:if>

<s:elseiftest="%{#testname=='Jav'}">

<div>

<s:propertyvalue="%{#testname}"/>

</div>

</s:elseif>

<s:else>

<div>

testname不是“Java”

</div>

</s:else>控制標簽if/elseif/else標簽舉例<%@taglibprefix="s"uri="/struts-tags"%><s:setname="age"value="61"/><s:iftest="${age>60}">

老年人</s:if><s:elseiftest="${age>35}">

中年人</s:elseif><s:elseiftest="${age>15}"id="wawa">

青年人</s:elseif><s:else>

少年</s:else>控制標簽if/elseif/else標簽舉例<%@taglibprefix="s"uri="/struts-tags"%>

<s:setname="name"value="<%="'"+request.getParameter("name")+"'"%>"/><%

System.out.println(request.getParameter("name"));

%><s:iftest="#name=='zhaosoft'">

zhaosofthere</s:if><s:elseiftest="#name=='zxl'">

zxlhere</s:elseif><s:else>

otherishere</s:else>控制標簽iterator(迭代標簽)Iterator(迭代)描述:用于遍歷集合(java.util.Collection)<s:proptertyvalue="#perty">List,Map,數(shù)組或枚舉值(java.util.iterator)。該標簽的屬性如下表:IteratorStauts實例包含方法intgetCount():返回當前迭代過元素的總數(shù)。intgetIndex():返回當前迭代元素的索引。booleanisEven():判斷當前迭元素是否為偶數(shù)。booleanisOdd():判斷當前迭元素是否為奇數(shù)。booleanisFirst():判斷當前迭元素是否為第一個元素。booleanisLast():判斷當前迭元素是否為最后一個元素IteratorStauts的這些方法分別對應了count,index,even,odd,first,last屬性控制標簽iterator標簽示例控制標簽iterator(迭代標簽)舉例<s:iteratorvalue="{'第一個元素','第二個元素'}">

<p>dayis:<s:property/></p></s:iterator>privateListmyList;privateMapmyMap;publicStringexecute()throwsException{myList=newArrayList();myList.add("第一個元素");myList.add("第二個元素");myList.add("第三個元素");myMap=newHashMap();myMap.put("key1","第一個元素");myMap.put("key2","第二個元素");myMap.put("key3","第三個元素");return

SUCCESS;}

省略生成setter/getter方法

<table> <s:iteratorvalue="{'第一個元素','第二個元素'}"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>

<h2>顯示List屬性</h2>

<table>

<s:iteratorvalue="myList"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table><h2>顯示Map</h2>

<table>

<s:iteratorvalue="#{'key1':'第一個元素','key2':'第二個元素'}"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>

<h2>顯示Map屬性</h2>

<table>

<s:iteratorvalue="myMap"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>控制標簽append標簽append:用來將多個集合拼接為一個新的集合。這樣拼接的目的就是可以將多個集合使用一個<iterator/>標簽完成迭代。標簽屬性id:指定了集合元素的ID。 privateListmyList1,myList2; privateMapmyMap1,myMap2; publicStringexecute()throwsException{ myList1=newArrayList(); myList2=newArrayList(); myList1.add("第一個集合#第一個元素");

myList1.add("第一個集合#第二個元素");

myList1.add("第一個集合#第三個元素");

myList2.add("第二個集合#第一個元素");

myList2.add("第二個集合#第二個元素");

myList2.add("第二個集合#第三個元素");

myMap1=newHashMap(); myMap2=newHashMap();

myMap1.put("key1","第一個集合#第一個元素");

myMap1.put("key2","第一個集合#第二個元素");

myMap1.put("key3","第一個集合#第三個元素");

myMap2.put("key1","第二個集合#第一個元素");

myMap2.put("key2","第二個集合#第二個元素");

myMap2.put("key3","第二個集合#第三個元素");

returnSUCCESS;

}//省略setter/getter方法<h1><spanstyle="background-color:#FFFFcc">Append標簽示例</span></h1>

<h2>拼接List屬性</h2>

<table>

<s:appendid="newList">

<s:paramvalue="myList1"/>

<s:paramvalue="myList2"/>

</s:append>

<s:iteratorvalue="#newList"id="name"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>

<h2>拼接Map屬性</h2>

<table>

<s:appendid="newMap">

<s:paramvalue="myMap1"/>

<s:paramvalue="myMap2"/>

</s:append>

<s:iteratorvalue="#newMap"status="st">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>控制標簽generator標簽generator標簽用來將指定的字符串按規(guī)定的分隔符分解為多個子字符串,生成的多個子字符串可以使用iterator標簽輸出。該標簽的屬性如下:id:指定了集合元素的ID。count:可選屬性,為一個Integer類型值,指定生成集合中元素的總數(shù)。separator:必填屬性,為一個String類型值,指定用來分解字符串的分隔符。val:必填屬性,為一個String類型值,指定被分解的字符串。converter:可選屬性,為一個Converter類型實例,指定一個轉換器,該轉換器負責將集合中的每個字符串轉換為對象。控制標簽generator標簽舉例

privateStringmsg; publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; } publicStringexecute()throwsException{ setMsg("第一個元素;第二個元素;第三個元素");

returnSUCCESS;

}控制標簽generator標簽舉例

<h1> <spanstyle="background-color:#FFFFCC">Generator標簽示例</span>

</h1>

<table>

<s:generatorseparator=";"val="msg"id="temp"count="2"></s:generator>

<s:iteratorstatus="st"value="#attr.temp">

<tr>

<td><s:propertyvalue="#st.getIndex()"/></td>

<td><s:property/></td>

</tr>

</s:iterator>

</table>注意:如果在generator標簽中指定了count屬性,則該集合中最多只能有count個元素,多余的元素將會被忽略??刂茦撕瀉ppend標簽append:用來將多個集合拼接為一個新的集合。控制標簽merge標簽Merge標簽用于合并迭代器,其用法與append相似,區(qū)別就是對合并后的迭代器中的元素迭代的順序不一樣??刂茦撕瀞ubset標簽Subset標簽用于截取一個迭代器的子集,其內部實現(xiàn)是通過org.apache.struts2.util.SubsetIteratorFilter類來完成的。Subset標簽示例subset標簽示例除了上面的用法之外,還可以使用subset屬性指定一個Decider,用于過濾某些元素。要編寫一個Decider類,需要實現(xiàn)org.apache.struts2.util.SubsetIteratorFilter.Decider接口,該接口只有一個方法,publicbooleandecide(Objectelement)throwException,如果該方法返回true,表明參數(shù)element表示的元素應該被包含到子集中。我們編寫一個Decider類,選取集合中含有“java”子串的元素,代碼如下:首先使用bean標簽實例化MyDecider對象,并將這個對象放入到OgnlContext中。在subset標簽的decider屬性中,通過OGNL表達式#myDecider來引用MyDecider對象。控制標簽sort標簽Sort標簽根據comparator屬性指定的比較器對集合進行排序,并將排序后的迭代器壓入值棧的棧頂。在sort標簽的內部,你可以使用iterator標簽取出棧頂?shù)牡鲗ε判蚝蟮脑剡M行迭代。當sort標簽結束時,棧頂?shù)牡鲗⒈粍h除。sort標簽示例表單標簽Struts2的表單標簽可以分為兩類,form標簽本身和包裝HTML表單元素的其他標簽。form標簽本身的行為不同于它內部的元素。Struts2表單標簽包括下列標簽:form textfieldpasswordradio checkbox checkboxlistselectdoubleselectcomboboxoptiontransferselectoptgroup updownselecttextareahiddenfilelabelresetsubmittokenhead表單標簽表單標簽的name和value屬性很多表單標簽(form標簽除外)的name屬性和value屬性之間存在一個獨特的關系。name屬性除了為HTML表單元素指定名字,在表單提交時作為請求參數(shù)的名字外,同時它還映射到Action的屬性。在大多數(shù)情況下,name屬性映射到一個簡單的JavaBean屬性,例如name屬性的值為”postalCode”,在表單提交后,struts2框架將會調用Action的setPostalCode()方法來設置屬性。有的時候你希望在表單元素中顯示Action屬性的數(shù)據,這時就輪到value屬性登場了,為value屬性指定表達式”%{postalCode}”,這將會調用Action的getPostalCode()方法,并在表單中顯示返回的數(shù)據,之后,用戶可以編輯這個值,然后重新提交它。form標簽form標簽輸出一個HTML輸入表單,此外,xhtml主題的form標簽還輸出表單元素外圍的表格。1)通常情況下,當前輸出表單的請求和提交表單的請求屬于同一個命名空間。例如:請求/admin/updateCategory!default.action輸出的表單,命名空間會被假設為/admin,因此在使用form標簽時,可以不使用namespace屬性。如下:<s:formaction=“updateCategory”>如果輸出表單的請求和提交表單的請求分屬于不同的名稱空間,那么可以通過namespace屬性指定處理表單提交的action所屬的名稱空間。2)若通過action的一個非execute方法輸出表單,然后將表單提交給action默認的execute方法執(zhí)行,那么form標簽的action屬性可以忽略。例如:對于下面的表單:<s:form> <s:textfieldname=“username”label=“用戶名”/>

<s:submit/></s:form>當訪問/register!default.action時,輸出上表單,form標簽會自動將action屬性設為register,這樣在表單提交后就會執(zhí)行action的execute方法。3)method和enctype是HTMLform標簽的屬性。4)當使用驗證框架時,將form標簽的validate屬性設為true,將自動生成客戶端的JavaScript驗證代碼。 <s:formaction=“register”method=“post”/> struts2默認的主題是xhtml,上述代碼在客戶端瀏覽器中的輸出如下:

<s:formid=“register”onsubmit=“returntrue”action=“register”method=“post”> <tableclass=“wwFormTable”></table> </s:form>

可以看到form標簽內部輸出了一個table元素。

textfield標簽textfield標簽輸出一個HTML單行文本輸入控件,等價于HTML代碼:<inputtype=“text”…/>看下面的代碼:<s:formaction=“register”method=“post”>

<s:textfieldname=“username”label=“用戶名”/></s:form>password標簽password標簽輸出一個HTML口令輸入控件,等價于HTML代碼:<inputtype=“password”../>例子:<s:passwordname=“password”label=“密碼”/>textarea標簽textarea標簽輸出一個HTML多行文本輸入控件,等價于HTML代碼:<textarea…./>.例子:

<s:textareaname=“personal”cols=“30”rows=“5”label=“個人簡歷”/>select標簽select標簽輸出一個HTML列表框,等價于HTML代碼: <select…><option..></option></select>select標簽示例示例一:<s:form> <s:selectlabel=“最高學歷”name=“education”list=“{‘高中’,‘大學’,‘碩士’}”/></s:form>在select標簽的list屬性中直接使用OGNL表達式創(chuàng)建了一個列表,列表中的每一項都將作為HTML列表框的一個選項。示例二:<s:form> <s:selectlabel=“最高學歷”name=“education”list=“#{1:‘高中’,2:‘大學’,3:‘碩士’}”/></s:form>在select標簽的list屬性中直接使用OGNL表達式創(chuàng)建了一個Map。在這里要注意的是,Map的key是作為列表框選項的值,而Map中的value是作為列表框選項的內容。select標簽示例示例三:<s:form> <s:selectlabel=“最高學歷”name=“education”list=“{‘高中’,‘大學’,‘碩士’}”headerKey=“-1”headerValue=“請選擇你的學歷”

/>Header選項主要用來越提示作用,因此應該將header選項的值(通過headerKey屬性設置)設為無意義的值,例如此處的-1.示例四:<s:form>

<s:selectlabel=“最高學歷”name=“education”list=“{‘高中’,‘大學’,‘碩士’}”headerKey=“-1”headerValue=“請選擇你的學歷”emptyOption=“true”

multiple=“true”/> 使用emptyOption屬性在header選項后添加一個空的選項。

multiple屬性設為false,則只能從下拉列表中選擇一個選項,如果設為true,則可以多選。optgroup標簽optgroup標簽作為select標簽的子標簽使用,用于創(chuàng)建選項組。你可以在select標簽的標簽體中使用一個或者多個optgroup標簽,對選項進行邏輯分組。注意,optgroup標簽本身不能嵌套。例子:

<%@taglibprefix=“s”uri=“/struts-tags”%> <s:form><s:selectlabel="選擇圖書"name="book"list="#{1:'JAVA核心編程',2:'深入struts2學習'}">

<s:optgrouplabel="C/C++圖書"list="#{3:'VC++編程詳解',4:'Spring詳解'}"/>

<s:optgrouplabel="Oracle圖書"list="#{5:'Oracle基礎',6:'DBA入門'}"/></s:select> </s:form>

optgroup標簽注意optgroup標簽的label屬性指定選項組的組名。optgroup標簽對應的模板需要使用listKey和listValue屬性的值,因此你要么為list屬性指定一個Map類型的值(此時,listKey默認為Map.Entry的key,listValue默認為Map.Entry的value),要么為list屬性指定一個對象列表,然后使用listKey和listValue屬性指定對象的屬性作為選項的值和內容。radio標簽radio標簽輸出一組HTML單選按鈕,等價于一組HTML代碼:<inputtype=“radio”…/>例子:<%@taglibprefix="s"uri="/struts-tags"%><s:form> <s:radioname="user.sex"value="1"list="#{1:'男',0:'女'}"label="性別"/></s:form>checkbox標簽checkbox標簽輸出一個HTML復選框,等價于代碼:<inputtype=“checkbox”…/>checkbox標簽創(chuàng)建一個value屬性為true或者為false的復選框。你可以通過checkbox標簽的fieldValue屬性來指定創(chuàng)建的HTML復選框value屬性的值。我們看下面的代碼: <s:checkboxname=“user.username”label=“是否顯示Email”fieldValue=“true”/>復選框的值是true還是false,是由fieldValue屬性來控制的,而不是由通常的value屬性來設置的。注意,除非你知道你要做什么,否則不要將fieldValue屬性設置為false。將fieldValue屬性設置為false可能會導致一些問題。HTML規(guī)范規(guī)定,復選框只有在選中時才會被提交,在通常的Servlet/JSP處理過程中,我們可以通過判斷復選框的name屬性所指定的請求參數(shù)是否存在來獲知用戶是否選中了復選框,如果選中,則取出它的值。然而,在使用struts2框架時,這一切發(fā)生了一些微妙的變化。如果將fieldValue屬性設置為false,那么復選框的值將是false。當沒有選中復選框時,提交的請求參數(shù)中不會有復選框對應的請求參數(shù)。不過,雖然struts2框架沒有接收到這個請求參數(shù),但它仍然會將復選框對應的action屬性的值設為false。于是你就會看到一個奇怪的現(xiàn)象,那就是不管你是否選中復選框,對應的action屬性的值都是false.checkboxlist標簽checkboxlist標簽使用一個列表創(chuàng)建一系列復選框,屬性設置與<s:select/>和<s:radio/>類似,只是創(chuàng)建的是HTML復選框。不同的是,checkboxlist標簽是多選標簽。示例:<s:form> <s:checkboxlistname="interest"list="{'足球','籃球','排球','游泳'}"label="興趣愛好"/></s:form>hidden標簽hidden標簽輸出一個HTML隱藏表單元素,等價于HTML代碼:<inputtype=“hidden”…/>.在xhtml主題下,hidden標簽與其它的標簽不太一樣,hidden標簽并不輸出表行。xhtml主題直接從simple主題繼承了hidden.ftl模板。除了公共屬性外,hidden標簽沒有特有的屬性。示例:<s:hiddenname=“id”value=“5”/>submit標簽submit標簽輸出一個提交按鈕。submit標簽和form標簽一起使用可以提供異步表單提交功能。submit標簽可以輸出以下三種類型的提交按鈕。input:等價于HTML代碼<inputtype=“submit”…>image:等價于HTML代碼<inputtype=“image”…>button:等價于HTML代碼<inputtype=“submit”…>HTML的button標簽已經演進為可以分別指定提交的值(通過value屬性指定)和按鈕上顯示的文本(通過標簽的內容來指定),但只能用于IE6.0以上版本的瀏覽器。submit標簽示例例1:指定image類型的提交按鈕,使用method屬性。<s:submittype=“image”method=“l(fā)ogin”src=“images/login.gif”/>上述代碼在客戶端瀏覽器中的輸出如下:<inputtype=“image”src=“images/login.gif”name=“method:login”value=“Submit”…./>注意生成的input元素的name屬性。例2:指定button類型的提交按鈕,使用action和method屬性。<s:submittype=“button”action=“userManager”method=“l(fā)ogin”label=“登錄”/>上述代碼在客戶端瀏覽器中的輸出如下:<buttontype=“submit”name=“action:userManager!login”value=“submit”…/>登錄</button>注意button標簽的name屬性。通過上面的例子可以看到name屬性有二個前綴:method和action,這是struts2提供的一種特性,即使用一些預定義的前綴來命名一個按鈕,通過按鈕的名字來改變執(zhí)行的行為。Struts2定義了4個前綴,如下:

methodmethod:login actionaction:userManager redirectredirect:cancel.jsp redirection-actionredirect-action:registermethod前綴使用method前綴,來取代action默認的execute()方法的執(zhí)行。例如一個表單同時用于用戶注冊和登錄,那么可以編寫代碼如下: <s:formaction=“userManager”> <s:textfieldlabel=“用戶名”name=“user.username”/>

<s:passwordlabel=“密碼”name=“user.password”/>

<s:submitvalue=“登錄”name=“method:login”/>

<s:submitvalue=“注冊”name=“method:reg”/></s:form>注意:1)對于input類型的提交按鈕,不能通過submit標簽的label屬性來設置提交按鈕上的文本,只能使用value屬性。

2)可以在submit標簽的name屬性中直接使用method前綴,也可以像前面給出的例子中使用submit標簽的method屬性來指定處理請求的action方法。action前綴使用action前綴,取代form標簽指定的action,將請求導向到另外的action進行處理。示例: <s:formaction=“l(fā)ogin”> <s:textfieldlabel=“用戶名”name=“user.username”/>

<s:passwordlabel=“密碼”name=“user.password”/>

<s:submitvalue=“登錄”/>

<s:submitvalue=“注冊”name=“action:register”/></form>如果用戶已經注冊,可以直接登錄,否則單擊注冊按鈕,轉到注冊頁面。action前綴也可以和struts2的動態(tài)方法調用結合使用,例如:name=“action:userManager!register”.redirect前綴使用redirect前綴將請求重定向到其他的URL,甚至可以是Web應用程序外部的URL。示例: <s:formaction=“l(fā)ogin”> <s:textfieldlabel=“用戶名”name=“user.username”/> <s:passwordlabel=“密碼”name=“user.password”/> <s:submitvalue=“登錄”/> <s:submitvalue=“注冊”name=“”/></form>redirect-action前綴使用redirect-action前綴將請求重定向到其他的action。在內部,struts2使用ServletRedirectResult來執(zhí)行這個任務。示例: <s:formaction=“l(fā)ogin”> <s:textfieldlabel=“用戶名”name=“user.username”/>

<s:passwordlabel=“密碼”name=“user.password”/>

<s:submitvalue=“登錄”/>

<s:submitvalue=“注冊”name=“redirect-action:register”/></form>reset標簽reset標簽輸出一個重置按鈕。reset標簽與form標簽一起使用,用來提供表單的重置。reset標簽可以輸出以下兩種類型的重置按鈕:input:等價于HTML代碼<inputtype=“reset”…>button:等價于HTML代碼<butt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論