Struts 2 標簽庫使用大全

n672 9年前發布 | 45K 次閱讀 Struts2 Web框架

<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("消息");

 本文由用戶 n672 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!