• 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是不行的哦!

     欢迎您移步我们的交流群,无聊的时候大家一起打发时间:Programmer Union

     或者通过QQ与我联系:点击这里给我发消息

     (最后编辑时间2012-11-01 16:11:24)

    认真你就输了,一直认真你就赢了!
  • 相关阅读:
    使用云(BAE)实现android应用数据的远程存取(MySQL)
    VI键盘图
    IOS 6 UIActivityViewController详解 社交分享
    IOS 计算字体控件盖度, 设置粗体+阴影
    myeclipse中tomcat 7.0 关于64位与32位的冲突问题 ( tcnative1.dll )
    九度OJ 1001 A+B for Matrices
    网站10大常见安全漏洞及解决方案
    js网页如何获取手机屏幕宽度
    常用正则说明
    php中的线程、进程和并发区别
  • 原文地址:https://www.cnblogs.com/Johness/p/2749830.html
Copyright © 2020-2023  润新知