您的位置:首页 > 编程语言 > Java开发

struts2技巧与解惑——为什么我的表单参数只有一个生效(控制器对象属性没有或者只有一个被设置)

2012-11-01 16:12 861 查看
  最近我偶然发现一个问题,这个问题出现在使用struts2的时候,也属于粗心吧,所以记录下来。

  

  不知道大家有没有遇到过这样的事情:在控制器里有一个对象,它的各个属性是有公开的get和set方法的,我们在页面用 对象名.属性名 向控制器提交的时候,理论上struts2应该把这些散列的值为我们组合成对象,但却没有,要么对象只有一个值被设置,要么直接连对象都是空的。

  我创建好了一个struts2支持的Java EE项目:

  


  下面是测试代码:

  Employee.java

package org.johness.blogcase.struts2.pojo;

/**
*
* 实体类
*
* @author Johness
*
*/
public class Employee {
private String cname;
private String ename;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
}


  ParamAction.java

package org.johness.blogcase.struts2.web.action;

import java.util.Map;

import org.johness.blogcase.struts2.pojo.Employee;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
*
* 控制器
*
* @author Johness
*
*/
public class ParamAction extends ActionSupport {

private static final long serialVersionUID = -3487468019022846168L;
private Employee emp;
private String testParam;

// 如果不添加emp的get方法
//public Employee getEmp() {
//    return emp;
//}

public void setTestParam(String testParam) {
this.testParam = testParam;
}

public void setEmp(Employee emp) {
this.emp = emp;
}

@Override
public String execute() throws Exception {
// 大家知道struts2有自动的数据填充,我们看看有没有作用
System.out.println("控制器内emp对象的cname属性为:" + this.emp.getCname());
System.out.println("控制器内emp对象的ename属性为:" + this.emp.getEname());
System.out.println("控制器内testParam的值为:" + this.testParam);

// 我们看看真正传递回来的参数
Map<String, Object> parameters = ActionContext.getContext()
.getParameters();
if (parameters != null)
for (String key : parameters.keySet())
System.out.println(key + "=" + parameters.get(key).toString());

return null;// 不回应请求,我们只做实验、观察
}
}


  index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试页面</title>
</head>

<body>
<form action="param.action" method="post">
emp.cname:<input name="emp.cname" /><br/>
emp.ename<input name="emp.ename" /><br/>
testParam:<input name="testParam" /><br/>
<input type="submit" value="post" />
</form>
</body>
</html>


  struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" namespace="/" extends="struts-default">
<action name="param"
class="org.johness.blogcase.struts2.web.action.ParamAction" />
</package>
</struts>


  然后我们打开浏览器,进行测试:

  


  结果:

  


  这是正常的不正常情况:只有一个属性被设置。

  

  可以看出,参数确实是传回来了,但emp没有全部都认。这是怎么回事呢?

  我们进行调试,在Employee.java中两个属性的set方法打上断点,你会发现:两个属性的set方法都被调用,但是两次调用时对象不一样了,好像是——在第一次设置cname属性后又创建了一个新Employee对象设置了ename!

  什么原因造成的?我推测是因为在控制器中emp对象没有get方法!

  在ParamAction中添加getEmp方法以返回emp对象,以此方法为断点,你会发现struts2确实是这样操作的:逐个参数进行判断,设置属性。

  在添加方法后:

  


  怎么样,不写get是不行的哦!

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



或者通过QQ与我联系:



(最后编辑时间2012-11-01 16:11:24)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐