ModelDriven和prepareable接口解决update时,只会保存提交的数据,而将其余为重新设值的数据update为空的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ModelDriven和prepareable接口解决update时,只会保存提交的数据,而将其余为重新设值的数据update为空的问题相关的知识,希望对你有一定的参考价值。
1 public class EmployeeAction0 extends BaseAction implements 2 ModelDriven<Employee>, Preparable { 3 private IEmployeeService employeeService; 4 private PageResult<Employee> pageResult; 5 private Employee employee; 6 // 必须进行实例化 7 private EmployeeQuery baseQuery = new EmployeeQuery(); 8 private Long id; 9 10 public Long getId() { 11 return id; 12 } 13 14 public void setId(Long id) { 15 this.id = id; 16 System.out.println("EmployeeAction.setId:"+id); 17 } 18 19 public void setEmployeeService(IEmployeeService employeeService) { 20 this.employeeService = employeeService; 21 } 22 23 // 在list.jsp显示数据 24 public PageResult<Employee> getPageResult() { 25 return pageResult; 26 } 27 28 public EmployeeQuery getBaseQuery() { 29 return baseQuery; 30 } 31 32 public void setBaseQuery(EmployeeQuery baseQuery) { 33 this.baseQuery = baseQuery; 34 } 35 36 // 列表 37 @Override 38 public String execute() throws Exception { 39 System.out.println("execute"); 40 this.pageResult = employeeService.findPageResult(baseQuery); 41 return SUCCESS; 42 } 43 44 // 显示新增和修改页面 45 @Override 46 public String input() throws Exception { 47 System.out.println("input" + id); 48 return INPUT; 49 } 50 51 // 处理新增和修改后的保存 52 public String save() throws Exception { 53 System.out.println("save"); 54 if (id == null) { 55 employeeService.save(employee); 56 } else { 57 employeeService.update(employee); 58 } 59 return RELOAD; 60 } 61 62 // 删除 63 public String delete() throws Exception { 64 System.out.println("delete" + id); 65 if (id != null) { 66 employeeService.delete(id); 67 } 68 return RELOAD; 69 } 70 71 @Override 72 public Employee getModel() { 73 return employee; 74 } 75 // 访问每一个action的方法都会先调用此方法:前置方法 76 @Override 77 public void prepare() throws Exception { 78 System.out.println("prepare"); 79 } 80 81 // input,save方法之前执行 82 public void prepareInput() throws Exception { 83 System.out.println("prepareInput:" + id); 84 if (id != null) { 85 employee = employeeService.get(id); 86 } 87 } 88 89 public void prepareSave() throws Exception { 90 System.out.println("prepareSave" + id); 91 if (id != null) { 92 employee = employeeService.get(id); 93 } 94 } 95 96 }
该Action通过实现ModelDriven接口,使用getModel()方法获取到employee的模型,,此时employee为空,,因此在值栈的栈顶中任然是action存在于其中,,而通过实现prepareable接口,通过prepareInput()和prepareSave()2个方法,并在这2个方法内部提供一段代码使得employee根据id从数据库中获取到具体值,不再为空[注意:此处的id要能够被获取到,需要将default_stack拦截器栈中的params拦截器位置移动到prepare拦截器之前,首先由默认在栈顶的action将id设置到action中,然后prepare方法根据此时已经不为空的id从数据库中获取到employee的值,,然后在执行到modelDriven拦截器时,将已经不为空的employee压入到栈顶中,页面中的各个参数可以直接从值栈获取值,可以回显..而在此后修改完成提交进行保存时,发起了另一个save()的请求,此时同上,employee在该请求中由从数据库中的得到值,然后被压入栈顶,同时,jsp页面中的属性参数值将会设置栈顶中的employee中的相应属性值,,而其余属性保持原来的值不变,最后在save()方法中,因为存在id是否为空的判断,从而调用update()方法将该employee对象持久化到数据库中,而不会造成未重新设置值的属性被设置为null的问题..
以上是关于ModelDriven和prepareable接口解决update时,只会保存提交的数据,而将其余为重新设值的数据update为空的问题的主要内容,如果未能解决你的问题,请参考以下文章