zoukankan      html  css  js  c++  java
  • 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 }    
  • 相关阅读:
    spring配置文件中util:properties和context:property-placeholder
    为啥Spring和Spring MVC包扫描要分开?
    spring和springmvc父子容器关系
    springmvc请求参数获取的几种方法
    请求转发(Forward)和重定向(Redirect)的区别
    如何设计一个秒杀系统
    Maven使用之packing篇
    ECharts基本设置
    @RequestParam详解以及加与不加的区别
    从网页提取的关键字
  • 原文地址:https://www.cnblogs.com/Hdaydayup/p/6441545.html
Copyright © 2011-2022 走看看