Struts2中的傳值實現html
1.action接收jsp傳過來的值:
a.定義一個User類 有name pwd屬性, 添加相應的get,set方法
b.<!-- 方式1 普通java類 -->
在UserAction中
添加: private User user; 並添加相應的get,set方法java
<!-- 方式2 實現ModelDriven<T>接口-->
數組
在UserAction中 @Override public User getModel() { return user; }
<!--方式3 在UserAction中 直接寫屬性>
session
private String name; private String pwd; public String methodxxx() { User user=new User(); ...xxx; }
注意:表單裏面name定義的方式,根據name更改Action中方法的判斷方式
c.jsp界面中添加form表單
(方式1)
jsp中input 屬性中name="user.name"這麼寫框架就會自動new user();因此Action不能用user是否爲空判斷
app
<form action="User_register" method="post"> <label style="color:red;">${errorMsg }</label><br/> 註冊用戶名<input type="text" name="user.name"/><br/> 註冊密碼<input type="password" name="user.pwd"/><br/> <input type="submit" value="註冊"/> </form>
(方式2)
name="name"這麼寫若是沒有值""則不會自動new User();可用user是否爲空判斷
框架
<form action="User_register" method="post"> <label style="color:red;">${errorMsg }</label><br/> 註冊用戶名<input type="text" name="name"/><br/> 註冊密碼<input type="password" name="pwd"/><br/> <input type="submit" value="註冊"/> </form>
表單提交以後到UserAction的register中直接用user就能夠了。
框架直接將數據存如user中了 已經jsp
若是action中class未定義 則調用框架裏面默認的actionide
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
---------------------------------以上內容在g:codespace/Struts2代碼區間中 Test中--------------------------post
2.action傳值:
3種方式都是在action處理
(1)解耦合:間接使用
this
public String execute(){ //得到Action的上下文 ActionContext ac=ActionContext.getContext(); //①獲取傳值對象 Map<String,Object> request=(Map<String, Object>) ac.get("request"); Map<String,Object> session=ac.getSession(); Map<String,Object> application=ac.getApplication(); //②存儲值 request.put("reqValue","這是經過request解耦合方式設置的值"); session.put("sessionValue","這是經過session解耦合方式設置的值"); application.put("applicationValue","這是經過application解耦合方式設置的值"); return "success"; }
(2)實現RequestAware,SessionAware,ApplicationAware
public class TestAction02 implements RequestAware,SessionAware,ApplicationAware{ private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; public String execute(){ //2.存儲值 request.put("reqValue","這是經過request解耦合RequestAware方式設置的值"); session.put("sessionValue","這是經過session解耦合SessionAware方式設置的值"); application.put("applicationValue","這是經過application解耦合ApplicationAware方式設置的值"); return "success"; } @Override public void setApplication(Map<String, Object> application) { this.application=application; } @Override public void setSession(Map<String, Object> session) { this.session=session; } @Override public void setRequest(Map<String, Object> request) { this.request=request; } }
(3)直接使用 耦合方式
public String execute(){ //耦合:直接使用 HttpServletRequest request=ServletActionContext.getRequest(); HttpSession session=request.getSession(); ServletContext application=ServletActionContext.getServletContext(); //2.存儲值 request.setAttribute("reqValue","這是經過request耦合方式設置的值"); session.setAttribute("sessionValue","這是經過session耦合方式設置的值"); application.setAttribute("applicationValue","這是經過application耦合方式設置的值"); return "success"; }
------以上三種傳值的同一實現的jsp
jsp的取值界面 <h1> request的值:${requestScope.reqValue }<br/> request的值:s標籤---<s:property value="#request.reqValue"/><br/> session的值:${sessionScope.sessionValue }<br/> session的值:s標籤---<s:property value="#session.sessionValue"/><br/> ... </h1>
以上三種存值方式都是將值存放在Stack Context中
(4)值棧的使用
ValueStack 由 OGNL框架實現,能夠把它簡單的看做一個棧(List)
Stack Context(保存方式是map類型):stack的上下文,它包含一系列對象,包括
request,session,attr,application,map 等ValueStack中保存的值能夠直接取,而stack中的須要在前面加#(request,session,application)
for example ①:(s:debug中有顯示):
public String execute(){ ActionContext ac=ActionContext.getContext(); //vs將值推入Value Stack Contents 由ognl框架實現 ValueStack vs=ac.getValueStack(); user.setName("張三"); user.setPwd("abc"); vs.push(user); User u1=new User(); u1.setName("李四"); u1.setPwd("2345"); vs.push(u1); //這裏將值傳入Stack Context(保存方式是map類型)stack的上下文,它包含一系列對象 Map<String,Object> request=(Map<String,Object>)ac.get("request"); //2.存儲值 request.put("reqValue","這是經過request耦合方式設置的值"); request.put("user", user); return "success"; }
jsp的取值界面
request中取值:<s:property value="#request.user.name"/><br/>
<s:property value="name"/><br/><!-- 默認從棧頂開始找數據 --> <s:property value="[0].name"/><br/><!-- [0]值棧位置 --> <s:property value="[1].name"/><br/> <s:property value="[1].toString()"/><br/> <!--User類型中重寫toString方法-->
for example ②:(s:debug中無顯示)
public String execute() { ActionContext ac = ActionContext.getContext(); ValueStack vs = ac.getValueStack(); List<String> ls = new ArrayList<String>(); ls.add("s1"); ls.add("s2"); ls.add("s3"); vs.push(ls); return "success"; }
jsp的取值界面
<s:iterator value="[0]"> <s:property/> </s:iterator>
3. s標籤調用方法
<!--s:set設定值var 定義名字,value定義值 --> <s:set var="n" value="200"/> <!--s:property 調用值 詳解請看 http://blog.csdn.net/lfp0202/article/details/6188484 --> <s:property value="#n"/>
注意:s:property標籤能夠調用類的方法
<s:property value="[1].toString()"/><br/> <!--調用user類中的toString()方法--> <!-- 這個是調用靜態方法的寫法 --> <!-- 調用靜態方法要開啓:<constant name="struts.ognl.allowStaticMethodAccess" value="true"/> --> <s:property value="@java.lang.Math@PI"/><br/> <!-- 調用jdk自帶的靜態方法,就能夠省略類名 --> <s:property value="@@PI"/><br/> <s:property value="@com.yc.bean.User@add(3,6)" default="沒有調到"/> <!-- 普通值的存取 --> <s:set var="n" value="200"/> <s:property value="#n"/><br/> <!-- 數組或者list對象的存取 --> <s:set var="list" value="{'lll','sss','ddd'}"/><br/> <s:iterator value="list"> <s:property/> </s:iterator><br/> <!-- map對象的存取 --> <s:set var="maps" value="#{'aaa':'AAA','bbb','BBB','ccc','CCC' }"/> <s:property/><br/> <s:iterator value="#maps"> <s:property value="key"/>------<s:property value="value"/> </s:iterator> <!--map<String,Object>這種樣子的對象--> <s:iterator value="profileMap" id="entry"> <s:iterator value="#entry.value"> <tr> <td><s:property value="id" /></td> <td><s:property value="name" /></td> <td><s:property value="birthday" /></td> <td><s:property value="gender" /></td> <td><s:property value="career" /></td> <td><s:property value="address" /></td> <td><s:property value="mobile" /></td> </tr> </s:iterator> </s:iterator>