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为空的问题的主要内容,如果未能解决你的问题,请参考以下文章

ModelDriven 和 Preparable 拦截器

保存新员工时,选择员工的所属部门无法保存的原因

Struts2 ModelDriven接口使用

ModelDriven接口封装数据

模型驱动

Struts2之ModelDriven的使用