Struts2 表单和非表单标签
學(xué)習(xí)內(nèi)容
Struts 2表單標(biāo)簽
?Struts 2非表單標(biāo)簽
能力目標(biāo)
?熟練使用Struts 2表單標(biāo)簽開發(fā)表單
?熟練使用Struts 2非表單標(biāo)簽
?
本章簡(jiǎn)介
上一章講述了ognl和Struts2標(biāo)簽庫中的數(shù)據(jù)訪問標(biāo)簽和邏輯控制標(biāo)簽。本章將重點(diǎn)介紹Struts2標(biāo)簽庫中的表單標(biāo)簽和非表單標(biāo)簽。
表單標(biāo)簽主要用于生成HTML中的表單。
非表單標(biāo)簽主要包含一些常用的功能標(biāo)簽,例如顯示日期或樹形菜單。熟練使用Struts2標(biāo)簽將大大簡(jiǎn)化視圖頁面的代碼編輯工作,提高視圖頁面的維護(hù)效率。
核心技能部分?
?
7.1?表單標(biāo)簽
?Struts的表單標(biāo)簽,可分為兩種:form標(biāo)簽本身和單個(gè)表單元素的標(biāo)簽。form標(biāo)簽本身的行為不同于表單元素標(biāo)簽。Struts 2的表單元素標(biāo)簽都包含了非常多的屬性,但有很多屬性完全是通用的。
7.1.1?表單標(biāo)簽的通用屬性
所有表單標(biāo)簽處理類都繼承了UIBean類,UIBean包含了一些通用屬性,這些通用屬性分成3種:
模板相關(guān)屬性。
?JavaScript相關(guān)屬性。
?通用屬性。
除了這些屬性之外,所有表單元素標(biāo)簽都存在一個(gè)特殊的屬性:form,這個(gè)屬性引用表單元素所在的表單,通過該form屬性,可以實(shí)現(xiàn)表單元素和表單之間的交互。例如,我們可以通過${ parameters.form. id }來取得表單元素所在表單的ID。下面詳細(xì)列出這些表單標(biāo)簽的通用屬性。
模板相關(guān)的通用屬性如下:
?templateDir:指定該表單所用的模板文件目錄。
?theme:指定該表單所用的主題。
?template:指定該表單所用的模板。
Javascript相關(guān)的通用屬性如下:
?onclick:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上單擊時(shí)觸發(fā)的JavaScript函數(shù)。
?onmousedown:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上按下時(shí)觸發(fā)的JavaScript函數(shù)。
?onmouseup:指定鼠標(biāo)在該標(biāo)簽生成的表單元素上松開時(shí)觸發(fā)的JavaScript函數(shù)。
?onmouseover:指定鼠標(biāo)在該標(biāo)簽生成的表單一元素上懸停時(shí)觸發(fā)的JavaScript函數(shù)。
?onmouseout:指定鼠標(biāo)移出該標(biāo)簽生成的表單元素時(shí)觸發(fā)的JavaScript函數(shù)。
?onfocus:指定該標(biāo)簽生成的表單元素得到焦點(diǎn)時(shí)觸發(fā)的函數(shù)。
?onblur:指定該標(biāo)簽生成的表單元素失去焦點(diǎn)時(shí)觸發(fā)的函數(shù)。
?onkeypress:指定單擊鍵盤上某個(gè)鍵時(shí)觸發(fā)的函數(shù)。
?onkeyup:指定松開鍵盤某個(gè)鍵時(shí)觸發(fā)的函數(shù)。
?onkeydown:指定按下鍵盤上某個(gè)鍵時(shí)觸發(fā)的函數(shù)。
?onselect:對(duì)下拉列表項(xiàng)等可以選擇表單元素,指定選中該元素時(shí)觸發(fā)的JavaScript函數(shù)。
?onchange:對(duì)于文本框等可以接受輸入的表單元素,指定當(dāng)值改變時(shí)觸發(fā)的JavaScript函數(shù)。
因?yàn)?/span>HTML元素本身的限制,并不是每個(gè)HTML元素都可以觸發(fā)以上的所有函數(shù)。因此,上面的屬性并不是對(duì)Struts 2的每個(gè)標(biāo)簽都有效。
Struts 2還允許為表單元素設(shè)置提示,但鼠標(biāo)在這些元素上懸停時(shí),系統(tǒng)將出現(xiàn)提示,
Struts 2將這種特性稱為Tooltip。與Tooltip相關(guān)的通用屬性如下:
?tooltip:設(shè)置此組件的Tooltip。
?tooltipIcon:設(shè)置Tooltip圖標(biāo)的URL路徑。
?tooltipAboveMousePointer:是否在光標(biāo)位置上顯示Tooltip。也可通過設(shè)置tooltipOffseY屬性,設(shè)置Tooltip與光標(biāo)位置的垂直位移。
?tooltipBgColor:設(shè)置Tooltip的背景色。
?tooltipBgImg:設(shè)置Tooltip的背景圖片。
?tooltipBorderWidth:設(shè)置Tooltip邊框的寬度。
?tooltipBorderColor:設(shè)置Tooltip邊框的顏色。
?tooltipDelay:設(shè)置顯示Tooltip的時(shí)間延遲(單位是毫秒)。
?tooltipFixCoordinateX:設(shè)置固定Tooltip在指定的X坐標(biāo)上,與tooltipSticky屬性結(jié)合時(shí)很有用。
?tooltipFixCoordinateY設(shè)置固定Tooltip在指定的Y坐標(biāo)上,與tooltipSticky屬性結(jié)合時(shí)很有用。
?tooltipFontColor:設(shè)置Tooltip的字體顏色。
?tooltipFontFace:設(shè)置Tooltip的字體,例如verdana. ?geneva, ?sans-serif等。
?tooltipFontSize:設(shè)置Tooltip的字體大小,例如30px。
?tooltipFontWeight:設(shè)置Tooltip的字體是否使用粗體,可以接受normal和bold(粗體)兩個(gè)值。
?tooltipLeftOfMousePointer:設(shè)置是否在光標(biāo)左側(cè)顯示Tooltip,默認(rèn)是在右邊顯示。
?tooltipOffsetX:設(shè)置Tooltip相對(duì)光標(biāo)位置的水平位移。
?tooltipOffsetY:設(shè)置Tooltip相對(duì)光標(biāo)位置的垂直位移。
?tooltipOpacity:設(shè)置Tooltip的透明度,設(shè)置值可以是0(完全透明)和100(不透明)之間的數(shù)字。Opera瀏覽器不支持該屬性。
?tooltipPadding:指定Tooltip的內(nèi)部間隔。例如,邊框和內(nèi)容之間的間距。
?tooltipShadowColor:使用指定的顏色為Tooltip創(chuàng)建陰影。
?tooltipShadowWidth:使用指定的寬度為Tooltip創(chuàng)建陰影。
?tooltipStatic:設(shè)置Tooltip是否隨著光標(biāo)的移動(dòng)而移動(dòng)。
?tooltipSticky:設(shè)置Tooltip是否一直停留在它初始的位置,直到另外一個(gè)Tooltip被激活,或者瀏覽者點(diǎn)擊了HTML頁面。
?tooltipStayAppearTime:指定一個(gè)Tooltip消失的時(shí)間間隔(毫秒),即使鼠標(biāo)還在相關(guān)的HTML元素上不動(dòng)。設(shè)置值<=0,就和沒有定義一樣。
?tooltipTextAlign:設(shè)置Tooltip的標(biāo)題和內(nèi)容的對(duì)齊方式,可以是right(右對(duì)齊)、left(左對(duì)齊)或justify(居中對(duì)齊)。
?tooltipTitle:設(shè)置Tooltip的標(biāo)題文字。
?tooltipTitleColor:設(shè)置Tooltip的標(biāo)題文字的顏色。
?tooltipWidth:設(shè)置Tooltip的寬度。
除此之外,Struts 2還有其他的通用屬性,用于設(shè)置表單元素的CSS樣式等。
?cssClass:設(shè)置該表單元素的class屬性。
?cssStyle:設(shè)置該表單一元素的style屬性,使用內(nèi)聯(lián)的CSS樣式。
?title:設(shè)置表單元素title屬性。
?disabled:設(shè)置表單元素的disabled屬性。
?label:設(shè)置表單元素的label屬性。
?labelPosition:設(shè)置表單元素label所在位置,可接受的值為top(上面)和left(左邊),默認(rèn)是在左邊。
?requiredposition:定義必填標(biāo)記(默認(rèn)以*作為必填標(biāo)記)位于label元素的位置,可接受的值為left(左面)和right(右邊),默認(rèn)是在右邊。
?name:定義表單一元素的name屬性,該屬性值用十與Action的屬性形成對(duì)應(yīng)。
?required:定義是否在表單元素的label上增加必填標(biāo)記(默認(rèn)以*作為必填標(biāo)記),設(shè)置為true時(shí)增加必填標(biāo)記,否則不增加。
?tabIndex:設(shè)置表單元素的tabindex屬性。
?value:設(shè)置表單兀素的value屬性。
7.1.2 表單標(biāo)簽的name和value屬性
對(duì)于表單元素而言,name和value屬性之間存在一個(gè)獨(dú)特的關(guān)系:因?yàn)楸韱卧氐?/span>name屬性會(huì)映射到Action的屬性,當(dāng)該表單對(duì)應(yīng)的Action已經(jīng)被實(shí)例化,且對(duì)應(yīng)屬性有值時(shí),表單元素會(huì)顯示出該屬性的值,該值就是表單元素的value值。
name屬性設(shè)置表單元素的名字,表單元素的名字實(shí)際上封裝著一個(gè)請(qǐng)求參數(shù),而請(qǐng)求參數(shù)是被封裝到Action屬性的。因此,可以將該name屬性指定為你希望綁定值的表達(dá)式。 ???例如如下代碼:
<!--將下面文本框的值綁定到Action的person屬性的firstName屬性 -- >
??????<s:textfield ?name="person.firstName”/>
大多數(shù)場(chǎng)景下,我們希望表單元素里可以顯示出對(duì)應(yīng)Action的屬性值,此時(shí)就可以通過指定該表單元素的value屬性來完成該工作。例如使用如下代碼:
????<!--使用表達(dá)式生成表單元素的值一>
??????<s:textfield name=”person.firstName”?value=”${person.firstName}”/>
事實(shí)上,因?yàn)?/span>name和value屬性的特殊關(guān)系,如果我們使用Struts 2的標(biāo)簽庫,則無需指定value屬性,因?yàn)?/span>Struts 2會(huì)為我們處理這些。
對(duì)于如下代碼:
????<!一將下面文本框的值綁定到Action的person屬性的firstName屬性一>
??????<s:textfield name=”person.firstName"/>
雖然上面的文本框沒有指定value屬性,但Struts 2一樣會(huì)在該文本框中輸出對(duì)應(yīng)Action里的屬性值。
7.1.3?常用表單標(biāo)簽
1. ?<s:form>標(biāo)簽
該標(biāo)簽的主要屬性是action和namespace,例如下面的代碼:
<s:form action="tag1.action" namespace="/tags">
</s:form>
生成的HTML代碼如下所示:
<form action="tag1.action" method="post">
2.?文本類標(biāo)簽
此類標(biāo)簽包括文本框(<s:textfield?/>)、密碼框(<s:password?/>)、文本區(qū)域(<s:textarea>),下面是一個(gè)簡(jiǎn)單的示例。
示例7.1
<body> <s:form action="tag1" namespace="/tags"> <s:textfield name="loginname" label="登錄名稱"></s:textfield> <s:password name="pwd" label="登錄密碼"></s:password> <s:textarea name="info" label="個(gè)人簡(jiǎn)介" cols="28" rows="10"></s:textarea> <s:submit value="提交"></s:submit> <s:reset value="重填"></s:reset> </s:form></body>?
圖7.1.1 文本類標(biāo)簽
上述代碼生成的HTML如下所示。
<body> <form action="/Struts8/tags/tag1.action" method="post"> <table class="wwFormTable"> <tr> <td class="tdLabel"> <label for="tag1_loginname" class="label">登錄名稱:</label></td> <td> <input type="text" name="loginname"/></td> </tr> <tr><td class="tdLabel"><label for="tag1_pwd" class="label">登錄密碼:</label> </td> <td> <input type="password" name="pwd" id="tag1_pwd"/></td> </tr> <tr><td class="tdLabel"> <label for="tag1_info" class="label">個(gè)人簡(jiǎn)介:</label></td><td> <textarea name="info" cols="28" rows="10"></textarea> </td> </tr> <tr><td colspan="2"><input type="submit" value="提交"/></td> </tr> <tr><td colspan="2"><input type="reset" value="重填"/></td> </tr> </table> </form> </body>3.?checkboxlist標(biāo)簽
checkboxlist標(biāo)簽可以一次創(chuàng)建多個(gè)復(fù)選框,用于一次生成多個(gè)HTML標(biāo)簽中的<input type="checkbox"…/>,它根據(jù)list屬性指定的集合來生成多個(gè)復(fù)選框。因此,使用該標(biāo)簽指定一個(gè)list屬性。除此之外,其他屬性大部分是通用屬性,此處不再贅述。
除此之外,checkboxlist表單還有兩個(gè)常用屬性:
?listKey:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的value。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的value 。
?listValue:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的標(biāo)簽。如果集合是Map,則可以使key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的標(biāo)簽。
下面是使用該標(biāo)簽的代碼示例,其中分別使用了簡(jiǎn)單集合、簡(jiǎn)單Map對(duì)象、集合里放置Java實(shí)例來創(chuàng)建多個(gè)復(fù)選框。
下面是該JSP頁面代碼:
<body> <h2>使用checkboxlist標(biāo)簽</h2> <s:form> <!-- 使用字符串集合生成多個(gè)復(fù)選框 --> <s:checkboxlistlist="{'JSP','Servlet','Struts2','Ajax'}" name="skills" label="熟悉技術(shù)"> </s:checkboxlist> <!-- 使用Map對(duì)象來生成多個(gè)復(fù)選框 --> <s:checkboxlist name="skillsarea" label="你所關(guān)注的技術(shù)領(lǐng)域"list="#{'java':'JAVA', '.net':'.NET', 'db':'Database','ajax':'Ajax'}"listKey="key"listValue="value"/> </s:form> </body>在上面代碼中,簡(jiǎn)單集合對(duì)象和簡(jiǎn)單Map對(duì)象都是通過OGNL表達(dá)式直接生成,但實(shí)際使用中一般是從后臺(tái)查詢出一個(gè)javaBean集合然后傳遞到頁面進(jìn)行顯示。該JavaBean的類代碼如下:
public class?Book
{
private int id;
?????private ?String bookName;
private ?String author;
//getter setter方法省略…….
}
Jsp頁面代碼:
<%//模擬后臺(tái)查詢到的數(shù)據(jù) 并轉(zhuǎn)發(fā)到頁面List books = new ArrayList();books.add(new Book(1,"殺殺人,喝喝酒---水滸傳","施耐庵"));books.add(new Book(2,"瘋狂的猴子---西游記","吳承恩"));books.add(new Book(3,"瘋狂的石頭---紅樓夢(mèng)","曹雪芹"));books.add(new Book(4,"大哥,我們動(dòng)手吧---三國(guó)演義","羅貫中"));request.setAttribute("bs",books);%><s:form> <!-- 使用字符串集合生成多個(gè)復(fù)選框 --> <s:checkboxlistlist="{'JSP','Servlet','Struts2','Ajax'}" name="skills" label="熟悉技術(shù)"> </s:checkboxlist> <!-- 使用Map對(duì)象來生成多個(gè)復(fù)選框 --> <s:checkboxlist name="skillsarea" label="你所關(guān)注的技術(shù)領(lǐng)域"list="#{'java':'JAVA', '.net':'.NET', 'db':'Database','ajax':'Ajax'}"listKey="key"listValue="value"/><s:checkboxlist label="你喜歡的圖書" name="lb" list="#attr.bs"listKey="id" listValue="bookName" value="1"></s:checkboxlist> </s:form>當(dāng)我們?cè)跒g覽器中瀏覽該頁面時(shí),將看到如圖7.1.2所示的頁面。
?
圖7.1.2 checklist標(biāo)簽
生成的HTML代碼如下所示:
<html><head><base href="http://localhost:8080/test23/"><title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --></head><body><form id="" action="/test23/" method="post"> <table class="wwFormTable"> <!-- 使用字符串集合生成多個(gè)復(fù)選框 --><tr><td class="tdLabel"><label for="_skills" class="label">熟悉技術(shù):</label></td><td > <input type="checkbox" name="skills" value="JSP" id="skills-1"/> <label for="skills-1" class="checkboxLabel">JSP</label> <input type="checkbox" name="skills" value="Servlet" id="skills-2"/> <label for="skills-2" class="checkboxLabel">Servlet</label> <input type="checkbox" name="skills" value="Struts2" id="skills-3"/> <label for="skills-3" class="checkboxLabel">Struts2</label> <input type="checkbox" name="skills" value="Ajax" id="skills-4"/> <label for="skills-4" class="checkboxLabel">Ajax</label> <input type="hidden" id="__multiselect__skills" name="__multiselect_skills" value="" /> </td> </tr><!-- 使用Map對(duì)象來生成多個(gè)復(fù)選框 --> <tr><td class="tdLabel"><label for="_skillsarea" class="label">你所關(guān)注的技術(shù)領(lǐng)域:</label></td><td > <input type="checkbox" name="skillsarea" value="java" id="skillsarea-1"/> <label for="skillsarea-1" class="checkboxLabel">JAVA</label> <input type="checkbox" name="skillsarea" value=".net" id="skillsarea-2"/> <label for="skillsarea-2" class="checkboxLabel">.NET</label> <input type="checkbox" name="skillsarea" value="db" id="skillsarea-3"/> <label for="skillsarea-3" class="checkboxLabel">Database</label> <input type="checkbox" name="skillsarea" value="ajax" id="skillsarea-4"/> <label for="skillsarea-4" class="checkboxLabel">Ajax</label> <input type="hidden" id="__multiselect__skillsarea" name="__multiselect_skillsarea" value="" /> </td> </tr><tr><td class="tdLabel"><label for="_lb" class="label">你喜歡的圖書:</label></td><td > <input type="checkbox" name="lb" value="1" id="lb-1" checked="checked"/> <label for="lb-1" class="checkboxLabel">殺殺人,喝喝酒---水滸傳</label> <input type="checkbox" name="lb" value="2" id="lb-2"/> <label for="lb-2" class="checkboxLabel">瘋狂的猴子---西游記</label> <input type="checkbox" name="lb" value="3" id="lb-3"/> <label for="lb-3" class="checkboxLabel">瘋狂的石頭---紅樓夢(mèng)</label> <input type="checkbox" name="lb" value="4" id="lb-4"/> <label for="lb-4" class="checkboxLabel">大哥,我們動(dòng)手吧---三國(guó)演義</label> <input type="hidden" id="__multiselect__lb" name="__multiselect_lb" value="" /> </td> </tr> </table></form> </body> </html>從圖7.1.2中可以看出,通過指定checkboxlist標(biāo)簽的listKey和listValue屬性,可以分別指定多個(gè)復(fù)選框的value和標(biāo)簽。
4.?radio標(biāo)簽
該標(biāo)簽與上面的checkboxlist標(biāo)簽的用法幾乎完全相同,都是通過指定list、listKey、listValue等屬性來生成HTML元素。不同的是,checkboxlist標(biāo)簽生成的是復(fù)選框,而radio標(biāo)簽生成的是單選框。
下面我們看一個(gè)實(shí)例,代碼如下所示:
示例7.2
<body>
<h2>使用radio標(biāo)簽</h2>
<s:form>
<!-- 使用字符串集合來生成多個(gè)單選框 -->
<s:radio
?? list="{'JSP','Servlet','Struts2','Ajax'}" name="skills"
?????label="熟悉技術(shù)">
</s:radio>
<!-- 使用Map對(duì)象來生成多個(gè)單選框 -->
<s:radio name="skillsarea" label="你所關(guān)注的技術(shù)領(lǐng)域"
????list="#{'java':'JAVA', '.net':'.NET', 'db':'Database','ajax':'Ajax'}"
??listKey="key"
??listValue="value"
??value="'java'"/>
</s:form>
</body>
該頁面的運(yùn)行效果如圖7.1.3所示。
?
<body> <h2>使用radio標(biāo)簽</h2> <form action="/Struts8/s-radio.jsp" method="post"> <table class="wwFormTable"> <!-- 使用字符串集合來生成多個(gè)單選框 --> <tr><td class="tdLabel"> <label for="s-radio_skills" class="label">熟悉技術(shù):</label></td><td> <input type="radio" name="skills" value="JSP"/> <label for="s-radio_skillsJSP">JSP</label> <input type="radio" name="skills" value="Servlet"/> <label for="s-radio_skillsServlet">Servlet</label> <input type="radio" name="skills" value="Struts2"/> <label for="s-radio_skillsStruts2">Struts2</label> <input type="radio" name="skills" value="Ajax"/> <label for="s-radio_skillsAjax">Ajax</label></td> </tr> <!-- 使用Map對(duì)象來生成多個(gè)單選框 --> <tr><td class="tdLabel"><label for="s-radio_skillsarea" class="label"> 你所關(guān)注的技術(shù)領(lǐng)域:</label></td><td> <input type="radio" name="skillsarea" checked="checked" value="java"/> <label for="s-radio_skillsareajava">JAVA</label> <input type="radio" name="skillsarea" value=".net"/> <label for="s-radio_skillsarea.net">.NET</label> <input type="radio" name="skillsarea" value="db"/> <label for="s-radio_skillsareadb">Database</label> <input type="radio" name="skillsarea" value="ajax"/> <label for="s-radio_skillsareaajax">Ajax</label> </td> </tr> </table> </form> </body>5.?select標(biāo)簽
select標(biāo)簽用于生成一個(gè)下拉列表框,通過為該元素指定list屬性,系統(tǒng)會(huì)使用list屬性指定的集合來生成下拉列表框的選項(xiàng)。這個(gè)list屬性指定的集合,既可以是普通集合,也可以是Map對(duì)象,還可以是集合元素是對(duì)象的集合。
除此之外,select表單還有如下幾個(gè)常用屬性:
??listKey:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的value。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的value。
??listValue:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的標(biāo)簽。如果集合是Map ,則可以使用key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的標(biāo)簽。
??multiple:設(shè)置該列表框是否允許多選。
從上面介紹中可以看出,select標(biāo)簽的用法與checkboxlist標(biāo)簽的用法非常相似。
下面我們看一個(gè)實(shí)例,其中分別使用了簡(jiǎn)單集合、簡(jiǎn)單Map對(duì)象、集合里放置Java實(shí)例來創(chuàng)建多個(gè)復(fù)選框。代碼如下所示:
示例7.3
?
?????<body>
??<h2>使用select標(biāo)簽</h2>
<!-- 使用字符串集合來生成下拉列表框?-->
<s:elect list="{'Struts2從入門到精通' , 'Spring2開發(fā)寶典' , 'Ajax實(shí)戰(zhàn)'}"
?????name="books" label="圖書列表">
</s:select>
<br><br>
<!-- 使用簡(jiǎn)單對(duì)象來生成下拉列表框?-->
<s:select name="books_map" label="圖書列表"
????list="#{'struts2':'Struts2從入門到精通', 'spring2':'Spring2開發(fā)寶典',
?????????????'ajax':'Ajax實(shí)戰(zhàn)'}"
listKey="key"
listValue="value"/>
<br><br>
<s:select name="b" label="圖書列表"
??????????multiple="true"
????????????list="#attr.bs"
??????????listKey="id"
????????????listValue="bookName" value="2"/>
??</body>
?
該頁面的運(yùn)行效果如圖7.1.4所示。
?
圖7.1.4 ?使用select標(biāo)簽
注意:可以使用select的value屬性設(shè)置<s:select>標(biāo)簽生成下拉框時(shí)的初始值,默認(rèn)情況下將以生成下拉框的第一項(xiàng)為初始值。
6.?doubleselect標(biāo)簽
????doubleselect標(biāo)簽會(huì)生成一個(gè)級(jí)聯(lián)列表框(會(huì)生成兩個(gè)下拉列表框),當(dāng)選擇第一個(gè)下
拉列表框時(shí),第二個(gè)下拉列表框的內(nèi)容會(huì)隨之改變。
????因?yàn)閮蓚€(gè)都是下拉選擇框,因此需要指定兩個(gè)下拉選擇框的選項(xiàng),因此有如下常用的屬性:
?list:指定用于輸出第一個(gè)卜拉列表框中選項(xiàng)的集合。
?listKey:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為第一個(gè)下拉列表框的value。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的value。
?listValue:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的標(biāo)簽。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為第一個(gè)下拉列表框的標(biāo)簽。
?doubleList:指定用于輸出第一個(gè)下拉列表框中選項(xiàng)的集合。
?doubleList Key:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為第一個(gè)下拉列表框的value。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為復(fù)選框的value。
?doubleList Value:該屬性指定集合元素中的某個(gè)屬性(例如集合元素為Person實(shí)例,指定Person實(shí)例的name屬性)作為復(fù)選框的標(biāo)簽。如果集合是Map,則可以使用key和value值分別代表Map對(duì)象的key和value作為第一個(gè)下拉列表框的標(biāo)簽。
?doubleName:指定第二個(gè)下拉列表框的name屬性。
?cssStyle:設(shè)置第一級(jí)下拉框的樣式。
?doubleCssStyle:設(shè)置第二級(jí)下拉框的樣式。
下面看一個(gè)實(shí)例,代碼如下所示:
示例7.4
(1)創(chuàng)建用于描述部門的實(shí)體類。
?
public class DeptInfo {
?
private String deptId;
private String deptName;
private Set<EmpInfo> empSet = new HashSet<EmpInfo>();//包含多個(gè)職工
//無參構(gòu)造函數(shù)
public DeptInfo() {
super();
}
//有參構(gòu)造函數(shù)
public DeptInfo(String deptId, String deptName) {
super();
this.deptId = deptId;
this.deptName = deptName;
}
//getter setter 方法省略......
}
(2)創(chuàng)建用于描述職工的實(shí)體類。
public class EmpInfo { private String empId; private String empName; //無參構(gòu)造函數(shù) public EmpInfo() { super(); } //有參構(gòu)造函數(shù) public EmpInfo(String empId, String empName) { super(); this.empId = empId; this.empName = empName; } //getter setter 方法省略...... }(3)創(chuàng)建業(yè)務(wù)邏輯控制器。
public class DoubleSelectAction extends BaseAction { //用于封裝用戶請(qǐng)求的部門編號(hào) private String deptId; //用于封裝用戶請(qǐng)求的職工編號(hào) private String empId; public String execute() throws Exception { //獲取輸出對(duì)象 PrintWriter out = super.getResponse().getWriter(); out.println("<h2>你選擇的信息是: <hr/>部門編號(hào): " + this.deptId + "<br/>"); out.println(" 職工編號(hào): " + this.empId + "</h2>"); return null; } public String getDeptId() { return deptId; } public void setDeptId(String deptId) { this.deptId = deptId; } public String getEmpId() { return empId; } public void setEmpId(String empId) { this.empId = empId; } }(4)創(chuàng)建jsp頁面。
<body><%DeptInfo d1 = new DeptInfo("D001","銷售部");DeptInfo d2 = new DeptInfo("D002","財(cái)務(wù)部");EmpInfo e1 = new EmpInfo("E001","張三");EmpInfo e2 = new EmpInfo("E002","李四");EmpInfo e3 = new EmpInfo("E003","王五");EmpInfo e4 = new EmpInfo("E004","趙六");d1.getEmpSet().add(e1);d1.getEmpSet().add(e2);d2.getEmpSet().add(e3);d2.getEmpSet().add(e4);//構(gòu)造map,用于存放所有部門Map map = new HashMap();map.put(d1,d1.getEmpSet());map.put(d2,d2.getEmpSet());request.setAttribute("map",map);%><s:form action="doubleSelect" namespace="/test">級(jí)聯(lián)下拉框:<hr/><s:doubleselect cssStyle="width:130px" list="#request.map.keySet()" listKey="deptId" listValue="deptName" name="deptId"doubleCssStyle="width:130px" doubleList="#request.map[top]" doubleListKey="empId" doubleListValue="empName" doubleName="empId"/><hr><s:submit value="提交"/> </s:form></body>運(yùn)行以上Jsp頁面,結(jié)果如圖7.1.5所示,
?
圖7.1.5 DoubleSelect標(biāo)簽的使用
在圖7.1.5中,對(duì)第一級(jí)“部門”下拉框做任意選擇時(shí),第二級(jí)“職工”下拉框內(nèi)容將做相應(yīng)的級(jí)聯(lián)改變。
單擊“提交”按鈕,提交到DoubleSelectAction控制器,運(yùn)行結(jié)果如圖7.1.6所示。
?
圖7.1.6 級(jí)聯(lián)下拉框提交
注意:
使用doubleselect標(biāo)簽時(shí),必須放在<<s:form…/>標(biāo)簽中使用,且必須為該<s:form .../>標(biāo)簽指定action屬性?
7. optiontransferselect標(biāo)簽
Optiontransferselect創(chuàng)建兩個(gè)選項(xiàng)用來轉(zhuǎn)移下拉列表項(xiàng),該標(biāo)簽會(huì)生成兩個(gè)<select/>標(biāo)簽,并且會(huì)生成系列的按鈕,這系列的按鈕可以控制選項(xiàng)在兩個(gè)下拉列表之間移動(dòng)、升降。當(dāng)提交該表單時(shí),兩個(gè)<select/>標(biāo)簽的請(qǐng)求參數(shù)都會(huì)被提交。
因?yàn)樵摌?biāo)簽會(huì)生成兩個(gè)下拉列表框,因此需要分別指定兩個(gè)下拉列表框中的集合、Label等屬性,下面是該標(biāo)簽常用的屬性。
?addAllToLeftLabel:設(shè)置全部移動(dòng)到左邊按鈕上的文本。
?addAllToRightLabel:設(shè)置全部移動(dòng)至右邊按鈕上的文本。
?addToLeftLabel:設(shè)置向左移動(dòng)按鈕上的文本。
?addToRightLabel:設(shè)置向右移動(dòng)按鈕上的文本。
?a1lowAddAllToLeft:設(shè)置是否出現(xiàn)全部移動(dòng)到左邊的按鈕。
?a1lowAddAllToRight:設(shè)置是否出現(xiàn)全部移動(dòng)到右邊的按鈕。
?a1lowAddToLeft:設(shè)置是否出現(xiàn)移動(dòng)到左邊的按鈕。
?a1lowAddToRight:設(shè)置是否出現(xiàn)移動(dòng)到右邊的按鈕。
?leftTitle:設(shè)置左邊列表框的標(biāo)題。
?rightTitle:設(shè)置右邊列表框的標(biāo)題。
?a1lowSelectAll:設(shè)置是否出現(xiàn)全部選擇按鈕。
?selectAllLabel:設(shè)置全部選擇按鈕上的文本。
?doubleList:設(shè)置用于創(chuàng)建第二個(gè)下拉選擇框的集合。
?doubleListKey:設(shè)置創(chuàng)建第二個(gè)下拉選擇框的選項(xiàng)value的屬性。
?doubleListValue:設(shè)置創(chuàng)建第二個(gè)下拉選擇框的選項(xiàng)label的屬性。
?doubleName:設(shè)置第二個(gè)下拉選擇框的name屬性。
?doubleValue:設(shè)置第二個(gè)下拉選擇框的value屬性。
?doubleMultiple:設(shè)置第二個(gè)下拉選擇框是否允許多選。
?list:設(shè)置用于創(chuàng)建第一個(gè)下拉選擇框的集合。
?listKey:設(shè)置創(chuàng)建第一個(gè)下拉選擇框的選項(xiàng)value的屬性。
?listValue:設(shè)置創(chuàng)建第一個(gè)下拉選擇框的選項(xiàng)label的屬性。注意此處的list , ?doubleList , ??listKey , ?doubleListKey , ?listValue和doubleListValue非常類似于checkboxlist標(biāo)簽中list, listKey和listValue的用法,只是此處用于生成兩個(gè)下拉列表框,而前者是生成多個(gè)復(fù)選框而已。
?name:設(shè)置第一個(gè)下拉選擇框的name屬性。
?value:設(shè)置第一個(gè)下拉選擇框的value屬性。
?multiple:設(shè)置第一個(gè)下拉選擇框是否允許多選。
下面代碼是使用optiontransferselect標(biāo)簽的示范,它分別指定了兩個(gè)簡(jiǎn)單集合來生成兩個(gè)下拉列表框的列表項(xiàng)。下面是使用optiontransferselect標(biāo)簽的代碼:
<!-- 使用簡(jiǎn)單集合對(duì)象來生成可移動(dòng)的下拉列表框 其中l(wèi)ist指定生成第一個(gè)下拉選擇框的選項(xiàng)的集合
??????????doubleList指定生成第二個(gè)下拉選擇框的選項(xiàng)的集合-->
??????<s:optiontransferselect
????????label="請(qǐng)選擇你喜歡的圖書"
??????????????name="cnb00k"
??????????leftTitle="中文圖書"
????????rightTitle="外文圖書"
????????list="{'Spring2.。寶典','輕量級(jí)J2EE企業(yè)應(yīng)用實(shí)戰(zhàn)','基于J2EE的Ajax寶典'}"
??????????multiple="true"
????????addToLeftLabel="向左移動(dòng)"
????????selectAllLabel="全部選擇"
??????????addAllToRightLabel="全部右移"
????????????headerKey="cnKey"
????????headerValue="一選擇中文圖書一"
??????????emptyOption="true"
??????????doubleList="{'Expert One一on一One J2EE Design and Development’,
????????????????,'JavaScript:The Definitive Guide’}"
??????????????doubleName="enBook"
doubleHeaderKey="enKey"
doubleHeaderValue="-一選擇外文圖書-一"
doubleEmptyOption="true"
doubleMultiple="true"></s:optiontransferselect>
在瀏覽器中瀏覽該頁面,將看到如圖7.1.7所示的頁面。
?
圖7.1.7 ?optiontransferselect標(biāo)簽
8.?token標(biāo)簽
<s:token>標(biāo)簽用于避免刷新頁面時(shí)多次提交表單,通過借助于TokenInterceptor攔截器來實(shí)現(xiàn)阻止頁面重復(fù)提交。當(dāng)Jsp使用<s:token/>標(biāo)簽的時(shí)候,Struts2會(huì)建立一個(gè)GUID(全局唯一的字符串)并放在Session中,同時(shí)在表單中添加一個(gè)隱藏域。而TokenInterceptor攔截器會(huì)攔截用戶的請(qǐng)求,并判斷客戶端form提交的token與session中保存的token是否相等 ,如果相等,則執(zhí)行action對(duì)應(yīng)的方法并清空;否則,攔截器將直接返回invalid.token結(jié)果,不會(huì)執(zhí)行Action對(duì)應(yīng)的方法。示例7.5演示了使用token標(biāo)簽的過程。
示例7.5
(1)創(chuàng)建用于處理用戶注冊(cè)的業(yè)務(wù)邏輯控制器Action.
public class RegAction extends ActionSupport { private String uid; private String pwd; public String execute() throws Exception { HttpServletResponse response = (HttpServletResponse)ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE); response.setContentType("text/html;charset=gbk"); response.setCharacterEncoding("gbk"); PrintWriter out = response.getWriter(); Date today = new Date(); out.println("<h2>用戶注冊(cè)信息如下: <hr/>用戶名:" + this.uid + "<br/>密 碼:" + this.pwd+"<hr>"); out.println("正在進(jìn)行注冊(cè) " + today.toLocaleString() + "..."); return null; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }(2)創(chuàng)建Jsp頁面,命名為“reg.jsp”。
?
<body><font color="red"><s:actionerror/></font><s:form action="reg" οnsubmit="return check()"><!-- 加入token標(biāo)簽 --><s:token/>填寫會(huì)員注冊(cè)信息:<hr/>用戶名:<s:textfield name="uid"/><br/>密 碼:<s:password name="pwd"/><br>確認(rèn)密碼:<s:password name="surePwd"/><br><s:submit value="提交"></s:submit><s:reset value="重置"></s:reset></s:form> <script type="text/javascript"> function $(elementName) { return document.getElementById(elementName); } function check() { if($("reg_uid").value == "") { alert("用戶名不能為空!"); $("reg_uid").focus(); return false; } if($("reg_pwd").value == "") { alert("密碼不能為空!"); $("reg_pwd").focus(); return false; } if($("reg_pwd").value != $("reg_surePwd").value) { alert("兩次密碼不一致!"); $("reg_surePwd").focus(); return false; } return true; } </script></body>(3)編寫用于顯示重復(fù)提交錯(cuò)誤信息的資源文件,創(chuàng)建application_zh.properties中文資源文件,將文件存放于WEB-INF/classes目錄下,內(nèi)容為“Struts.messages.invalid.token=表單已提交,不能重復(fù)提交”,并使用native2Ascii命令進(jìn)行轉(zhuǎn)化。
(4)在struts.xml中配置token攔截器。
?
<struts><constant name="struts.ui.theme" value="simple" /><constant name="struts.custom.i18n.resources" value="application" /> <package name="mypackage" extends="struts-default"> <!-- 定義攔截器棧--> <interceptors> <interceptor-stack name="tokenStack"><interceptor-ref name="token" /> <!-- 使用token攔截器--><interceptor-ref name="defaultStack" /><!-- 使用默認(rèn)攔截器--></interceptor-stack></interceptors> <!-- 將攔截器棧token作為默認(rèn)攔截器,則攔截器棧中定義的所有攔截器將作用于本包的所有Action--><default-interceptor-ref name="tokenStack" /><!-- 配置注冊(cè)Action--> <action name="reg" class="com.zzab.entity.RegAction"> <!-- 當(dāng)用戶重復(fù)提交表單時(shí),流程轉(zhuǎn)到stoken.jsp--><result name="invalid.token">/stoken.jsp</result></action></package></struts>運(yùn)行reg.jsp,運(yùn)行效果如圖7.1.8所示。
?
圖7.1.8 登錄頁面
單擊【提交】按鈕后就執(zhí)行了對(duì)應(yīng)的Action,如圖7.1.9所示。
?
圖7.1.9 執(zhí)行Action
此時(shí)刷新頁面,則根據(jù)token攔截器配置,將進(jìn)入invalid.token邏輯結(jié)果,即reg.jsp。該頁面會(huì)通過<s:actionerror/>標(biāo)簽讀取application_zh.prooperties中文資源文件的內(nèi)容并顯示。如圖7.1.10所示。
?
圖7.1.10 不能重復(fù)提交
7.1?非表單標(biāo)簽
7.2.1?Datetimepicker標(biāo)簽?
datetimepicke:標(biāo)簽生成一個(gè)日期、時(shí)間下拉選擇框,當(dāng)我們使用該日期、時(shí)間選擇框選擇某個(gè)日期、時(shí)間時(shí),系統(tǒng)會(huì)自動(dòng)將選中的日期、時(shí)間輸入指定文本框。
系統(tǒng)將指定日期、時(shí)間輸入指定文本框時(shí),必須轉(zhuǎn)換成日期、時(shí)間字符串,為了設(shè)置該字符串的格式,必須使用日期、時(shí)間的格式符。datetimepicker支持如下幾個(gè)格式符:
#dd:以兩位數(shù)字來顯示當(dāng)前日期的日。
#d:試圖以一位數(shù)字來顯示當(dāng)前日期的日,它不會(huì)使用兩位數(shù)字。
#MM:以兩位數(shù)字來顯示當(dāng)前日期的月。
#M:試圖以一位數(shù)字來顯示當(dāng)前日期的月,它不會(huì)使用兩位數(shù)字。
#YYYY:以4位數(shù)字來顯示當(dāng)前日期的年。
#YY:以兩位數(shù)字來顯示當(dāng)前日期的年。
#y:以一位數(shù)字來顯示當(dāng)前日期的年的最后一位。
使用該標(biāo)簽時(shí),有如下幾個(gè)常用屬性:
?displayFormat:該屬性指定日期的顯示格式,例如,可以使用dd/MM/yyyy作為日期格式。
?displayWeeks:該屬性指定該日歷能顯示星期數(shù)。
?endDate:指定日期集的最后可用日期。例如2941-10-12,一旦指定了該日期,則后面的日期不可用。
?formatLength:指定日期顯示的格式,這些格式值就是DateFormat中的格式,該屬性支持的值有long, ?short, ?medium和full 4個(gè)值。
?language:指定日期顯示的Locale,例如需要指定簡(jiǎn)體中文,則指定zh_ CN。
?startDate:指定日期集的最后可用日期。例如1941-10-18,一旦指定了該日期,則前面的日期不可用。
?toggleDuration:指定日期選擇框出現(xiàn)、隱藏的切換時(shí)間。
?toggletype:指定日期選擇框出現(xiàn)、隱藏的方式,可以選擇plain, wipe, explode和fade 4個(gè)值。
?type:指定日期選擇框的類型,支持的值有date和time,分別代表日期選擇框、時(shí)間選擇框。
?value:指定當(dāng)前日期、時(shí)間。可使用today來代表今天。
?weekStartsOn:指定口期選擇框中哪一天才是一周的第一天。周日是0,周六是6。
在使用datetimepicker標(biāo)簽之前,首先要通過MyEclipse導(dǎo)入struts2-dojo-plugin-2.2.1.jar文件,因?yàn)樵摌?biāo)簽包含在這個(gè)Jar文件中。
示例7.6
下面我們看一個(gè)該標(biāo)簽的實(shí)例,代碼如下所示: ?
<s:form theme="simple">日期選擇部件,指定toggleType屬性,且指定value="today"<br><sx:datetimepicker name="order.date" label="購買日期" toggleType="explode"value="%{'today'}"/><hr>日期選擇部件,指定了format屬性<br><sx:datetimepicker name="order.date" label="購買日期" displayFormat="yyyy年MM月dd日"/><hr>日期選擇部件,指定了weekStartOn屬性<br><sx:datetimepicker name="order.date" label="購買日期" displayFormat="yyyy年MM月dd日" weekStartsOn="2"/><hr> </s:form>在瀏覽器中瀏覽該頁面,將看到如圖7.1.11所示的頁面,在圖7.1.11中,如果我們單擊那些文本框后選擇日期,將出現(xiàn)一個(gè)日期選擇框。如果我們指定weekStartsOn屬性,則可以設(shè)置口期選擇框中每周中哪一天才會(huì)是第一天。
?
圖7.1.11?日期控件
?7.2.2?tree標(biāo)簽和treenode標(biāo)簽
這兩個(gè)標(biāo)簽主要用來生成一個(gè)樹形結(jié)構(gòu),例如常見的樹形菜單、樹形列表等。tree標(biāo)簽表示樹根,treenode標(biāo)簽表示樹的的節(jié)點(diǎn),需要嵌套在tree標(biāo)簽中。在使用這兩個(gè)標(biāo)簽之前,也需要通過MyEclipse導(dǎo)入struts2-dojo-plugin-2.2.1.jar文件。
示例7.7
下面是一個(gè)使用tree標(biāo)簽和treenode標(biāo)簽生成靜態(tài)樹形列表的示例。
<%@ page contentType="text/html; charset=utf-8" language="java" %> <%@taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="sdt" uri="/struts-dojo-tags"%> <html> <sdt:head parseContent="true"/> <title>使用tree和treenode標(biāo)簽生成靜態(tài)樹</title> <body> <h3>使用tree和treenode標(biāo)簽生成靜態(tài)樹</h3> <sdt:tree label="計(jì)算機(jī)編程系列圖書" id="books"><sdt:treenode label="JAVA編程系列" id="java"><sdt:treenode label="Spring2.0開發(fā)寶典" id="spring"/><sdt:treenode label="Struts2.0權(quán)威指南" id="struts"/><sdt:treenode label="Hibernate3從入門到精通" id="hibernate"/></sdt:treenode><sdt:treenode label="Ajax編程系列" id="ajax"><sdt:treenode label="JavaScript一百例" id="javascript"/><sdt:treenode label="Ajax實(shí)戰(zhàn)" id="ajaxsz"/></sdt:treenode> </sdt:tree> </body> </html>通過上述代碼可以看到,tree和treenode標(biāo)簽都是通過label屬性來設(shè)置樹形列表文本,此案例樹形列表中的文本數(shù)據(jù)都寫死到里面了,實(shí)際應(yīng)用中通常是從數(shù)據(jù)庫查詢出來并由Action返回到頁面中。運(yùn)行效果如圖7.1.12所示。
?
圖7.1.12 樹形列表
本章總結(jié)
?Struts的表單標(biāo)簽
可分為兩種:form標(biāo)簽本身和單個(gè)表單元素的標(biāo)簽。form標(biāo)簽本身的行為不同于表單元素標(biāo)簽。Struts 2的表單元素標(biāo)簽都包含了非常多的屬性,但有很多屬性完全是通用的。
?非表單標(biāo)簽
(1)datetimepicke:標(biāo)簽生成一個(gè)日期、時(shí)間下拉選擇框,當(dāng)我們使用該日期、時(shí)間選擇框選擇某個(gè)日期、時(shí)間時(shí),系統(tǒng)會(huì)自動(dòng)將選中的日期、時(shí)間輸入指定文本框。
(2)tree標(biāo)簽和treenode標(biāo)簽。這兩個(gè)標(biāo)簽主要用來生成一個(gè)樹形結(jié)構(gòu),例如常見的樹形菜單、樹形列表等。tree標(biāo)簽表示樹根,treenode標(biāo)簽表示樹的的節(jié)點(diǎn),需要嵌套在tree標(biāo)簽中。
任務(wù)實(shí)訓(xùn)部分
1:臟字過濾
訓(xùn)練技能點(diǎn)
?token標(biāo)簽
?token攔截器
??需求說明
在第五章的任務(wù)實(shí)現(xiàn)部分,我們實(shí)現(xiàn)了對(duì)評(píng)論進(jìn)行臟字過濾功能,現(xiàn)在要求增加防止表單重復(fù)提交的功能。
2:簡(jiǎn)易計(jì)算器
訓(xùn)練技能點(diǎn)
?OGNL
?表單標(biāo)簽
??需求說明
在前面的章節(jié)中我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)易計(jì)算器案例,現(xiàn)在要求使用Struts 2表單標(biāo)簽和OGNL對(duì)該案例進(jìn)行重構(gòu)。
3:動(dòng)態(tài)生成樹
訓(xùn)練技能點(diǎn)
?OGNL
?Tree標(biāo)簽
??需求說明
要求使用Struts 2 tree標(biāo)簽和OGNL動(dòng)態(tài)生成數(shù)據(jù)。
實(shí)現(xiàn)思路
(1)?創(chuàng)建用于查詢樹節(jié)點(diǎn)信息的Action,命名為TreeAction.java。
public class TreeAction extends ActionSupport {? public String execute() { Object[][] obj = { ??{"1","0","短信平臺(tái)管理","#"}, ??{"2","1","用戶管理","#"}, ??{"3","1","員工管理","#"}, ??{"4","1","短信管理","#"}, ??{"5","2","用戶權(quán)限管理","userRight.jsp"}, ??{"6","2","用戶列表","userList.jsp"}, ??{"7","3","員工信息列表","empList.jsp"}, ??{"8","3","員工信息修改","empUpdate.jsp"}, ??{"9","4","接收短信","acceptMessage.jsp"}, ??{"10","4","短信統(tǒng)計(jì)","messageCount.jsp"} ??}; ?ServletActionContext.getRequest().setAttribute("obj",obj);? return SUCCESS; }}
(2)?配置TreeAction。
<action name="treeaction" class="com.zzzy.action.TreeAction"> <result>/sx_tree.jsp</result> </action>
(3)?創(chuàng)建sx_tree.jsp。
<sx:tree label="短信管理平臺(tái)">? <s:iterator id="row" value="#request.obj">? <s:if test="#row[1]==1">? <sx:treenode label="%{#row[2]}">? <s:iterator id="row1" value="#request.obj">? <s:if test="#row1[1]==#row[0]">? <sx:treenode label="<a href=%{#row1[3]}>%{#row1[2]}</a>" />? </s:if>? </s:iterator>? </sx:treenode>? </s:if>? ? </s:iterator>? </sx:tree>
鞏固練習(xí)
一、選擇題
1. 以下()不屬于Struts 2的表單標(biāo)簽。
A.?<s:textfield>
B.?<s:textarea>
C.?<s:submit>
D.?<s:tree>
2. token標(biāo)簽的作用是()。
A.?顯示錯(cuò)誤消息
B.?校驗(yàn)表單數(shù)據(jù)
C.?防止重復(fù)提交
D.?生成相應(yīng)的html標(biāo)簽
3. Datetimepicker標(biāo)簽的()屬性用來指定該日歷能顯示星期數(shù)。
A. ?displayFormat
B.??endDate
C.??formatLength
D.??displayWeeks
4. 以下對(duì)checkboxlist標(biāo)簽描述正確的是()。
A.?其list屬性指定要循環(huán)的集合
B.?該標(biāo)簽使用集合生成一組復(fù)選框
C.?Listkey指定集合元素中的某個(gè)屬性作為復(fù)選框的文本
D.?listvalue指定集合元素中的某個(gè)屬性作為復(fù)選框的value
5. 以下對(duì)tree 和treenode標(biāo)簽描述錯(cuò)誤的是()。
A.?兩個(gè)標(biāo)簽主要用來生成一個(gè)樹形結(jié)構(gòu)。
B.?tree標(biāo)簽表示樹根。
C.?treenode標(biāo)簽表示樹的的節(jié)點(diǎn)。
D.?可以通過treenode 的list屬性指定一個(gè)集合并生成一組樹節(jié)點(diǎn)。?
二、上機(jī)練習(xí)
?在本章的核心任務(wù)部分,我們使用doubleselect標(biāo)簽實(shí)現(xiàn)了一個(gè)省市級(jí)聯(lián)列表框功能,現(xiàn)在要求把省市級(jí)聯(lián)改成樹形列表的形式。
?
總結(jié)
以上是生活随笔為你收集整理的Struts2 表单和非表单标签的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts2标签库和OGNL
- 下一篇: 高新面试系列 性格篇