property標籤html
屬性以下:java
例子:apache
<s:property value="username" default="遊客"/>
取出棧頂對象(一般是action)的username 屬性並輸出,若是沒有找到username屬性,那麼輸出「遊客」。數組
詳細例子:服務器
package com.struts; import java.util.ArrayList; import java.util.List; import java.util.Map; import com.entity.Users; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 控制器類 * 做用:處理客戶端的請求 * @author asus * */ public class PropertyAction extends ActionSupport { /** 成員變量:值棧中屬性 */ private Users user; /** 重寫execute方法 */ public String execute(){ /** 給成員變量賦值 */ user= new Users(); user.setName("admin"); user.setPassword("q12345"); /** 局部變量:非值棧中屬性 */ Users userTow=user; String amp="&"; String str="ABCD"; String num="1"; List<Users> list=new ArrayList<Users>();//集合中裝了兩個對象 list.add(user); list.add(userTow); /** 將局部變量存入request範圍裏 */ Map<String, Object> request=(Map<String, Object>) ActionContext.getContext().get("request"); request.put("userTow", userTow); request.put("amp", amp); request.put("str", str); request.put("num", num); request.put("list", list); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <body> <h1> 結果頁面 </h1> <!-- property標籤基本用法 --> <!-- 取值棧中的屬性(Action中的成員屬性) 須要生成Get,Set方法,不須要加範圍與井號 --> 結果1: <s:property value="user.name" default="若value屬性中沒有取到值則輸出此內容。" /> <br> <!-- 取非值棧中的屬性(除了Action中的成員屬性外) 須要加井號,與在獲取request/session/application/attr/parameters這五個範圍時,須要明確指定範圍 --> 結果2: <s:property value="#request.userTow.password" /> <br> <!-- escape:是否轉譯 true:表示將value內的內容強制轉換成字符串顯示 如&會被轉換爲& false:表示將value值當作html代碼去解析 會被被解析爲& --> 結果3: <s:property value="#request.amp" escape="true" /> hearts; <br> 結果4:<!-- 這裏結果爲桃心符號 --> <s:property value="#request.amp" escape="false" /> hearts; <br> <!-- property標籤靈活用法 --> <!-- value參數的類型是object,能夠理解爲這個默認是會解析成ognl表達式的 好比須要輸入一個字符串string,在value裏面的字符串string外面加了單引號,這樣不會將string解析成ognl表達式了 --> 結果5: <s:property value="'user'" /> <br> <!-- 故value的值解析成OGNL表達式,在此表達式內,有些對象的值的使用與java代碼類似,但不相同,如下取幾個例子 --> 結果6: <s:property value="#request.str.length()" /> <br> 結果7: <s:property value="#request.str.substring(1,3)" /> <br> <!-- value內還能夠寫表達式,好比輸出一個整型變量num的+1值 --> 結果8: <s:property value="#request.num+1" /> <br> <!-- value內爲List集合時,取其長度 --> 結果9: <s:property value="#request.list.size" /> <br> <!-- value內爲List集合時,取其內容 --> 結果10: <s:property value="#request.list.get(0).name" /> </body>
例子頁面輸出結果:session
set標籤app
屬性以下:jsp
例子:ide
<!-- 使用bean標籤訂義一個javaBean實例 --> <s:bean name="lee.Person" id="p"> <s:param name="name" value="zhangsan" /> <s:param name="age" value="29" /> </s:bean> 將p放入默認範圍內 <s:set value="#p" name="test" /> <s:property value="#test.name" /> <br> <s:property value="#test.age" /> <br> 將p放入application範圍內。 <s:set value="#p" name="test" scope="application" /> <s:property value="#attr.test.name" /> <br> <s:property value="#attr.test.age" /> <br> 將p放入session範圍內。 <s:set value="#p" name="test" scope="session" /> ${sessionScope.test.name} <br> ${sessionScope.test.age} <br>
詳細例子:post
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; /** * 控制器類 * 做用:處理客戶端的請求 * @author asus * */ public class SetAction extends ActionSupport { /** 成員變量:值棧中屬性 */ private Users user; /** 重寫execute方法 */ public String execute(){ /** 給成員變量賦值 */ user = new Users(); user.setName("admin"); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- set標籤 --> <h1> set標籤 </h1> <p> 將Action中成員屬性:user.name的值保存到默認範圍中,即Stack Context(application) </p> <s:set name="name" value="user.name" /> <!-- <s:property value="#application.name" />這種寫法取不到值 --> <s:property value="#name" /> <s:property value="#attr.name" /> <p> 當指定範圍類型application </p> <s:set name="nameTow" value="user.name" scope="application" /> <!-- <s:property value="#nameTow" />這種寫法取不到值 --> <s:property value="#attr.nameTow" /> <s:property value="#application.nameTow" /> <p> 小結:set標籤默認範圍是application。 當刻意去指定範圍爲application時,雖然範圍相同,但他們取值方式又有略微不一樣。 <br> 共通點:均可以使用attr <br> 區別: <br> 1)默認不指定範圍的方式,取值能夠不加範圍標誌,不能使用application範圍標誌打點取值。 <br> 2)指定application的方式,取值必需要加範圍標誌,但可使用application範圍標誌打點取值。 <br> </p> </body>
例子頁面輸出結果:
push標籤
<!-- 使用bean標籤建立一個JavaBean實例,並將其放入Stack Context中 --> <s:bean name="lee.Person" id="p"> <s:param name="name" value="'yeeku'" /> <s:param name="age" value="29" /> </s:bean> <s:push value="#p"> <s:property value="name" /> <s:propery value="age" /> </s:push>
詳細例子:
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 控制器類 * 做用:處理用戶的請求 * @author asus * */ public class PushAction extends ActionSupport { /** 成員變量:值棧中屬性 */ private Users user; /** 重寫execute方法 */ public String execute(){ user=new Users(); user.setName("執拗的雨"); user.setAge(15); user.setSex("女"); //存入session會話範圍 ActionContext.getContext().getSession().put("user", user); return SUCCESS; } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- push標籤 --> <h1>push標籤</h1> <h4> 普通方式訪問 </h4> 姓名: <s:property value="#session.user.name" /> 年齡: <s:property value="#session.user.age" /> 性別: <s:property value="#session.user.sex" /> <h4> 使用push標籤後簡化的訪問方式 </h4> <s:push value="#session.user"> 姓名:<s:property value="name" /> 年齡:<s:property value="age" /> 性別:<s:property value="sex" /> </s:push> </body>
例子頁面輸出結果:
例子:
<h2> 使用s:include標籤來包含目標頁面 </h2> <s:include value="include-file.jsp" /> <!--使用include標籤來包含其餘頁面,而且傳入參數--> <s:include value="include-file.jsp"> <s:param name="author" value="'yeeku'" /> </s:include> 被包含的頁面僅使用表達式語言輸出author參數,被包含頁面的代碼以下: <h3> 被包含的頁面 </h3> <!--表達式語言輸出author的請求參數--> ${param.author}
詳細例子:
<body> <!-- include標籤 --> <h4> 使用include標籤包含(引用)jsp1.jsp </h4> <s:include value="jsp1.jsp" /> <h4> 使用include標籤包含(引用)jsp2.jsp,使用嵌套的param標籤向jsp2.jsp傳遞參數 </h4> <s:include value="jsp2.jsp"> <s:param name="name" value="'姓拼名命'" /> <s:param name="sex" value="'男'" /> </s:include> </body>
<body> 歡迎訪問jsp1.jsp頁面! </body>
<body> 歡迎訪問jsp2.jsp頁面! <br> <!--表達式語言輸出author的請求參數,沒法使用s:property標籤取值,只能用EL表達式--> 姓名:${param.name } 性別:${param.sex } </body>
例子頁面輸出結果:
<constant name=「struts.custom.i18n.resources」 value=「ApplicationResources」/>
詳細例子:
struts.date.format=yyyy/MM/dd hh\:mm\:ss
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 設置默認資源包 --> <constant name="struts.custom.i18n.resources" value="ApplicationResources"/> </struts>
<%@ page language="java" pageEncoding="UTF-8"%> <!-- 引入Struts2標籤庫 --> <%@ taglib uri="/struts-tags" prefix="s" %> <!-- 引入Canlendar的包 --> <%@page import="java.util.Calendar"%> <body> <% //獲取當天指定點上的時間 Calendar calendar= Calendar.getInstance(); //經過calendar.set方法修改當前日期,將天數向後加10天 calendar.set(calendar.get(calendar.YEAR), calendar.get(calendar.MONTH), calendar.get(calendar.DATE) + 10); //存入application pageContext.setAttribute("futureDate",calendar.getTime()); %> <h1>date標籤</h1> <h3>指定format="yyyy年MM月dd日"</h3> <s:date name="#attr.futureDate" format="yyyy年MM月dd日" /> <h3>沒有使用format屬性,指定nice="true",能夠輸出「獲取到的日期值」和「如今的時間」之間的「時差」</h3> <!-- 將nice屬性設爲true,能夠輸出指定日期值和當前日期值之間的時差。 指定日期爲:獲取到的日期值。 當前日期爲:今天,如今的時間。 --> <s:date name="#attr.futureDate" nice="true" /> <h3>沒有使用format和nice屬性,將以資源包中struts.date.format鍵的值做爲格式化樣式</h3> <s:date name="#attr.futureDate" /> </body>
例子頁面輸出結果:
第二步:
<!-- 引入Ajax標籤 --> <%@ taglib uri="/struts-dojo-tags" prefix="sx"%> <head> <!-- 在JSP頁面中加入head標籤 負責在頁面上導入Dojo所須要的CSS庫和JavaScript庫 --> <sx:head /> </head> <body> <!-- datetimepicker日期控件 日期月份會有亂碼,具體解決網上百度吧~--> <sx:datetimepicker name="user.birthday" label="出生日期" value="%{'2008-9-20'}"/> </body>
結果頁面:
<s:if test=「表達式」> …….. </s:if> <s:elseif test=「表達式」> …….. </s:elseif> <s:else> ……….. </s:else>
例子:
<!-- 引入Struts2標籤庫 --> <%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- OGNL是一般要結合Struts 2的標誌一塊兒使用。struts2標籤裏不能使用EL表達式。 --> <h4> 例子1 </h4> <!-- 定義一個testname屬性 --> <s:set name="testname" value="%{'Java'}" /> <!-- 使用if標籤判斷--> <s:if test="%{#testname=='Java'}"> <div> <s:property value="%{# testname}" /> </div> </s:if> <s:elseif test="%{#testname=='Jav'}"> <div> <s:property value="%{# testname}" /> </div> </s:elseif> <s:else> <div> testname不是「Java」 </div> </s:else> </body>
<!-- 引入Struts2標籤庫 --> <%@ taglib uri="/struts-tags" prefix="s" %> <body> <!-- iterator迭代標籤 --> <h1>iterator迭代標籤</h1> <h4>迭代List,不使用status</h4> <s:iterator value="{'zhangsan' , 'lisi' , 'wangwu'}" > <s:property/><br> </s:iterator> <h4>迭代List,使用status</h4> <table border="1" > <tr> <th>當前元素</th> <th>當前迭代的元素的總數</th> <th>當前迭代的元素的索引</th> <th>判斷當前迭代的元素是不是偶數</th> <th>判斷當前迭代的元素是不是奇數</th> <th>判斷當前迭代的元素是不是第一個元素</th> <th>判斷當前迭代的元素是不是最後一個元素</th> </tr> <s:iterator value="{'zhangsan' , 'lisi' , 'wangwu'}" status="status" > <tr> <td><s:property/></td> <td><s:property value="#status.getCount()" /></td> <td><s:property value="#status.index" /></td><!-- 簡寫方式:index 不簡寫方式:getIndex() --> <td><s:property value="#status.isEven()" /></td> <td><s:property value="#status.odd" /></td><!-- 簡寫方式:odd 不簡寫方式:isOdd() --> <td><s:property value="#status.first" /></td> <td><s:property value="#status.last" /></td> </tr> </s:iterator> </table> <h4>迭代Map,不使用status屬性, \#{}是用來構造Map的寫法</h4> <s:iterator value="#{'first':'zhangsan', 'second':'lisi', 'third':'wangwu' }" > <s:property value="key" /> = <s:property value="value" /><br> </s:iterator> </body>
結果頁面:
package com.entity; import java.util.Date; /** * 用戶類 * @author asus * */ public class Users { /** 屬性 */ private String name; private String password; private int age; private String sex; private Date birthday; /** 構造方法 */ public Users() { super(); } public Users(String name, String password) { super(); this.name = name; this.password = password; } /** javaBean */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
<%@ taglib uri="/struts-tags" prefix="s" %> <body> <!-- Struts2 表單標籤 --> <!-- action=loginAction 爲token攔截器,重複提交,跳轉錯誤頁面 action=login2Action 爲tokenSession攔截器,重複提交時,留着當前頁面,且攔截本次提交 --> <s:form action="loginAction" method="post" theme="simple" > <!-- 加入token標籤 --> <s:token/> 用戶名:<s:textfield name="user.name" /> 密碼: <s:password name="user.password" /> <s:submit value="登陸按鈕" /> </s:form> </body>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="struts2" extends="struts-default"> <!-- token標籤 1-配置token攔截器,會實現若表單重複提交則跳轉錯誤頁面。 --> <action name="loginAction" class="com.struts.LoginAction" > <result>/s_token/success.jsp</result> <!-- 當判斷表單重複提交時,token攔截器則會返回invalid.token指向的視圖 --> <result name="invalid.token" >/s_token/error.jsp</result> <!-- 配置防止表單重複提交的局部攔截器 Struts2自帶的攔截器,固然也能夠配置成全局默認的,看需求。 注意:不要忘記了引入默認的攔截器棧 --> <interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> <!-- token標籤 2-配置tokenSession攔截器,會實現若表單重複提交時不會跳轉頁面(留在當前頁面)且攔截本次提交。 --> <action name="login2Action" class="com.struts.LoginAction" > <result>/s_token/success.jsp</result> <!-- 配置防止表單重複提交的局部攔截器 Struts2自帶的攔截器,固然也能夠配置成全局默認的,看需求。 注意:不要忘記了引入默認的攔截器棧--> <interceptor-ref name="tokenSession"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </action> </package> </struts>
package com.struts; import com.entity.Users; import com.opensymphony.xwork2.ActionSupport; /** * 控制器類 * 做用:處理用戶的請求 * @author asus * */ public class LoginAction extends ActionSupport { /** 成員變量:值棧中屬性 */ private Users user; /** 重寫execute方法 */ public String execute(){ System.out.println("請求Action進入execute()方法。。");//控制檯測試,是否屢次重複提交。 //驗證登陸 if(user!=null){ if(user.getName().equals("admin") && user.getPassword().equals("a123")){ return SUCCESS; } } return SUCCESS;//只爲掩飾效果,密碼錯誤也會走成功頁面 } /** JavaBean */ public Users getUser() { return user; } public void setUser(Users user) { this.user = user; } }
<body> 登錄成功進入此頁面! </body>
<body> 當表單重複提交時跳轉到此頁面! </body>
結果頁面: