Struts2學習筆記(2)值傳遞

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>
相關文章
相關標籤/搜索