struts2技巧与解惑——为什么我的表单参数只有一个生效(控制器对象属性没有或者只有一个被设置)
2012-11-01 16:12
861 查看
最近我偶然发现一个问题,这个问题出现在使用struts2的时候,也属于粗心吧,所以记录下来。
不知道大家有没有遇到过这样的事情:在控制器里有一个对象,它的各个属性是有公开的get和set方法的,我们在页面用 对象名.属性名 向控制器提交的时候,理论上struts2应该把这些散列的值为我们组合成对象,但却没有,要么对象只有一个值被设置,要么直接连对象都是空的。
我创建好了一个struts2支持的Java EE项目:
下面是测试代码:
Employee.java
ParamAction.java
index.jsp
struts.xml
然后我们打开浏览器,进行测试:
结果:
这是正常的不正常情况:只有一个属性被设置。
可以看出,参数确实是传回来了,但emp没有全部都认。这是怎么回事呢?
我们进行调试,在Employee.java中两个属性的set方法打上断点,你会发现:两个属性的set方法都被调用,但是两次调用时对象不一样了,好像是——在第一次设置cname属性后又创建了一个新Employee对象设置了ename!
什么原因造成的?我推测是因为在控制器中emp对象没有get方法!
在ParamAction中添加getEmp方法以返回emp对象,以此方法为断点,你会发现struts2确实是这样操作的:逐个参数进行判断,设置属性。
在添加方法后:
怎么样,不写get是不行的哦!
欢迎您移步我们的交流群,无聊的时候大家一起打发时间:
或者通过QQ与我联系:
(最后编辑时间2012-11-01 16:11:24)
不知道大家有没有遇到过这样的事情:在控制器里有一个对象,它的各个属性是有公开的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)
相关文章推荐
- struts2通过表单提交POJO对象出错,生成的POJO类只有一个属性
- 1.首先描述下自定义控件的一般方法: 自定义控件是被创造出来,所以先要复写它三个的构造方法,根据需求决定复写哪个,若没有自定义属性,复写只有一个参数的即可。若有自定义属性,则可以通过obtainSty
- 对象写入redis,其他参数都有值,只有一个没有存入redis
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- oracle 设置keep池后没有生效的一个参数设置
- Java - 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- js中如何判读一个对象没有任何属性和方法
- js如何判断一个对象{}是否为空对象,没有任何属性
- ######保存角色,add表单页面Ajax传参给action,多个集合属性,【较为复杂的页面传参(封装ajax json参数)】:注意表单数据序列化,jquery遍历,json对象转String
- 思考一个问题:如何将map里面的值,映射到一个对象里的属性,不通过手动方式设置!!!
- 在java语言中为什么有时候构造方法有时要构造一个没有参数的方法
- 一对多时的Load主对象总是提示“一个参数没有被指定值”
- struts2 <s:textfield> 标签与<s:property>标签value值设置为action属性值或者对象的属性值
- python高效编程技巧7(pickle的使用:可以将一个对象存储在一个文件中,或者load进来)
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
- 使用表单传递参数,request处理参数出现"未将对象引用设置到对象的实例
- C++ 计算一个线段长度,两个端点的坐标值分别为(100,200)(200,300)。要求:定义一个CLine类,属性是CPoint对象。(初始化参数列表)
- 【问题分析】 为什么设置了android:windowIsTranslucent属性后Activity的退出动画就不生效了
- 设计技巧27:代理 Proxy 为另外一个对象提供替身或者站位符以控制对对象的访问
- 将前端所要传的参数设置在一个对象中,将对象转换成字符串往后台传