1. 程式人生 > >struts 表單資料只能獲得一個引數,其他是null

struts 表單資料只能獲得一個引數,其他是null

  最近我偶然發現一個問題,這個問題出現在使用struts2的時候,也屬於粗心吧,所以記錄下來。

  不知道大家有沒有遇到過這樣的事情:在控制器裡有一個物件,它的各個屬性是有公開的get和set方法的,我們在頁面用 物件名.屬性名 向控制器提交的時候,理論上struts2應該把這些雜湊的值為我們組合成物件,但卻沒有,要麼物件只有一個值被設定,要麼直接連物件都是空的。

  我建立好了一個struts2支援的Java EE專案:

  

  下面是測試程式碼:

  Employee.java

複製程式碼
 1 package org.johness.blogcase.struts2.pojo;
 2 
 3
/** 4 * 5 * 實體類 6 * 7 * @author Johness 8 * 9 */ 10 public class Employee { 11 private String cname; 12 private String ename; 13 public String getCname() { 14 return cname; 15 } 16 public void setCname(String cname) { 17 this.cname = cname; 18 } 19
public String getEname() { 20 return ename; 21 } 22 public void setEname(String ename) { 23 this.ename = ename; 24 } 25 }
複製程式碼

  ParamAction.java

複製程式碼
 1 package org.johness.blogcase.struts2.web.action;
 2 
 3 import java.util.Map;
 4 
 5 import org.johness.blogcase.struts2.pojo.Employee;
6 7 import com.opensymphony.xwork2.ActionContext; 8 import com.opensymphony.xwork2.ActionSupport; 9 10 /** 11 * 12 * 控制器 13 * 14 * @author Johness 15 * 16 */ 17 public class ParamAction extends ActionSupport { 18 19 private static final long serialVersionUID = -3487468019022846168L; 20 private Employee emp; 21 private String testParam; 22 23 // 如果不新增emp的get方法 24 //public Employee getEmp() { 25 // return emp; 26 //} 27 28 public void setTestParam(String testParam) { 29 this.testParam = testParam; 30 } 31 32 public void setEmp(Employee emp) { 33 this.emp = emp; 34 } 35 36 @Override 37 public String execute() throws Exception { 38 // 大家知道struts2有自動的資料填充,我們看看有沒有作用 39 System.out.println("控制器內emp物件的cname屬性為:" + this.emp.getCname()); 40 System.out.println("控制器內emp物件的ename屬性為:" + this.emp.getEname()); 41 System.out.println("控制器內testParam的值為:" + this.testParam); 42 43 // 我們看看真正傳遞回來的引數 44 Map<String, Object> parameters = ActionContext.getContext() 45 .getParameters(); 46 if (parameters != null) 47 for (String key : parameters.keySet()) 48 System.out.println(key + "=" + parameters.get(key).toString()); 49 50 return null;// 不迴應請求,我們只做實驗、觀察 51 } 52 }
複製程式碼

  index.jsp

複製程式碼
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <html>
 4   <head>    
 5     <title>測試頁面</title>
 6   </head>
 7   
 8   <body>
 9     <form action="param.action" method="post">
10         emp.cname:<input name="emp.cname" /><br/>
11         emp.ename<input name="emp.ename" /><br/>
12         testParam:<input name="testParam" /><br/>
13         <input type="submit" value="post" />
14     </form>
15   </body>
16 </html>
複製程式碼

  struts.xml

複製程式碼
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
3 <struts>
4     <package name="default" namespace="/" extends="struts-default">
5         <action name="param"
6             class="org.johness.blogcase.struts2.web.action.ParamAction" />
7     </package>
8 </struts>    
複製程式碼

  然後我們開啟瀏覽器,進行測試:

  

  結果:

  

  這是正常的不正常情況:只有一個屬性被設定。

  可以看出,引數確實是傳回來了,但emp沒有全部都認。這是怎麼回事呢?

  我們進行除錯,在Employee.java中兩個屬性的set方法打上斷點,你會發現:兩個屬性的set方法都被呼叫,但是兩次呼叫時物件不一樣了,好像是——在第一次設定cname屬性後又建立了一個新Employee物件設定了ename!

  什麼原因造成的?我推測是因為在控制器中emp物件沒有get方法!

  在ParamAction中新增getEmp方法以返回emp物件,以此方法為斷點,你會發現struts2確實是這樣操作的:逐個引數進行判斷,設定屬性。

  在新增方法後:

  

  怎麼樣,不寫get是不行的哦!

 歡迎您移步我們的交流群,無聊的時候大家一起打發時間:Programmer Union

 或者通過QQ與我聯絡:點選這裡給我發訊息

 (最後編輯時間2012-11-01 16:11:24)