Struts2中的ModelDriven接口
若没有实现ModelDriven的接口,Controll的代码会比较冗余,不能实现Controll和Model代码的分离
下面是没有实现ModelDriven接口的SuggestAction
1 package dayday.controll;
2
3 import com.opensymphony.xwork2.ActionSupport;
4 import com.opensymphony.xwork2.ModelDriven;
5 import dayday.model.Product;
6 import dayday.model.Suggest;
7 import dayday.service.AddSuggest;
8
9 /**
10 * Created by I am master on 2017/2/22.
11 */
12 public class SuggestAction extends ActionSupport{
13 //保存对象的信息
14 private Suggest suggest;
15 private AddSuggest addSuggest;
16
17 private String sugName;
18 private String sugEmail;
19 private String sugPhone;
20 private String sugContent;
21
22 public String getSugName() {
23 return sugName;
24 }
25
26 public void setSugName(String sugName) {
27 this.sugName = sugName;
28 }
29
30 public String getSugEmail() {
31 return sugEmail;
32 }
33
34 public void setSugEmail(String sugEmail) {
35 this.sugEmail = sugEmail;
36 }
37
38 public String getSugPhone() {
39 return sugPhone;
40 }
41
42 public void setSugPhone(String sugPhone) {
43 this.sugPhone = sugPhone;
44 }
45
46 public String getSugContent() {
47 return sugContent;
48 }
49
50 public void setSugContent(String sugContent) {
51 this.sugContent = sugContent;
52 }
53
54 @Override
55 public String execute()throws Exception{
56 suggest.setSugContent(getSugContent());
57 suggest.setSugEmail(getSugEmail());
58 suggest.setSugName(getSugName());
59 suggest.setSugPhone(getSugPhone());
60 addSuggest.insertSuggest(suggest);
61 return SUCCESS;
62 }
63 }
实现了ModelDriven接口的SuggestAction接口以后的代码
1 package dayday.controll; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 import com.opensymphony.xwork2.ModelDriven; 5 import dayday.model.Product; 6 import dayday.model.Suggest; 7 import dayday.service.AddSuggest; 8 9 /** 10 * Created by I am master on 2017/2/22. 11 */ 12 public class SuggestAction extends ActionSupport implements ModelDriven<Suggest>{ 13 //保存对象的信息 14 private Suggest suggest; 15 private AddSuggest addSuggest; 16 17 18 @Override 19 public String execute()throws Exception{ 20 addSuggest.insertSuggest(suggest); 21 return SUCCESS; 22 } 23 24 @Override 25 public Suggest getModel() { 26 suggest=new Suggest(); 27 return suggest; 28 } 29 }
明显代码量减少了很多,实现了分离
Action实现ModelDriven接口运行的原理
1 1). 先会执行 ModelDrivenInterceptor 的 intercept 方法. 2 3 public String intercept(ActionInvocation invocation) throws Exception { 4 //获取 Action 对象: SuggestAction 对象, 此时该 Action 已经实现了 ModelDriven 接口 5 //public class SuggestAction extends ActionSupport, implements ModelDriven<Employee> 6 Object action = invocation.getAction(); 7 8 //判断 action 是否是 ModelDriven 的实例 9 if (action instanceof ModelDriven) { 10 //强制转换为 ModelDriven 类型 11 ModelDriven modelDriven = (ModelDriven) action; 12 //获取值栈 13 ValueStack stack = invocation.getStack(); 14 //调用 ModelDriven 接口的 getModel() 方法 15 //即调用 EmployeeAction 的 getModel() 方法 16 /* 17 public Employee getModel() { 18 employee = new Employee(); 19 return employee; 20 } 21 */ 22 Object model = modelDriven.getModel(); 23 if (model != null) { 24 //把 getModel() 方法的返回值压入到值栈的栈顶. 实际压入的是 EmployeeAction 的 employee 成员变量 25 stack.push(model); 26 } 27 if (refreshModelBeforeResult) { 28 invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model)); 29 } 30 } 31 return invocation.invoke(); 32 } 33 34 2). 执行 ParametersInterceptor 的 intercept 方法: 把请求参数的值赋给栈顶对象对应的属性. 若栈顶对象没有对应的属性, 则查询 35 值栈中下一个对象对应的属性... 36 37 3). 注意: getModel 方法不能提供以下实现. 的确会返回一个 Suggest 对象到值栈的栈顶. 但当前 Action 38 的 suggest 成员变量却是 null. 39 40 public Suggest getModel() { 41 return new Suggest(); 42 }