struts 表单数据只能获得一个参数,其他是null

来源:互联网 发布:战舰世界格拉斯数据 编辑:程序博客网 时间:2024/05/21 12:33

 

  最近我偶然发现一个问题,这个问题出现在使用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 Johness15  * 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     @Override37     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)

 

认真你就输了,一直认真你就赢了!
0 0
原创粉丝点击