strust2将jsp页面属性值封装传值给action详解以及问题处理
最近被这个问题给弄得要死......
正如大多数网友说的那样,这里先简要说下怎么搭建,然后再说下我自己的问题:
首先定义一个实体类User:
public class User{
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public User(){}
}
然后在action类中这么写:
private User customer;
public User getCustomer() {
return customer;
}
public void setCustomer(User customer) {
this.customer = customer;
}
最后在jsp页面中,写上:
用户名:<s:textfield name="customer.name"></s:textfield>
密码:<s:password name="customer.pwd"></s:password>
<s:submit value="提交"></s:submit>
当然剩下的自己加上去吧,这样就可以了。
然后接下来谈谈这个方法的一些需要注意到的地方:
1、实体类的变量命名时要注意,不能命名成cName也就是第二个字母是大写的这种格式,否则action取到的值会为null
为什么会这样呢?很简单,变量赋值的时候其实是根据.号后面的名称(即name,pwd)去对应的实体类中找对应的set方法,如果你用myeclipse自动生成的get,set方法的话那对应的set方法是:setcName,setcPwd。如果你定义成cName,那它去找的对应的set方法应该是setCName,但是自动生成的是setcName,也就是说压根就没调用到set方法,所以会出现null的情况。所以也不是说不能这么定义,只是定义成这样的话要自己写set方法才不会出出错。
2、实体类必须加上空的构造函数即public User(){} 否则会报空指针错误。
为什么会报空指针错误呢?很简单,因为在jsp页面到action中容器根据取到的参数的名称(本例中即customer.name和customer.pwd)得知是哪个实体类,会去调用该实体类的无参构造方法,构造完实例对象后,再根据页面传来的参数的名称去调用各个变量的set方法保存到实例对象中,因此需要的是无参构造方法而不是另外一个构造方法,删掉也可以。