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 }    

 

posted @ 2017-02-25 12:41  何甜甜在吗  阅读(287)  评论(0编辑  收藏  举报