Struts 2 標簽庫使用大全
<s:if>標簽
擁有一個test屬性,其表達式的值用來決定標簽里內容是否顯示<s:if test="#request.username=='clf'">歡迎clf</s:if><s:elseif test="#request.username=='yqy'>歡迎yqy</s:elseif>
<s:else>請登錄</s:else></pre>
<s: iterator>標簽
用于遍歷集合(java.util.Collection)或者枚舉值(java.util.Iterator)類型的對象,value屬性表示集合或枚舉對象,status屬性表示當前循環的對象,在循環體內部可以引用該對象的屬性
<s:iterator value="userList" status="user"> 姓名:<s:property value="user.userName" /> 年齡:<s:property value="user.age" /> </s:iterator> <s:debug></s:debug><s:iterator value="#request.strs" var="strs"> <s:property value="#strs"/> </s:iterator> <s:debug></s:debug></pre>
<s:textfield>
文本框標簽,可填寫文本內容,同時該標簽含有很多有用的屬性:
readonly 只讀屬性
disabled 可用/不可用屬性,如果設置為不可用在提交表單的時候該文本框的值不會傳到后臺
cssClass 指定css的class
cssStyle 自定義css樣式
maxlength 文本框可輸入的文字個數
tooltip 冒泡提示
<s:form action="register" method="post"> <s:textfield name="username" label="用戶名"></s:textfield> </s:form><s:password>
與<s:textfield>類似
<s:textarea>
與<s:textfield>類似
其核心屬性cols和rows分別指定文本域的寬度和高度
<s:file>標簽
與<s:textfield>類似
<s:submit>標簽
生成提交按鈕
<s:reset>標簽
生成重置按鈕
<s:radio>標簽
<s:radio name="sex" list="#{'male':'男','female':'女'}" value="male" label="性別" tooltip="選擇性別">
使用value指定默認值
radio標簽的list屬性必須是Map類型,key為實際值,value為顯示值,如果為List類型會拋出異常
<s:checkbox>標簽
<s:checkbox name="checkName" value="true" fieldValue="Y"/>
struts2的checkbox標簽在使用的時候需要注意它的兩個屬性。value和fieldValue,在其他的標簽中value是真實值。而在checkbox中,value如果為true,就表示復選框被選中;如果為false就表示不被選中。fieldValue才是此復選框對應的真實的值。
<s: checkboxlist>標簽
擁有list、listKey、listValue屬性,參照<s:select>標簽的注解
<s:checkbox list name="interest" list="{'足球','籃球','排球','游泳'}" label="興趣愛好"/>
需要用復選框時,如果對應的屬性為Boolean類型時用checkbox標簽,如果為集合類或者數組類則用checkboxlist標簽
<s: combobox>標簽
此標簽用于生成一個組合框,即可選擇,也可編輯,就是一個編輯框加一個下拉框
<s:combobox list="#request.list2" name="fruit" label="最喜愛的水果"/><s:select>標簽
輸出一個下拉列表框,相當于HTML代碼中的<select/>
常用屬性如下:
list:必需,可以為Cellection、Map、Enumeration、Iterator、array類型,指定要迭代的集合,使用集合中的元素來設置各個選項,如果list的屬性為Map則Map的key成為選項的value,Map的value會成為選項的內容
listKey:指定集合對象中的哪個屬性作為選項的value
listValue:指定集合對象中的哪個屬性作為選項的內容
headerKey:設置當用戶選擇了header選項時,提交的的value,如果使用該屬性,不能為該屬性設置空值,headerKey指定缺省的選項"value",headerValue指定缺省的選項"text"
headerValue:顯示在頁面中header選項內容
emptyOption:是否在header選項后面添加一個空選項
multiple:是否多選
size:顯示的選項個數
示例如下
<s:select list="{'aa','bb','cc'}" headerKey="00" headerValue="00"></s:select><s:select list="#{1:'aa',2:'bb',3:'cc'}" label="abc" listKey="key" listValue="value" headerKey="0" headerValue="aabb">
<% java.util.HashMap map = new java.util.LinkedHashMap(); map.put(1,"aaa"); map.put(2,"bbb"); map.put(3,"ccc"); request.setAttribute("map",map); request.setAttribute("aa","2"); %> <s:select list="#request.map" label="abc" listKey="key" listValue="value" value="#request.aa" headerKey="0" headerValue="aabb"></ s:select></pre>
<s:doubleselect>標簽
輸出關聯的兩個HTML列表框,產生聯動效果
list、listKey、listValue、headerKey、headerValue、emptyOption、multiple、size屬性與<s:select>標簽一樣,作用域第一個下拉框
doubleId:指定第二個列表框的ID
doubleList:指定第二個下拉框要迭代的集合
doubleListKey:指定集合對象中的哪個屬性作為選項的value,該選項只對第二個列表框起作用
doubleListValue:指定集合對象中的哪個屬性作為選項的內容,該選項只對第二個列表框起作用
doubleSize:選項個數
doubleName:指定第二個列表框的name映射
doubleValue:第二個列表框的初始選項
注意,list屬性必須為結合類型或者數組類型,而doublelist屬性必須為Map類型
//城市對象 public class CityBean { private int cityid; private String cityname; //省略了setter、getter方法 }//區域對象 public class AreaBean { private int areaid; private String areaname; private int cityid; //省略了setter、getter方法 }
public class CityAction extends ActionSupport { //map映射cityid--區域列表 private Map<Integer, List<AreaBean>> areaMap = new HashMap<Integer, List<AreaBean>>(); //list裝所有city集合 private List<CityBean> cityBeans = new ArrayList<CityBean>(); public Map<Integer, List<AreaBean>> getAreaMap() { return areaMap; } public void setAreaMap(Map<Integer, List<AreaBean>> areaMap) { this.areaMap = areaMap; } public List<CityBean> getCityBeans() { return cityBeans; } public void setCityBeans(List<CityBean> cityBeans) { this.cityBeans = cityBeans; }</pre>
<!-- areaMap[top.cityid]: top是指前一個下拉框整個的選中項cityBean, cityid就是指cityBean中cityid 所以areaMap[top.cityid]指map集合中第一個下拉框選中的id對應的list集合 list里面每個元素放的是AreaBean --> <s:doubleselect tooltip="選擇城市操作" label="請選擇城市" name="city" list="cityBeans" listKey="cityid" listValue="cityname" doubleList="areaMap[top.cityid]" doubleName="area" doubleListKey="areaid" doubleListValue="areaname" />
讓它們一行顯示,比較簡單的做法是:
定義樣式:
<style type="text/css"> .doubleselect br{ display: none; } < /style>
< div class="doubleselect">把<s:form>的代碼放進來</div><s:date>標簽
用以輸出一個格式化的日期對象,name表示要輸出的對象,format表示輸出的日期格式
<s:date name="user.birthday" format="dd/MM/yyyy" /><s:date name="user.birthday" format="%{getText('some.i18n.key')}" />
<s:date name="user.birthday" />--默認格式</pre>
<s:append>標簽
用于將多個枚舉值對象進行疊加,形成一個新的枚舉值列表
如將3個列表對象進行了組合,形成新的列表對象:
<s:append var="newIteratorList"> <s:param value="%{myList1}" /> <s:param value="%{myList2}" /> <s:param value="%{myList3}" /> </s:append><s:generator>標簽
下面的代碼將分隔為3個字符串,然后循環輸出
<s:generator val="%{'aaa,bbb,ccc'}"> <s:iterator> <s:property /> </s:iterator> </s:generator>
<s:merge>標簽
用于將多個枚舉值按照數組的索引位置進行合并
<s:merge var="newMergeList"> <s:param value="%{mylist1}">--設mylist1列表中有a,b,c三個元素 <s:param value="%{mylist2}">--設mylist2列表中有1,2,3三個元素 </s:merge>
合并后新的列表的元素及其順序為:a,1,b,2,c,3
<s:sort>標簽
用于對一組枚舉值進行排序,屬性comparator指向一個繼承自java.util.Comparator的比較器,該比較器可以是對應Action頁面中的一個比較器變量,source指定要排序的列表對象
<s:bean id="myComparator" name="com.clf.MyComparator"></s:bean> <s:sort comparator="myComparator" source="budget.approve"> <s:iterator value="budget.approve" status="st"> </s:iterator> </s:sort>import java.util.Comparator;public class MyComparator implements Comparator<Object> {
public int compare(Object arg0, Object arg1) {System.out.println(arg0.toString().compareTo(arg1.toString())); //默認從小到大排列 return arg0.toString().compareTo(arg1.toString()); //從大到小排列 //return -(arg0.toString().compareTo(arg1.toString())); }
} </pre>
<s:subset>標簽
subset標簽用于取得集合的子集,該標簽的底層通過org.apache.Struts2.util.Subset.IteratorFilter類提供實現。使用subset標簽可以指定如下幾個屬性:
count:可選屬性,指定子集中元素的個數,默認取得源集合的所有元素
source:可選屬性,指定源集合,如果不指定,默認取得valueStack棧頂的集合,一般都會指定
start:可選屬性,指定從源集合的第幾個元素開始截取,默認從第一個元素(即start=0)開始
decider:可選屬性,由開發者自己決定是否選中該元素
<!--截取從下標1開始的三個元素--> <s:subset source="{'Java','Spring2.0','J2EE','Ajax','WebWork'}" start="1" count="3"> </s:subset>
此外,Struts2還允許開發者決定截取標準,開發者只需要實現一個Decider類,實現SubsetIteratorFilter.Decider接口中的boolean decide(Object element)方法,如果該方法返回真,則表明該元素將被選入子集中。看如下代碼:
import org.apache.struts2.util.SubsetIteratorFilter; public class MyDecider implements SubsetIteratorFilter.Decider { public boolean decide(Object element) throws Exception { String str = (String)element; return str.indexOf("J2EE") > 0; } }
<!--截取包含"J2EE"的所有元素--> <s:subset source="{'Java','Spring2.0','J2EE','Ajax','WebWork'}" decider="#mydecider"> </s:subset><s:a>標簽
用于創建一個<a>標簽,errorText用于顯示錯誤信息,preInvokeJS表示該鏈接執行時的javascript提示函數,href表示跳轉地址.
<s:a errorText="刪除錯誤" preInvokeJS="confirm('確認刪除?')" href="test.jsp"> <img src="/image/delete.gif" /> </s:a>
帶參數的鏈接
<s:iterator value="#request.userList"> <tr align="center"> <td><s:property value="id"/> : <s:property value="username"/></td> <td><s:property value="age"/></td> <td><s:property value="sex"/></td> <td><s:property value="address"/></td> <td> <s:a href="userAction!addUser.action">添加</s:a> | //第一種方式,在標簽內使用標簽時用% <s:a href="userAction!loadUser.action?user.id=%{id}">編輯</s:a> | //第二種方式:使用<s:url>標簽解決 <s:url id="idUrl" action="userAction!delUser.action"> <s:param name="user.id" value="%{id}"></s:param> </s:url> <s:a href="%{idUrl}">刪除</s:a> //第三種:直接加入 <a href="<s:url action="userAction!delUser.action"> <s:param name="user.id" value="id"/> </s:url>">刪除2 </a> </td> </tr> </s:iterator><s:url>標簽
<s:url>生成一個url地址,可以通過url標簽制定的<s:param>子元素向URL地址發送請求參數
<s:url action=""> --指定請求地址 <s:param name="" value=""></s:param> --指定參數 </s:url>
屬性includeParams:該屬性有三個值:none、get、 all,默認值為get
當該屬性值為get時,該url會將訪問其所在jsp的的請求的所有get方法的參數添加到自身來
當它的屬性值為all時,更是將get和post的的參數值全部添加到自身來
當includeParams的值是all或get,param標簽中定義的參數將有優先權,也就是說其會覆蓋其他同名參數的值
<s:action>標簽
使用action標簽,可以允許在jsp頁面中直接調用Action,在調用Action時候,可以指定需要被調用的Action的name和namespace.如果指定了executeResult參數的屬性值為true,該標簽會把Action的處理結果(視圖資源)包含到本頁面中. 使用action標簽指定屬性有:
id: 可選屬性,作為該Action的引用ID<s:action name="actionName" executeResult="true" namespace="/"> <s:param name="currentPage" value="傳遞的值"></s:param> </s:action> <!-- <s:param ></s:param>是以request.setAttribute方式的值的,而不是以參數傳值 -->
name:必選屬性,指定調用Action
namespace:可選屬性,指定該標簽調用Action所屬namespace
executeResult:可選屬性,指定是否將Action的處理結果包含到本頁面中.默認值為false,不包含.
ignoreContextParam:可選參數,指定該頁面的請求參數是否需要傳入調用的Action中,默認值是false,即傳入參數.
上例中,以request.getParameter("")會獲取不到值
通過request.getAttribute("")方式才可以獲取
另外,使用<s:param ></s:param> value指代的是action定義的對象的名稱,而不是一個具體的值,和 <s:textfield>中的name是一個意思,所以要要傳遞字符串不能把值寫value中而應該寫到
<s:param >寫到這里</s:param>
<s:param >標簽
param標簽用來把一個參數傳遞給包含著它的那個標簽。
不管在給出value屬性值時有沒有使用"%{"和"}",Struts都會對它進行求值。就是說value指代的是action定義的對象、屬性的名稱,而不是一個具體的值
例如,下面這個param標簽的值是userName動作屬性:
<s:param name="userName" value="userName"/>它與下面這個標簽是等價的:
<s:param name="userName" value="%{userName}"/>如果想傳遞一個String類型的字符串作為參數值,必須把它用單引號括起來。例如,下面這個param標簽的值是字符串"clf"
<s:param name="userName" value="'clf'"/>
該值會以java.lang.Object的格式放入statck
等價于
<s:param name="userName">clf</s:param>
參數會以String的格式放入statck
這種寫法還可以使用一個EL表達式,例如,下面代碼將把當前主機名傳遞給host參數:
而下面這樣的寫法就不行了:
<s:param name="host" value="${header.host}"/> <!-- 無效的。--><s:bean>標簽
用于創建一個JavaBean對象,name表示JavaBean類全名,var表示變量的實例名,并可以包含<s:param>設置實例化輸入參數
public class Test1 { private String str;public String getStr() { return str; } public void setStr(String str) { this.str = str; } public String hello() { return "Hello World!"; } public String hello(String name) { return "Hello," + name; }
}</pre>
然后就可以使用這個bean了:
<s:bean name="test.Test1" id="mybean"> <s:param name="str" value="'abc'"></s:param> </s:bean><s:property value="#mybean.str"/><br/> <s:property value="#mybean.hello()"/><br/> <s:property value="#mybean.hello('tom')"/></pre>
<s:property>標簽
1,訪問Action值棧中的普通屬性:
<s:property value="attrName"/>
2,訪問Action值棧中的對象屬性(要有getter、 setter方法):
<s:property value="obj.attrName"/><s:property value="obj1.obj2.attrName"/></pre>
3,訪問值棧中對象屬性的方法
<s:property value="obj.methodName()"/>
4,訪問值棧中action的普通方法:
<s:property value="methodName()"/>
5,訪問靜態方法:
<s:property value="@com.softeem.LoginAction@methodName()"/>
6,訪問靜態屬性:
配置屬性文件,允許ognl訪問靜態方法struts.ognl.allow...=true
<s:property value="@com.softeem.LoginAction@attrName"/>
7,訪問Math類的靜態方法:
<s:property value="@@min(9,7)"/>
8,訪問普通類的構造方法:
<s:property value="new com.softeem.User(2)"/>
9,訪問集合:
①list集合對象
<s:property value="listName"/>
②list集合中的某個元素
<s:property value="listName[1]"/>
③list中某個屬性的集合
<s:property value="listName.{field}"/>
④list中某個屬性集合的特定值
<s:property value="listName.{field}[0]"/>
⑤訪問set
<s:property value="setName"/>
⑥訪問set中某個元素
<s:property value="setName[0]"/>
⑦訪問map
<s:property value="mapName"/>
⑧根據key訪問Map中的元素
<s:property value="mapName.username"/><s:property value="mapName['username']"/>
<s:property value="mapName[/"username/"]"/></pre>
⑨訪問map中所有的key
<s:property value="mapName.keys"/>
10,訪問map中所有的values
<s:property value="mapName.values"/>
11,訪問map的大小
<s:property value="mapName.size()"/>
12,投影
<s:property value="listName.{?#this.age==1}"/> <s:propertyvalue="listName.{^#this.age>1}"/> <s:propertyvalue="listName.{$#this.age==1}"/> <s:propertyvalue="listName.{$#this.age==1}.{age}==null"/> <s:propertyvalue="[0]"/>值棧中的對象
<s:i18n>與<s:text>標簽
<s:i18n>加載資源包到值堆棧。它可以允許<s:text>訪問任何資源包的信息,而不只當前action相關聯的資源包
用<s:text>標簽來訪問國際化信息,只需要在它的name屬性上填入需要的key即可
<s:i18n name="xxx.xxx.xxx.ApplilcationMessages"> <s:text name="HelloWord" /> </s:i18n><s:debug>標簽
用以輸出頁面的值棧調試信息,通常在進行程序調用時使用,便于查找JSP頁面中的錯誤
它提供的是Struts ValueStack Debug ..也就是說,都是struts2的值棧(就是各個值的信息).
這個值棧又分為兩種.Value Stack Contents 和 Stack Context .
(1).Value Stack Contents 里面的信息我們可以用 <s:property value="sss"> 這樣來直接訪問.
(2) Stack Context 里面的信息我們可以 <s:property value="#sss">這樣來訪問
<s:include>標簽
用來包含一個Servlet的輸出(Servlet或JSP頁面),使用value屬性指定包含頁名稱,可以使用<s:param>傳遞參數給子頁
<s:include value="/test.jsp"> <s:param name="username">clf</s:param> </s:include><s:push>標簽
用以加入一個值到值棧中
user為一個JavaBean對象,里面包含name和age屬性
<s:push value="user"> <s:property value="name" /> <s:property value="age" /> </s:push>
<s:set>標簽
賦予變量一個特定范圍內的值
name: 必填,重新生成的新變量的名字
scope: 可選,指定新變量被放置的范圍,該屬性可以接受application、session、request、page或action 5個值。如果沒有指定,默認是放置在Stack Context中。
value: 可選,指定將賦給變量的值。如果沒指定,則將ValueStack棧頂的值賦給新變量。
var: 可選,指定該元素的引用ID,如果指定了將會將該值放在ValueStack中
將Stack Context中的p值放入默認范圍內。
<s:set value="#p" name="xxx"/> <s:property value="#xxx.name"/>將Stack Context中的p值放入application范圍內
<s:set value="#p" name="xxx" scope="application"/> <s:property value="#attr.xxx.name"/>將Stack Context中的p值放入session范圍內
<s:set value="#p" name="xxx" scope="session"/> <!--使用JSP2.0表達式語言直接訪問session中的屬性--> ${sessionScope.xxx.name}<s:fielderror>標簽
顯示數據校驗錯誤信息
在action中使用
this.addFieldError("錯誤信息");
然后錯誤信息會在JSP頁面的
<s: fielderror/>說在的地方顯示出來
<s:actionerror>標簽
顯示Action中的錯誤信息
Action中的對應方法
this.addActionError("錯誤信息");
<s:actionmessage>標簽
顯示Action中的消息
Action中的對應方法
this.addActionMessage("消息");