struts2技巧与解惑——为什么我的表单参数只有一个生效(控制器对象属性没有或者只有一个被设置)
最近我偶然发现一个问题,这个问题出现在使用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是不行的哦!
(最后编辑时间2012-11-01 16:11:24)
认真你就输了,一直认真你就赢了!