保存员工或者用户信息时,以员工为例,是通过表单收集信息的,需要把这些信息赋给一个对象,然后保存到数据库中。对应的Action类须实现Preparable接口及ModelDriven接口,且在Action类中需要一个Employee model全局变量,getter、setter方法。一个prepareSave()方法。具体代码如下:
import com.atguigu.entities.Employee;
import com.atguigu.service.EmployeeService;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
public class EmployeeAction implements ModelDriven<Employee>, Preparable {
private EmployeeService employeeService;
public EmployeeService getEmployeeService() {
return employeeService;
}
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
public String save() throws Exception {
System.out.println(model);
employeeService.save(model);
return "success";
}
private Employee model;
public void setModel(Employee model) {
this.model = model;
}
public void prepare() throws Exception {
}
public void prepareSave() throws Exception {
model = new Employee();
}
@Override
public Employee getModel() {
return model;
}
}
分析:代码中的prepare()方法是实现Preparable接口实现的,我们不用这个方法,清空方法体只保留大括号即可。void prepareSave() 方法是我们自己写的,只是新建一个实体对象并赋给全局变量model。getModel()方法是实现ModelDriven<Employee>接口实现的,返回值全局变量model。因为Action类实现了ModelDriven接口,ModelDrivenInterceptor拦截器会把getModel()方法的返回值也就是model放到值栈的栈顶。而ParamsInterceptor拦截器会把表单元素的值赋到栈顶对象对应的属性中,此时model对象即是表单元素封装的对象。
除此之外,还需配置PrepareI拦截器的一个参数alwaysInvokePrepare来禁止prepare()方法的调用,
<interceptors>
<interceptor-stack name="MydefaultStack">
<interceptor-ref name="defaultStack">
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="MydefaultStack"></default-interceptor-ref>