- Java EE框架開發技術與案例教程
- 張繼軍 董衛
- 5137字
- 2020-05-28 14:20:34
4.3 Struts 2常用標簽
Struts 2框架提供了豐富的標簽庫用來構建視圖組件。Struts 2標簽庫簡化了視圖頁面的開發,并且提高了視圖組件的可維護性。
在JSP頁面中使用Struts 2標簽,首先要在JSP頁面中使用標簽庫指令,引入Struts 2的標簽庫,格式如下。
<%@ taglib uri="/struts-tags" prefix="s"%>
在本節中,只介紹最常用的幾種標簽,對于沒有涉及的標簽,在項目開發中若需要,可以查看Struts 2官方文檔。
4.3.1 Struts 2的通用標簽與應用案例
Struts 2的通用標簽主要有數據訪問、超鏈接等有關標簽,這里介紹最常用的幾種。
1.<s:property>標簽
該標簽用來輸出值棧中的指定對象及屬性的值,通常與OGNL結合使用。如下面的代碼所示。
<s:property value="#request.name"/> 功能:顯示對象request中的屬性name的值
2.a標簽
該標簽實現超鏈接,例如,下面的語句是超鏈接Action(也可以超鏈接JSP頁面)。
<s:a href="register.action">注冊</s:a>
3.<s:param>標簽
該標簽主要用于為其他標簽提供參數,格式如下。
<s:param name="***" value="***"/>
其中,name用于指定需要設置參數的參數名;value用于指定需要設置參數的參數值。
注意:①無論在給出value值時有沒有使用%{}, Struts 2都會對它進行ognl求值。②如果要傳遞String類型的字符串作為參數值,必須用單引號括起來。③可以把value屬性的值寫在開始標簽和結束標簽之間,從而可以傳遞一個EL表達式的值。
4.<s:bean>標簽
該標簽將創建一個JavaBean對象,并把它壓入ContextMap中。在創建JavaBean實例時,可以使用<s:param>標簽為JavaBean實例傳入參數。格式如下。
<s:bean name="類路徑" var="對象名稱"> <s:param name="屬性名"value="屬性值"/> //注意:若為字符串常量必須用單引號括起來 …………….. </s:bean>
其中:name用于指定要實例化的JavaBean的實現類;var用于設置實例名稱。
例如,利用【例4-1】中的Person類,在JSP頁面中創建對象并顯示。其關鍵代碼如下。
<s:bean name="com.edu.ognl.action.Person" var="s" > <s:param name="name" value="'zhangsan'"/> </s:bean> <s:property value="#s.name"/>
運行該JSP頁面時,顯示結果為zhangsan。
5.<s:set>標簽
set標簽用來在以下Map對象(ContextMap值棧,session、application和request等域對象)中創建一個鍵值對。其中ContextMap值棧為默認對象。其常用屬性如下。
● name:指定新變量的名稱,是必選項。
● scope:指定作用域request、response、session或application。默認值為default。
● value:為新變量賦值,可以是集合值。
(1)創建一個屬性并存儲
如下面的代碼所示。
<s:set name="age" value="20" scope=" request" />
(2)創建一個對象并賦值
例如,利用【例4-1】中的Person類,在JSP頁面中創建一個Bean對象,然后再賦值給一個變量并顯示該變量的值。其關鍵代碼如下。
<s:bean name="com.edu.ognl.action.Person" id="s" > <s:param name="name" value="'張三'"/> </s:bean> <s:set name="user" value="#s" scope="request"/> scope屬性值為request范圍:<s:property value="#request.user.name" />
運行該頁面時,首先形成對象s(保存在ContextMap子棧內),然后又形成對象user(保存在ContextMap子棧的request對象內),然后顯示對象user的值(name屬性值)。
(3)創建list集合并存儲,在訪問單個元素時,可以按其下標(下標從0開始訪問)。
如下面的代碼所示。
<s:set name="list" value="{'a', 'b', 'c', 'd'}"></s:set>
(4)創建map集合并存儲
Map集合的語法格式:#{key:value, key1:value1, key2:value2, .....}
利用該語法,可生成Map類型的集合,該Map對象中的每個key-value對象之間用英文的冒號隔開,多個元素之間用逗號分隔,若是字符串類型,用單引號括起來,如下面的代碼所示。
<s:set name="map" value="#{'1':'laowang', '2':'老王', '3':'猩猩'}"></s:set
6.url標簽
url標簽用來動態地創建一個URL,其常用屬性如下。
● action:指定一個Action作為URL地址。
● method:指定使用Action的方法。
● var:指定壓入值棧Map的值。
● value:指定生成URL的地址,若缺省,則使用action屬性指定值作為URL地址。
● encode:指定編碼請求方法。
● names:指定名稱空間。
如下面的代碼所示。
<s:set name="zhangsan1" value="'aaaa'"/> <s:set name="zhangsan2" value="'bbbb'"/> <s:url action="ognlTest" namespace="/test" var="add"> <! -- 該格式對應于value,按OGNL解析求值--> <s:param name="username1" value="#zhangsan1"/> <! -- 單引號括起來,該格式對應于value,不解析,按字符串常量--> <s:param name="username2" value="'zhangsan2'"/> <s:param name="id">12</s:param> </s:url> <s:url value="/xyz/input.jsp" var="aaa"></s:url> <! -- 使用該URL地址 --> ${add}<br> ${aaa}<br> <s:a href="%{add}">測試URL</s:a>
運行后顯示的結果如下(注意輸出格式)。
/工程名/test/ognlTest.action? username1=aaaa&username2=zhangsan2&id=12 /工程名/xyz/input.jsp 測試URL(超鏈接地址)
7.<s:action>標簽
該標簽用于在頁面上執行一個Action,并且還將當前Action對象壓入ContextMap子棧。常用屬性如下。
● var:指定被調用Action的引用,是可選項。
● name:指定Action的名稱,是必選項。
● namespace:指定被調用Action所在的namespace,是可選項。
● executeResult:指定將Action處理結果包含到當前頁面中,默認值為false。
● ignoreContextParams:指定當前頁面的數據是否需要傳給被調用的Action,默認值為false,即默認將頁面中的參數傳給被調用的Action,是可選項。
例如,在【例4-2】中設計并配置的Action,可以在頁面中直接調用執行,語句如下。
<s:action name="ognlTest" namespace="/test"></s:action>
8.<s:date>標簽
該標簽用于格式化輸出日期。該標簽有以下幾個屬性。
● format:若指定該屬性值(必須是java.text.SimpleDateFormat類中定義的日期/時間格式之一),將根據該屬性指定的格式來格式化日期。
● nice:指定是否輸出指定日期和當前時刻之間的時差。默認為false。
● name:屬性是必選的,指定要格式化的日期值。
● var:指定格式化后的字符串將被放入ContextMap中。
使用格式如下。
1)按指定日期格式輸出:<s:date name="指定日期取值" format="日期格式"/> 2)輸出時間差:<s:date name="指定日期取值" nice="true"/> 3)默認格式輸出:<s:date name="指定日期取值"/>
例如,date標簽的使用(dateTag.jsp)。
<s:bean name="java.util.Date" var="d"> <s:param name="date" value="10"></s:param> </s:bean> (1)nice="false",且指定format="dd/MM/yyyy" <br> <s:date name="#d" format="dd/MM/yyyy" nice="false"/><br> (2)nice="true",且指定format="dd/MM/yyyy" <br> <s:date name="#d" format="dd/MM/yyyy" nice="true"/><br> (3)nice="false",沒有指定format屬性,指定了var <br> <s:date name="#d" nice="false" var="abc"/> ${requestScope.abc}= =<s:property value="#abc"/>
運行結果如下。
(1)nice="false",且指定format="dd/MM/yyyy" 10/09/2015 (2)nice="true",且指定format="dd/MM/yyyy" 10 days ago (3)nice="false",沒有指定format屬性,指定了var 2015-9-10 20:42:08= =2015-9-10 20:42:08
9.actionerror和actionmessage標簽
actionerror和actionmessage這兩個標簽都是在頁面上輸出Action中方法添加的信息。其中,actionerror標簽輸出的是Action中addActinErrors()方法添加的信息;而actionmessage標簽輸出的是Action中AddActionMessage()方法添加的信息。
【例4-4】在Action中,利用addActinErrors()方法添加信息;而在JSP中利用actionerror標簽和actionmessage標簽輸出Action中添加的信息。
1)設計添加信息的Action:ActionErrorActionMessage。
package com.edu.ognl.action; import org.apache.struts2.convention.annotation.*; import com.opensymphony.xwork2.ActionSupport; @Namespace("/test") @ParentPackage("struts-default") @Results({ @Result(name = "success", location = "/showErrorActionMessage.jsp") }) public class ActionErrorActionMessage extends ActionSupport { private static final long serialVersionUID = 1L; @Action("messageTest") public String execute() { // 使用addActionError()方法添加信息 addActionError("使用ActionError添加錯誤信息!"); addActionMessage("使用ActionMessage添加普通信息!"); return SUCCESS; } }
2)設計JSP:showErrorActionMessage.jsp,輸出由Action中AddActionMessage()方法添加的信息。
<%@page contentType="text/html" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>actionerror標簽和actionmessage標簽的使用</title> </head> <body> <s:actionerror/> <s:actionmessage/> </body> </html>
3)啟動服務器,在地址欄輸入如下請求。
http://localhost:8080/c4_ognl_tag/test/messageTest
運行程序,在頁面上將顯示如下信息。
使用ActionError添加錯誤信息! 使用ActionMessage添加普通信息!
4.3.2 Struts 2的控制標簽與應用案例
控制標簽主要用來完成流程的控制,如條件分支、循環操作等,也可以實現對集合的排序和合并。
1.if、elseif和else標簽
這3個標簽是用來控制流程的,與Java語言中的if、elseif、else語句相似。在該標簽中,使用test屬性作為測試條件。例如下面的代碼,首先創建一個變量score,并賦值為86,然后利用判定標簽,顯示相應的信息。在這里,顯示“良好”。
<s:set name="score" value="86"/> <s:if test="#score>=90">優秀</s:if> <s:elseif test="#score>=80">良好</s:elseif> <s:elseif test="#score>=70">中等</s:elseif> <s:elseif test="#score>=60">及格</s:elseif> <s:else>不及格</s:else>
2.iterator標簽
該標簽用于遍歷集合,可以遍歷一個數組、Collection(List、Set)或Map,并把這個可遍歷對象中的每一個元素依次壓入和彈出ValueStack棧。格式如下。
<s:iterator value="" var="" status="">…</s:iterator>
其中,常用屬性如下。
● value:指定迭代輸出的集合對象,可以是OGNL,或通過Action返回的集合。
● var:指定集合中每個元素的引用變量(可選項)。
● status:指定集合中元素的status屬性(可選項),且該屬性的屬性值如表4-1所示。
表4-1 status屬性的屬性值

1)遍歷訪問List集合,如下面的代碼所示(注意代碼中給出的注釋說明)。
<! -- 說明:設置set集合(創建list對象并存放到request中),給value賦值;--> <! -- 利用value="#request.list" 獲取集合對象,并指定迭代時的IteratorStatus實例,其中 statu.odd返回當前被迭代元素的索引是否是奇數 --> <s:set name="list" value="{'a', 'b', 'c', 'd'}" scope="request">></s:set> <s:iterator var="ent" value="#request.list" status="st"> <font color=<s:if test="#st.odd">red</s:if><s:else>blue</s:else>> <s:property value="#ent" /> </font><br> </s:iterator>
2)遍歷訪問Map集合,如下面的代碼所示(注意代碼中給出的注釋說明)。
<h3>Map集合</h3> <! -- 說明:Map集合語法格式:#{key:value, key1:value1, key2:value2, .....} 該語法直接生成了一 個Map類型的集合,該Map對象中的每個key-value對象之間用英文的冒號隔開,多個元 素之間用逗號分隔。 首先創建Map對象,然后對Map對象進行遍歷,并顯示其對應的“健”---“值”--> <s:set var="map" value="#{'1':'張三', '2':'李四', '3':'王五'}"></s:set> 遍歷Map:<br /> <s:iterator value="#map"> <s:property value="key"/> --對應于-- <s:property value="value"/><br/> </s:iterator>
3)對集合變量進行遍歷訪問。
例如,假設users是User的對象集合,并存儲在session對象內,age(年齡)是User中的一個屬性。
<h3>遍歷集合</h3> <! -- 遍歷出年齡大于30的所有人員 --> <s:iterator var="user" value="#session.users"> <s:if test="%{#user.age>30}"> <s:property value="#user.age"/> </s:if> </s:iterator> <! --遍歷出年齡大于30的最后一名人員。 注意,運算符“$”表示取出滿足條件的最后一個值 --> <s:iterator var="u" value="#session.users.{$(#this.age>30)}"> <s:property value="#u.age"/> </s:iterator>
4.3.3 Struts 2的表單標簽與應用案例
Struts 2的表單標簽將在HTM文檔里被呈現為一個表單元素。使用Struts 2的表單標簽具有以下優點。
● 可以實現表單回顯,對于修改信息特別方便。
● 對頁面進行自動布局和排版。
●標簽的屬性可以被賦值為一個靜態的值或一個OGNL表達式,如果在賦值時使用了一個OGNL表達式并把它用%{}括起來,這個表達式將會被求值。
Struts 2中的大部分表單標簽和HTML表單元素一一對應,表4-2給出了常用的幾個標簽,表4-3給出了表單標簽的共同屬性。
表4-2 Struts 2常用的表單標簽

表4-3 表單標簽常用的共同屬性

1.form標簽
form標簽用來呈現HTML語言中的表單元素,其主要屬性如表4-4所示。
表4-4 form標簽的主要屬性

在默認情況下,form標簽將被呈現為一個表格形式的HTML表單,嵌套在form標簽里的輸入字段將被呈現為一個表格行,每個表格行由兩個字段組成,一個對應行標,一個對應輸入元素,提交按鈕將被呈現為一個橫跨兩列單元格的行。
2.textfield標簽、password標簽和hidden標簽
● textfield標簽:生成一個單行的文本輸入框。
● password標簽:生成一個密碼域。
● hidden標簽:生成一個隱藏域。
語法格式如下。
<s:標簽名label="***"name="***"size="***"maxlength="***"/>
其中,label是文本框提示,size是文本框寬度,maxlength是最大字符數。對于password標簽有showPassword屬性,其屬性值是布爾型,默認值為false,決定著在表單回顯時是否顯示輸入的密碼。
3.textarea標簽:生成一個多行文本框
語法格式如下。
<s:textarea label="***" name="***" cols= "***" rows="***"/>
4.checkbox標簽:復選框標簽
該復選框元素用于提交一個布爾值,如果該框被選中了,它的值將為true。
語法格式如下。
<s:checkbox label="***" name="***" value="true"/>
5.checkboxlist標簽、select標簽和radio標簽
這3個標簽有3個非常重要的屬性:list、listKey和listValue。
可以將Map、Lits集合類型的對象賦給list屬性;同時可以把用來提供選項值的屬性賦給listKey屬性,把用來提供選項行標的屬性賦給listValue屬性(這兩個屬性相當于Map類型的鍵值對)。
1)checkboxlist標簽:形成多選復選框,如下面的代碼所示。
<s:checkboxlist label="個人愛好" list="{'學習', '看電影', '編程序'}" name="love"/>
2)select標簽:生成一個下拉列表框,如下面的代碼所示。
<s:select label="選擇星期" headerValue="---請選擇---" headerKey="1" list="{'星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'}"/>
3)radio標簽:為一個單選框,如下面的代碼所示。
<s: radio label="性別" list="{'男', '女'}" name="sex"></s: radio>
6.file標簽
用于在頁面上生成一個上傳文件的元素。
語法格式如下。
<s:file name="***" label ="***"/>
7.標簽的主題
為了讓所有的UI標簽能夠產生同樣的視覺效果而歸集到一起的一組模板,即風格相近的模板被打包成一個主題。
1)主題類型:在Struts 2中給出了以下幾個主題。
● simple:把UI標簽翻譯成最簡單的HTML對應元素,而且會忽視行標屬性。
● xhtml:xhtml是默認的主題,使用一個布局表格提供了一種自動化的排版機制。
● css_xhtml:與xhtml主題里的模板很相似,但它們將使用css來進行布局和排版。
● ajax:以xhtml主題里的模板為基礎,但增加了Ajax功能。
2)修改主題:通常采用以下方法修改主題。
● 通過UI標簽的theme屬性。
● 在表單里,若沒有給出某個UI標簽的theme屬性,它將使用這個表單的主題。
●修改struts.properties文件中的struts.ui.theme屬性。
【例4-5】 Struts 2的表單標簽應用示例。利用Struts 2的表單標簽設計下面的JSP頁面(在代碼中給出了相關的注釋),并與如圖4-5所示的運行界面對照,理解各標簽的使用格式與功能。

圖4-5 【例4-5】的運行頁面
1)設計界面:form.jsp,其主要代碼如下。
<%@ taglib prefix="s" uri="/struts-tags"%> <html><head><title>表單設計演示</title></head> <body> <h3>FORM表單</h3> <s:form action="" name="test"> <s:textfield label="用戶名" name="uname"/> <s:password label="密碼" name="upass"/> <s:file name="file" label="上傳文件"/> <s:hidden name="id" value="1"/> <! -- 基于Map類型,設計列表框 --> <s:select list="#{'1':'博士', '2':'碩士'}" name="edu" label="學歷" listKey="key" listValue="value"></s:select> <! -- 基于集合類型,設計列表框,其中,value值設置為默認選中項 --> <s:select label="lanuage"list="{'java', '.net', ''}"value="{'.net'}"></s:select> <! --單選復選框的設計,必須有name --> <s:checkbox label="愛好 "name="checkboxFiled1"value="true"></s:checkbox> <! -- 基于數組類型實現多個checkbox,并指定默認選中項 --> <s:checkboxlist list="{'java', 'css', 'html', 'struts2'}" label="喜歡的編程語言1" name="box" value="{'css', 'struts2'}"></s:checkboxlist> <! -- 基于Map集合實現多選復選框,注意:前要加#,并指定默認選中項--> <s:checkboxlist list="#{1:'java',2:'css',3:'html',4:'struts2',5:'spring'}" label="喜歡的編程語言2" name="boxs" value="{1,2}"></s:checkboxlist> <! --radio標簽的使用,并模擬從后臺傳進選中的默認值 --> <% //從服務器傳過來的值用于設置單選按鈕的默認值 request.setAttribute("sex", "男"); session.setAttribute("sex1", "1"); %> <s:radio label="性別1" list="{'男', '女'}" name="sex1" value="#request.sex"/> <s:radio label="性別2" list="#{'1':'男', '2':'女'}" name="sex2" listKey="key" listValue="value" value="#session.sex1"></s:radio> <! -- textarea標簽的使用 --> <s:textarea name="rmake" cols="40" rows="5" label="備注"/> <! -- 防止表單重復提交的方式 --> <s:token></s:token> <s:submit value="提交"></s:submit> </s:form> </body> </html>
2)運行界面如圖4-5所示。
- Vue.js 2 and Bootstrap 4 Web Development
- .NET 4.0面向對象編程漫談:基礎篇
- Ray分布式機器學習:利用Ray進行大模型的數據處理、訓練、推理和部署
- C語言從入門到精通(第4版)
- ArcGIS By Example
- 精通Linux(第2版)
- MATLAB for Machine Learning
- PHP編程基礎與實例教程
- ASP.NET程序開發范例寶典
- JavaScript+jQuery網頁特效設計任務驅動教程
- 智能手機故障檢測與維修從入門到精通
- OpenCV 3 Blueprints
- ASP.NET 4.0 Web程序設計
- Android 游戲開發大全(第二版)
- Isomorphic JavaScript Web Development