/** * */ private static final long serialVersionUID = 8602551280879236965L; private Logger logger = Logger.getLogger(this.getClass()); private Person person;
@Override public String execute() throws Exception{ logger.info(person.toString()); return SUCCESS; }
@Override public void validate() { if (person != null) { if (StringUtils.isBlank(person.getFirstName())) { addFieldError("person.firstName", "first name is required."); }
if (person.getAge() < 18) { addFieldError("person.age", "too younge, less than 18"); } } }
public void prepare() { person = new Person(); person.setAge(40); person.setEmail("email"); person.setFirstName("first name"); person.setLastName("lastName"); } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }
person类 public class Person { private String firstName; private String lastName; private String email; private int age;假如对应的界面有两个属性<form style="width: 50%;" action="register.action" method="post"> <fieldset> <lable>firstName</lable> <input type="text" name="person.firstName" > <br> <lable>age</lable> <input type="text" name="person.age" > <br> <input type="submit" name="" value="submit"/> </fieldset> </form>前台输入参数的时候,只输入了firstName和age属性,请求注册action后,经过prepare方法后,我们把person的属性全部赋值,然后方法execute中可观察到对象person中的属性是综合了前台和后台的属性。即前台传入的参数把person对象对应的属性覆盖了,而前台没有传过来的参数保持不变。这样就实现了参数的二次绑定。
但页面上可能只显示5个属性的输入框。如果按上面的方法,先new一个User类,然后从页面上赋值。
保存此对象时就会将不在页面上修改的5个属性清空了。这时就需要两次的binding,一开始user变量为空,
只绑定了action的id属性,然后在prepare()函数中查出有完整10个属性的对象,然后二次绑定时再将页面的那5个属性
复制到user对象中。
红色字体的看不太明白,有点模糊,能否解释一下,最好绘图说明,谢谢!!
import org.apache.log4j.Logger;import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
import com.zglv.base.model.Person;public class RegisterAction extends ActionSupport implements Preparable {
/**
*
*/
private static final long serialVersionUID = 8602551280879236965L; private Logger logger = Logger.getLogger(this.getClass()); private Person person;
@Override
public String execute() throws Exception{
logger.info(person.toString());
return SUCCESS;
}
@Override
public void validate() {
if (person != null) {
if (StringUtils.isBlank(person.getFirstName())) {
addFieldError("person.firstName", "first name is required.");
}
if (person.getAge() < 18) {
addFieldError("person.age", "too younge, less than 18");
}
}
}
public void prepare() {
person = new Person();
person.setAge(40);
person.setEmail("email");
person.setFirstName("first name");
person.setLastName("lastName");
} public Person getPerson() {
return person;
} public void setPerson(Person person) {
this.person = person;
}
person类
public class Person {
private String firstName;
private String lastName;
private String email;
private int age;假如对应的界面有两个属性<form style="width: 50%;" action="register.action" method="post">
<fieldset>
<lable>firstName</lable>
<input type="text" name="person.firstName" >
<br>
<lable>age</lable>
<input type="text" name="person.age" >
<br>
<input type="submit" name="" value="submit"/>
</fieldset>
</form>前台输入参数的时候,只输入了firstName和age属性,请求注册action后,经过prepare方法后,我们把person的属性全部赋值,然后方法execute中可观察到对象person中的属性是综合了前台和后台的属性。即前台传入的参数把person对象对应的属性覆盖了,而前台没有传过来的参数保持不变。这样就实现了参数的二次绑定。