Struts中的標簽可分為2類: 通用|普通標簽 包括流程式控制制標簽、數據訪問標簽 UI標簽 包括表單標簽、非表單標簽 Struts2中的標簽均帶有首碼s。 常用的流程式控制制標簽 1、if-elseif-else標簽 條件判斷 test指定條件,滿足條件時,顯示標簽體的內容。 2、iterator標簽 ...
Struts中的標簽可分為2類:
- 通用|普通標簽 包括流程式控制制標簽、數據訪問標簽
- UI標簽 包括表單標簽、非表單標簽
Struts2中的標簽均帶有首碼s。
常用的流程式控制制標簽
1、if-elseif-else標簽 條件判斷
<s:set var="score" value="95" scope="request" /> <s:if test="#request.score>=80">優秀</s:if> <s:elseif test="#request.score>=60">及格</s:elseif> <s:else>不及格</s:else>
test指定條件,滿足條件時,顯示標簽體的內容。
2、iterator標簽 迭代Array、List、Map
<% List<User> list=new ArrayList<>(); list.add(new User("劉備", 28)); list.add(new User("關羽", 25)); list.add(new User("張飛", 18)); request.setAttribute("list",list); %> <table> <s:iterator var="user" value="#request.list"> <tr> <td><s:property value="#user.name" /></td> <td><s:property value="#user.age" /></td> </tr> </s:iterator> </table>
var指定臨時變數,代表一項,value指定Array | List | Map 。
在標簽體中可直接使用臨時變數。但不能這樣訪問:
<td>user.name</td> <td>#user.name</td> <td>%{#user.name}</td>
常用的數據訪問標簽
<s:debug /> <s:set var="group" value="vip" scope="session" /> <s:property value="#request.list" /> <s:include value="xxx.jsp" />
<s:debug>會在頁面上生成一個調試鏈接,可查看ValueStack中的數據。
<s:set>用於向某個域中存入數據,相當於setAttribute(),var指定參數的name,value指定參數的value。
<s:property>用於輸出ValueSatck中的數據,value指定要輸出的數據,只能使用OGNL表達式,不能使用常量,比如value="ok‘"是無效的。
<s:include>用於包含其他的JSP頁面。
常用的表單標簽
<s:form action="" method=""> <s:textfield name="user" value="" label="用戶名" /> <s:password name="pwd" value="" label="密碼" /> <s:textarea name="comment" rows="10" cols="40" label="評論" value="" /> <s:radio name="gender" list="#{'male':'男','female':'女'}" label="gender" /> <s:checkboxlist name="hobby" list="#{'basketball':'籃球','running':'跑步','swimming':'游泳'}" label="愛好" /> <s:checkbox name="hobby" value="basketball" label="籃球" /> <s:checkbox name="hobby" value="running" label="跑步" /> <s:checkbox name="hobby" value="swimming" label="游泳" /> <s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" /> <s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" headerKey="" headerValue="--請選擇--" /> <s:file name="" /> <s:hidden name="" value="" /> <s:submit value="提交" /> <s:reset value="重置" /> </s:form>
<s:textarea>的預設值是寫在value中的,這點與html的文本域不同。
list屬性可以寫成List,也可以寫成Map。寫成List時,value屬性值、選項文字都是List的元素;寫成Map時,value屬性值是Map的key,選項文字是Map的value。
可以用<s:checkboxlist>組合一組覆選框,以數組形式提交。
也可以逐個寫<s:checkbox>,各自提交。
<s:select name="" list="#{'zk':'專科','bk':'本科','ss':'碩士','bs':'博士','qt':'其它'}" label="學歷" headerKey="" headerValue="--請選擇--" />
header即下拉列表中顯示的選項(第一項),headerKey指定第一項的value,headerValue指定第一項的顯示文字。
Struts2只提供了常用的表單標簽,沒有提供日期選擇器、顏色選擇器等標簽。
命名空間
如果struts.xml中設置命名空間:
<package name="action" namespace="/action" extends="struts-default"> <action name="LoginAction" class="action.LoginAction"> <result name="success">/index.jsp</result> <result name="error">/login.jsp</result> </action> </package>
可以這樣寫action:
<s:form action="LoginAction" namespace="/action" >
</s:form>
不提倡這樣寫:
<s:form action="action/LoginAction"> </s:form>
第一次提交,地址欄是action/LoginAction;
如果填寫有問題,轉回此頁面重新填寫,點擊提交,地址欄變為action/action/LoginAction!
如果填寫還有問題,再次轉回此頁面重新填寫,點擊提交,地址欄變為action/action/action/LoginAction!
......
如果只提交一次,沒有問題;如果重覆提交多次,會有一點小問題。
只是地址欄變了,其實仍是action/LoginAction處理的。前一種更讓人放心。
可以給表單設置主題樣式:
<s:form action="" theme="xhtml"> </s:form>
主題預設為xhtml,每個表單元素都顯示為塊級,前後自動換行。
儘量用xhtml,其他自帶的主題不好控制效果。在xhtml主題的基礎上,可以使用cssClass、cssStyle,通過css樣式來改變界面。
其實Struts2標簽不常用,因為不好控制樣式,一般都是用html標簽。
表單元素常設置的屬性:
<s:textfield title="ok" readonly="true" disabled="true" required="true" cssClass="red" cssStyle="color: red;font-size: 18px;"
onclick=""
/>
title指定提示文字,滑鼠移上去時會顯示提示文字。
readonly、disabled、required的設置方式和html的不同。required為true,提交時會檢查是否已填寫此欄位,未填寫會提示。
cssClass指定要引用的類選擇器,可以引用Struts2內置的樣式,也可以引用自定義的CSS樣式。
cssStyle寫行內樣式。
可以使用事件屬性。
數據回顯
<action name="LoginAction" class="action.LoginAction">
<result name="success">/index.jsp</result>
<result name="error">/login.jsp</result>
</action>
提交的表單通不過檢查時,通常會轉發給表單頁面重新填寫。
html標簽會丟失所有的表單數據,需要重新填一遍。Struts2標簽仍保留表單數據,會自動填寫上次提交的表單。
數據回顯的原理:Action處理完業務,調用表單頁面,此時ValueStack還沒被銷毀,會自動調用getter方法取出ValueStack中的表單數據,填寫表單。
需要給表單欄位對應的屬性設置getter方法,否則不能回顯。
<s:password>密碼欄位預設不會回顯,如需回顯,需要設置showPassword屬性為true:
<s:password name="pwd" showPassword="true"/>
防止重覆提交表單
刷新頁面可能會重新提交表單,造成表單的重覆提交。Struts2可以防止表單的重覆提交。
在表單中增加<s:token />元素:
<s:form action="LoginAction">
<s:token />
<s:submit value="提交" />
</s:form>
在處理此表單的Action的配置中使用token攔截器:
<action name="LoginAction" class="action.LoginAction"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> <result name="success">/index.jsp</result> <result name="error">/login.jsp</result> </action>
在struts.xml中,如果此Action沒配置攔截器,預設會使用struts-default.xml中配置的預設攔截器棧。
預設攔截器棧是對請求進行常規的預處理操作,一般都需要。
如果我們在struts.xml中給此Action配置了攔截器,就不會再使用預設的攔截器棧,所以我們需要顯式引用預設的攔截器棧。
原理:
<s:token />本質是在表單中添加一個name="struts.token"的隱藏域,設置一個唯一標識此次表單提交的value,
token攔截器取出這個隱藏域的參數,和session中的struts.token比較,value相同就是重覆提交,直接pass調本次請求,不再調用action來處理;
value值不同,說明不是重覆提交,會將這個srtuts.token值放到session中,覆蓋原有的值,並調用action來處理請求。
如果使用了token攔截器,但一次都沒有使用<s:token />標簽,提交表單後,token攔截器獲取的value為null,session中的value也是null,相同,便不會調用action來處理,相當於提交不了表單。
沒有使用<s:token />標簽,就不要使用token攔截器。