Struts標籤庫
Struts標籤庫
- 如果想要在jsp頁面使用struts2的標籤,需要引入標籤庫
<%@ taglib uri="/struts-tags" prefix="s"%>
數據標籤
- 作用: 用於數據的存儲和處理
action
- action標籤是用來在JSP頁面中調用Action某個Action類的,該標籤有如下的幾個屬性;
- Id該屬性用來指定Action的引用id
- name該屬性是用來指定Action類的映射地址
- namespace該屬性用來指定Action類所在namespace
- executeResult該屬性用來指定是否將Action類的處理結果也跳轉的那個視圖內容包含到本頁面中,默認值為false,不包含
- ignoreContextParams
該屬性用來指定是夠將請求的參數傳入到Action中,默認為false,即是傳入
<h1>調用第一個action</h1><!-- 調用登錄的Action類,name指定<action>標籤的name屬性值,executeResult為true指示包含Action響應的內容 namespace指定Action類所在包指定的namespace--><s:action name="login" executeResult="true" namespace="/"></s:action><hr><h1>調用第二個action</h1><!-- 調用第二個Action,表示註冊頁面,ignoreContextParams為true表示不傳入參數,那麼其中的password和username就不能接收參數了,因此輸出為NULL --><s:action name="regist" executeResult="true" namespace="/" ignoreContextParams="true"></s:action>
bean
- bean標籤用來創建一個JavaBean實例,和action標籤差不多,就是在jsp頁面中調用JavaBean對象,創建一個對象,不過這個對象是存在Stack Context中的,不是值棧中的。
- id用來表示創建的JavaBean類的實例,這個是用來在Stack Context中查看狀態的,使用標籤
- name用來指定JavaBean,指定JavaBean類所在的路徑
- var這個是id一樣的功能,其實可以代替id
<s:bean name="com.user.User" id="myBean" > <!-- 使用param標籤為其賦值 --> <s:param name="username" value="陳加兵"></s:param> <s:param name="age" value="22"></s:param> 姓名: <s:property value="username"/><br> 年齡:<s:property value="age"/></s:bean>
date
- date標籤用于格式化一個日期,除了格式化輸出當前的日期,也可以計算指定的日期和當前日期時刻之間的時差
- format可選屬性,用於指定格式化的格式,如yyyy/MM/dd-HH:mm:ss
- name必填的值,該屬性指定格式化日期的值,比如Date對象
- nice可選屬性,如果為true那麼將會輸出指定日期和當前日期的時差,默認為false
- timezone可選屬性,指定格式化所用的時區
- var可選屬性,如果指定了該屬性,該時間對象將放入值棧中,可以使用id代替,但是推薦使用var
- 如果同時指定了nice=true,和format那麼format將會失效
<!-- 創建一個日期對象now,表示當前的時間 --> <s:set var="now" value="new java.util.Date()"></s:set> <!-- 格式化當前的日期--> <s:date name="#now" format="dd/MM/yyyy HH:mm:ss"/><br>
debug
- 該標籤是輔助標籤,用來生成一個超鏈接,便於查看值棧,和Stack Context中的信息。
i18n
- 主要用於在視圖上載入國際資源,使用該標籤時需要指定一個name屬性,該name屬性為需要載入的國際化資源文件的basename
include
- 將指定的jsp文件或者Servlet文件包含在當前的jsp頁面,這個相當於標籤。
- value指定被包含的jsp或者Servlet文件路徑
<s:include value="success.jsp"></s:include>
param
- param標籤主要是為其他的標籤提供參數的
- 注意value的值是使用的OGNL表達式,一定要注意,如果指定字元串要加單引號或者雙引號
- name
指定要賦值的變數名
- value指定變數的值
<s:bean name="com.user.User" id="myBean" > <!-- 使用param標籤為其賦值 --> <s:param name="username" value="陳加兵"></s:param> <s:param name="age" value="22"></s:param></s:bean>
push
- push標籤用於將某個值放到ValueStack(值棧)中,從而更簡單的訪問該值,其實不將其防放置在值棧中也是可以訪問,使用#即可。只有一個屬性value就是需要放在棧頂的值
<s:bean name="com.user.User" id="myBean"> <s:param name="username" value="陳加兵"></s:param> <s:param name="age" value="22"></s:param></s:bean><%-- 只有在push標籤內是,被放到值棧中的對象才存在,一旦出了push標籤那麼就不存在了 --%> <s:push value="#myBean"> <s:property value="username"/> <s:property value="age"/> <!-- 這個可以看出值棧中有值 --> <s:debug></s:debug> </s:push> <!-- 這個沒有myBean對象 --> <s:debug></s:debug>
set
- set標籤是用來將某一個值放入指定的範圍,當然也是相當於創建一個新的變數
- id該屬性用來指定該元素的引用ID(廢棄)
- var該屬性用來指定創建的新變數的名稱
- value用來指定變數的值,這個是使用的OGNL表達式
- scope該屬性用來指定新變數的放置範圍,可選值有page,request,session,application和action,如果沒有指定該屬性,則默認放在Stack Context中
<s:set var="x" value="陳加兵"></s:set><s:property value="#x"/>
- 獲取指定範圍的值,其實相當於在指定的範圍內綁定屬性值,可以實現數據共享:
<s:set var="x" value="陳加兵" scope="session"></s:set><s:property value="#session.x"/>
- 其實set的真正的作用是變數放置在指定的範圍內,如果一個屬性的訪問的太繁瑣了,比如訪問user.name,但是這個值需要頻繁的使用,這時就創建一變數存放這個值,並且設定範圍:
<s:set var="x" value="user.name"></s:set><s:property value="#x"/>
url
- url標籤用於在頁面生成一個url地址,該標籤的屬性如下:
- id指定該元素的引用id,如果指定了該屬性,那麼在Stack Context中就會有這個id,那麼就可以使用#來獲取它的值
- value該屬性用來指定生成URL地址,如果不指定該屬性,那麼action屬性指定的Action作為URL地址
- action該屬性用來指定生成URL地址值的action,如果不指定該屬性,那麼使用value屬性值作為URL地址值
- method該屬性用來指定使用action的方法
- encode
該屬性用來指定是否需要encode請求參數,默認值為true
- includeParams該屬性用來指定是否包含請求參數,可選值為:none,get,和all默認的為none
- includeContext該屬性指定是否需要當前上下文包含在url地址中
- anchor該屬性指定URL的錨點
- Scheme該屬性用來指定URL使用的協議(HTTP或者HTTPS)
- namespace該屬性用來指定命名空間,使用action的時候指定
<s:url value="success.jsp" includeParams="get" id="myUrl"> <s:param name="username" value="陳加兵"></s:param></s:url><hr><s:url action="login"></s:url><hr><s:url action="login" namespace="/user" includeParams="get"> <s:param name="username" value="陳加兵"></s:param></s:url><hr><!-- 獲取值 --><s:property value="#myUrl"/>
property
- property標籤是用來在頁面中輸出指定值,該標籤有如下屬性:
- id指定該元素的標識(廢棄)
- value指定需要輸出的特定的值,注意這裡使用的OGNL表達式,如果沒有指定value屬性,那麼將會輸出值棧中的棧頂的值
- escape指定是否轉義輸出內容中HTML,其默認值為true
- default指定一個默認的輸出值,如果value中的值為空,那麼就會默認輸出這個值
<!-- 轉義標籤h1,輸出內容 --><s:property value="<h1>陳加兵</h1>" escape="false"/><!-- 輸出Stack Context中的內容,並且指定了默認值 --><s:property value="#username" default="輸出一個默認值"/><!-- 輸出棧頂的值 --><s:property/>
總結
- 數據標籤最重要的就是
set
,property
,debug
,i18n
這些標籤,其他的了解寫即可
控制標籤
- 控制標籤主要用於條件和循環等流程式控制制
if/elseif/else
- 其中elseif允許出現多次
<s:set var="age" value="22"></s:set> <s:if test="#age>10"> <s:property value="#age+大於10" /> </s:if> <s:elseif test="#age>20"> <s:property value="#age+大於20" /> </s:elseif> <s:else> <s:property value="#age+在10與20之間" /> </s:else>
- 並且和或的關係(&&,||)
<%-- 新建一個集合list --%> <s:set var="list" value="{陳加兵,鄭元梅,22,33}"></s:set> <%-- 指定begin,end獲取前3個元素--%> <s:iterator value="#list" var="item" status="iter"> <s:if test="#iter.isOdd()&&#iter.getIndex()>0"> <s:property value="#item+---+#iter.getIndex()"/> <br> </s:if> </s:iterator>
iterator
- iterator標籤主要用於對集合進行迭代,這裡的集合包含list,Set和數組,也可以對Map集合進行迭代輸出。
- value
可選屬性,該屬性指定迭代的集合,如果沒有指定value屬性,那麼就會迭代ValuStack棧頂的集合。
- var可選屬性,該屬性指定的是迭代的集合中的每一個元素,放在Stack Context中·
- status可選屬性,該屬性指定迭代對象的IteratorStatus實例存放在Stack Context中,通過這個屬性可以判斷當前迭代元素的屬性。例如是否為最後一個,以及當前元素的索引
- begin可選屬性,指定從迭代對象第幾個元素開始迭代
- end可選屬性,指定迭代到對象的第幾個元素結束
- step可選屬性,指定步長
- 如果迭代元素指定了status,那麼就可以調用如下的屬性查看迭代元素的當前的屬性,可以調用如下的幾個方法查看:
- int getCount() 返回當前迭代了幾個元素
- int getIndex() 返回當前迭代元素的索引
- boolean isEven() 當前迭代元素的索引是否為偶數
- boolean isFirst() 當前迭代元素是否為第一個元素
- boolean isLast() 當前迭代元素是否為最後一個元素
- boolean isOdd() 判斷當前的迭代元素的索引是否為奇數
- 此標籤每次進行迭代的時候就會把元素放在值棧的頂部,那麼我們都知道如果不指定value屬性,那麼默認的就是從棧頂取元素:
<%-- 新建一個集合list --%> <s:set var="list" value="{陳加兵,鄭元梅,22,33}"></s:set> <%--指定了value屬性,但是其他屬性都沒有,那麼直接可以從棧頂取數據 --%> <s:iterator value="#"> <s:property/> </s:iterator>
- 指定var屬性來獲取迭代對象的值:
<%-- 新建一個集合list --%>
<s:set var="list" value="{陳加兵,鄭元梅,22,33}"></s:set><%-- 指定var表示當前迭代對象的每一個元素--%> <s:iterator value="#list" var="item"><%-- 因為var元素是放在Stack Context中,因此可以使用#取值 --%>
<s:property value="#item" /> </s:iterator>- 指定begin,end來獲取指定範圍的值。
<%-- 新建一個集合list --%> <s:set var="list" value="{陳加兵,鄭元梅,22,33}"></s:set> <%-- 指定begin,end獲取前3個元素--%> <s:iterator value="#list" var="item" begin="0" end="2"> <%-- 因為var元素是放在Stack Context中,因此可以使用#取值 --%> <s:property value="#item" /> </s:iterator>
- 指定status獲取每一個迭代元素的當前狀態:
<%-- 新建一個集合list --%> <s:set var="list" value="{陳加兵,鄭元梅,22,33}"></s:set> <%-- 指定begin,end獲取前3個元素--%> <s:iterator value="#list" var="item" status="iter"> <s:if test="#iter.isOdd()&&#iter.getIndex()>0"> <s:property value="#item+---+#iter.getIndex()"/> <br> </s:if> </s:iterator>
- 迭代Map
<s:set var="map" value="#{age:22,username:陳加兵 }"></s:set> <s:iterator value="#map" var="item"> 獲取集合中的key:<s:property value="#item.key"/> 獲取集合中的值:<s:property value="#item.value"/> </s:iterator>
append
- append標籤用於將多個集合拼接起來形成一個新的集合。
- var拼接之後形成的新的集合,放在Stack Context中
- id這個和var是一樣的,兩個可以互換使用的,不過推薦使用var
<%-- 新建一個集合list --%> <s:set var="list1" value="{陳加兵,鄭元梅,22,33}"></s:set> <s:set var="list2" value="{44,55,6,99}"></s:set> <s:append var="list3"> <%-- 使用param標籤指定要拼接的集合 --%> <s:param value="#list1"></s:param> <s:param value="#list2"></s:param> </s:append> <s:iterator value="#list3" var="item"> <s:property value="#item"/> </s:iterator>
generator
- 使用這個標籤可以將字元串按照指定的分隔符分割成多個子串,臨時生成的子串可以使用標籤迭代輸出。可以這樣理解:這個標籤使用指定的的分隔符將字元串分割,然後這些字元串組成一個集合。
- val必選屬性,該屬性指定被解析的字元串
- var可選屬性,如果指定了該屬性,那麼生成的Iterator對象將會以這個名稱放在Stack Context中,就可以訪問這個集合了。
- count可選屬性,該屬性指定生成集合中元素的個數
- separator必選屬性,這個屬性指定分隔符
- converter
可選屬性,該屬性指定一個轉換器,該轉換器負責將集合中的每一個字元串轉換成對象,通過該轉換器可以將一個字元串解析成對象集合。該屬性值必須是org.apache.struts2.util.IteratorGenerator.Convertere
<%--分隔符為,,並且選取其中的前兩個元素 --%> <s:generator separator="," val="陳加兵,鄭元梅,chenjiabing" var="x" count="2"></s:generator> <s:iterator value="#x" var="item"> <s:property value="#item" /> </s:iterator>
merge
- merge這個標籤和append的功能是一樣的,都是將兩個集合拼接在一起,但是append是將一個集合拼接在另外一個集合的末尾,但是merge是將後面一個集合的對應索引的元素添加到前面一個集合的索引所在的位置,也就是後面集合的第一個元素變成了新集合的第二個元素了。
<s:set var="list1" value="{陳加兵,鄭元梅}"></s:set> <s:set var="list2" value="{1,2}"></s:set> <s:merge var="list3"> <s:param value="#list1"></s:param> <s:param value="#list2"></s:param> </s:merge> <s:iterator var="item" value="#list3"> <s:property value="#item"/> </s:iterator>
subset
- subset標籤用於取得集合的子集,形成新的集合。
- count可選屬性,指定選取集合的子集的個數,如果不指定該屬性,那麼默認的就是截取全部的元素
- source可選屬性,該屬性指定源集合,如果沒有指定,那麼默認是從棧頂取集合
- start可選屬性,該屬性指定子集從源集合的第幾個元素開始截取,默認從第一個開始(即start=0)
- decider可選屬性,該屬性有開發真決定是否選中該元素
- var可選屬性,如果指定了該屬性,那麼生成Iterator對象設置成為Page範圍內的屬性,可以使用#attr.name獲取其值,也可以替換成id,但是推薦使用var
<!-- 創建一個集合 --> <s:set var="list1" value="{陳加兵,鄭元梅,1,2,3}"></s:set> <!-- 指定變數為x,存儲在page中,源集合為list1,截取其中的兩個元素,從第二個元素開始截取 --> <s:subset var="x" source="#list1" count="2" start="1"></s:subset> <!-- 由於x存儲在Page中,因此使用#attr.x來獲取 --> <s:iterator value="#attr.x" var="item"> <s:property value="#item" /> </s:iterator>
sort
- 主要用於對集合進行排序
- comparator必填屬性,該屬性指定進行排序的實例,必須實現java.util.Comparator介面
- source可選屬性,這是一個源集合,如果沒有指定,那麼就拿棧頂的集合進行排序
- var
可選屬性,如果指定了屬性,那麼生成的Iterator對象設置成Page範圍的屬性,該屬性也可替換成id
<s:set var="list" value="{陳加兵,123459999+,4442555}"></s:set> <!-- 創建一個實例 --> <s:bean name="com.compare.Compare" id="compare"></s:bean> <!-- 排序 --> <s:sort comparator="#compare" source="#list" var="x"></s:sort> <!-- 迭代輸出 --> <s:iterator var="item" value="#attr.x"> <s:property value="#item" /> </s:iterator>
推薦閱讀:
※Struts 2 中 <s:form> 標籤和 HTML 的 <form> 標籤有什麼區別?
※Struts2之類型轉換器
※<s:iterator>標籤遍歷動態數組<泛型>:ArrayList<對象>,怎樣批量修改數據並一起提交到後台
TAG:Struts |