Struts2 前端與后台之間傳值問題


老是被前端與后台之間的傳值給弄糊塗了,特此寫一篇blog進行總結。

一. 前端向后台傳值

(1)屬性驅動

屬性驅動是指在Action類里,包含表單里對應的字段(字段名稱一樣),同時設置對應的getter和setter。

表單代碼:html

   1: <form action="login" method="post">
   2:   <label>username:</label>
   3:   <input type="text" name="username">
   4:   <label>password:</label>
   5:   <input type="text" name="username">
   6: </form>

對應的Action:LoginAction

java代碼:

   1: public LoginAction extends ActionSupport{
   2:     private String username; //對應表單中input屬性name=username
   3:     private String password; //對應表單中input屬性name=password
   4:  
   5:     /*--  getter and setter --*/
   6:     public void setUsername(String username){
   7:         this.username = username;
   8:     }
   9:     public String getUsername(){
  10:         return this.username;
  11:     }
  12:     public void setPassword(String password){
  13:         this.password = password;
  14:     }
  15:     public String getPassword(){
  16:         return this.password;
  17:     }
  18:     public String execute(){
  19:         return SUCCESS;
  20:     }
  21: }

在struts.xml中配置Action

   1: <action name="login" class="com.bigdata.action.LoginAction">
   2:     <result name="success">success.jsp</result>
   3: </action>

在success.jsp頁面中使用{username}來訪問username屬性。

屬性驅動適合於表單域傳值較少的情況,如果表單域過多的話,Java代碼將會充斥着大量的getter和setter代碼。

(2)對象驅動

對象驅動是指在Action里包含一個對象,而這個對象的屬性與表單域一一對應。

對應的Action:LoginAction

   1: public LoginAction extends ActionSupport{
   2:     private User user;
   3:  
   4:     /*--  getter and setter --*/
   5:     public void setUser(User user){
   6:         this.user = user;
   7:     }
   8:     public User getUser(){
   9:         return this.user;
  10:     }
  11:     public String execute(){
  12:         return SUCCESS;
  13:     }
  14: }

對應的user類:

   1: public Class User{
   2:     private String username;
   3:     private String password;
   4:  
   5:     public String getPassword() {
   6:         return password;
   7:     }
   8:     public void setPassword(String password) {
   9:         this.password = password;
  10:     }
  11:  
  12:     public String getUsername(){
  13:         return username;
  14:     }
  15:     public void setUsername(String username){
  16:         this.username = username;
  17:     }
  18: }

前台html頁面代碼

   1: <form action="login" method="post">
   2:   <label>username:</label>
   3:   <input type="text" name="user.username">
   4:   <label>password:</label>
   5:   <input type="text" name="user.password">
   6: </form>

表單域的name由對象名和屬性名組成,中間用.連接,Action對象被創建后,通過setter進行賦值。Action result頁面則通過${user.username}來訪問。

二. 后台向前端傳值

(1)使用Struts2的標簽

對應Action:

   1: public Class CollectAction extends ActionSupport{
   2:     private String [] arryStr;  
   3:     //遍歷list  
   4:     private List<User> list;  
   5:     private Map<String,String> map;  
   6:     private Map<Integer,User> userMap;    
   7:     private Map<String,List<User>> userListMap; 
   8:  
   9:     public void setArryStr(String[] arryStr){
  10:         this.arryStr = arryStr;
  11:     }
  12:     public String[] getArryStr(){
  13:         return arryStr;
  14:     }
  15:  
  16:     //省略其他的getter與setter
  17:     public String execute(){
  18:  
  19:         arryStr[] = new String[]{"wbl","sdfsdf","gfg"};
  20:  
  21:         list.add(new User("wbl","123"));
  22:         list.add(new User("avd","ggg"));
  23:         list.add(new User("eee","iii"));
  24:  
  25:         map.put("key1","value1");
  26:         map.put("key2","value2");
  27:         map.put("key3","value3");
  28:  
  29:         userMap.put(1,new User("wbl","123"));
  30:         userMap.put(2,new User("avd","ggg"));
  31:  
  32:         userListMap.put("user",list);
  33:     }
  34: }

Action對應的JSP頁面:

   1: <div id="arryStr">
   2:     <!-- iterator遍歷String 字符數組 -->
   3:     <s:iterator value="arryStr" id="arryValue">
   4:         <span><s:property value="arryValue" /></span>
   5:     </s:iterator>
   6:   </div>
   7:  
   8:   <div id="list">
   9:     <!-- iterator遍歷List集合 -->
  10:     <table>
  11:       <s:iterator value="list" id="user">
  12:         <tr>
  13:           <td><s:property value="username" /></td>
  14:           <td><s:property value="password" /></td>
  15:         </tr>
  16:       </s:iterator>
  17:     </table>
  18:   </div>
  19:  
  20:   <div id="map">
  21:     <!-- iterator遍歷Map中的String字符串 -->
  22:     <s:iterator value="map" id="column">
  23:       <tr>
  24:         <td>Key:<s:property value="key" /></td>
  25:         <td>Value:<s:property value="value" /></td>
  26:       </tr>
  27:     </s:iterator>
  28:   </div>
  29:  
  30:   <div id="userMap">
  31:     <!-- iterator遍歷Map中的User 對象(Object) -->
  32:     <s:iterator value="userMap" id="column">  
  33:         <tr>  
  34:             <td><s:property value="value.username"/></td>  
  35:             <td><s:property value="value.password"/></td>  
  36:         </tr>  
  37:       </s:iterator> 
  38:   </div>
  39:   
  40:   <div id="userlistMap">
  41:     <!-- iterator遍歷Map中的List集合 -->
  42:     <s:iterator value="userListMap" id="column">  
  43:       <s:set var="total" name="total" value="#column.value.size"/>  
  44:         <s:iterator value="#column.value" id="col" status="st">  
  45:           <tr>  
  46:               <td><s:property value="username"/></td>  
  47:               <td><s:property value="password"/></td>  
  48:           </tr>  
  49:       </s:iterator>  
  50:     </s:iterator>  
  51:   </div>

(2)AJAX

ajax方式可以實現異步更新數據,這里我采用json格式傳輸數據。

首先,建立一個action:

   1: public class ajaxAction extends ActionSupport{
   2:     private JSONObject dataObj; //向前台傳遞的JSON數據
   3:  
   4:     public JSONObject getDataObj() {
   5:         return dataObj;
   6:     }
   7:  
   8:     public void setDataObj(JSONObject dataObj) {
   9:         this.dataObj = dataObj;
  10:     }
  11:  
  12:     public String execute(){
  13:         dataObj = new JSONObject();
  14:         dataObj.put("key","value");
  15:         dataObj.put("result","SUCCESS");
  16:         return SUCCESS;
  17:     }
  18: }

struts.xml中action的配置

   1: <action name="ajax"  class="com.bigdata.action.ajaxAction">
   2:     <result type="json">
   3:          <param name="root">dataObj</param>
   4:          <param name="callbackParameter">jsoncallback</param>
   5:     </result>
   6: </action>

如果為某個action指定了一個類型為json的Result,則該Result無須映射到任何視圖資源,因為json插件會負責將Action里的狀態信息序列化成JSON格式的字符串,並將該字符串返回給客戶端瀏覽器。

json類型的Result允許指定的參數

root:設置該參數將不再把整個Action對象序列化成JSON字符串,而只是將該參數所指定的Action的屬性序列化成JSON字符串返給客戶端,本例中將會把dataObj進行序列化。

callbackParameter: 配置該參數之后,才能進行JSON的跨域傳輸。

前端利用jQuery完成AJAX交互

   1: <div id="ajaxTest">
   2:       <input type="button" value="test" id="show">
   3:   </div>
   4: </body>
   5: <script type="text/javascript" src="js/jquery.js"></script>
   1:  
   2: <script>
   3:   $(function(){
   4:       $("show").click(function(){
   5:           $.getJSON(
   6:             /*訪問Action的URL地址*/
   7:             "http://localhost:8080/bigData/ajax?jsoncallback=?",
   8:             /*得到服務器響應之后的操作*/
   9:             function(respose){
  10:                 if(respose.result == "SUCCESS")
  11:                     $("#ajaxTest").append("<span>SUCCESS</span>");
  12:             })
  13:       })
  14:   })
</script>
   6: </html>

function中的參數response對應Action中的dataObj,此時就可以獲得由后端傳入的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM