若没有实现ModelDriven的接口,Controll的代码会比较冗余,不能实现Controll和Model代码的分离

下面是没有实现ModelDriven接口的SuggestAction

 package dayday.controll;

 import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import dayday.model.Product;
import dayday.model.Suggest;
import dayday.service.AddSuggest; /**
* Created by I am master on 2017/2/22.
*/
public class SuggestAction extends ActionSupport{
//保存对象的信息
private Suggest suggest;
private AddSuggest addSuggest; private String sugName;
private String sugEmail;
private String sugPhone;
private String sugContent; public String getSugName() {
return sugName;
} public void setSugName(String sugName) {
this.sugName = sugName;
} public String getSugEmail() {
return sugEmail;
} public void setSugEmail(String sugEmail) {
this.sugEmail = sugEmail;
} public String getSugPhone() {
return sugPhone;
} public void setSugPhone(String sugPhone) {
this.sugPhone = sugPhone;
} public String getSugContent() {
return sugContent;
} public void setSugContent(String sugContent) {
this.sugContent = sugContent;
} @Override
public String execute()throws Exception{
suggest.setSugContent(getSugContent());
suggest.setSugEmail(getSugEmail());
suggest.setSugName(getSugName());
suggest.setSugPhone(getSugPhone());
addSuggest.insertSuggest(suggest);
return SUCCESS;
}
}

实现了ModelDriven接口的SuggestAction接口以后的代码

 package dayday.controll;

 import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import dayday.model.Product;
import dayday.model.Suggest;
import dayday.service.AddSuggest; /**
* Created by I am master on 2017/2/22.
*/
public class SuggestAction extends ActionSupport implements ModelDriven<Suggest>{
//保存对象的信息
private Suggest suggest;
private AddSuggest addSuggest; @Override
public String execute()throws Exception{
addSuggest.insertSuggest(suggest);
return SUCCESS;
} @Override
public Suggest getModel() {
suggest=new Suggest();
return suggest;
}
}

明显代码量减少了很多,实现了分离

Action实现ModelDriven接口运行的原理

 1). 先会执行 ModelDrivenInterceptor 的 intercept 方法. 

     public String intercept(ActionInvocation invocation) throws Exception {
//获取 Action 对象: SuggestAction 对象, 此时该 Action 已经实现了 ModelDriven 接口
//public class SuggestAction extends ActionSupport, implements ModelDriven<Employee>
Object action = invocation.getAction(); //判断 action 是否是 ModelDriven 的实例
if (action instanceof ModelDriven) {
//强制转换为 ModelDriven 类型
ModelDriven modelDriven = (ModelDriven) action;
//获取值栈
ValueStack stack = invocation.getStack();
//调用 ModelDriven 接口的 getModel() 方法
//即调用 EmployeeAction 的 getModel() 方法
/*
public Employee getModel() {
employee = new Employee();
return employee;
}
*/
Object model = modelDriven.getModel();
if (model != null) {
//把 getModel() 方法的返回值压入到值栈的栈顶. 实际压入的是 EmployeeAction 的 employee 成员变量
stack.push(model);
}
if (refreshModelBeforeResult) {
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
return invocation.invoke();
} 2). 执行 ParametersInterceptor 的 intercept 方法: 把请求参数的值赋给栈顶对象对应的属性. 若栈顶对象没有对应的属性, 则查询
值栈中下一个对象对应的属性... 3). 注意: getModel 方法不能提供以下实现. 的确会返回一个 Suggest 对象到值栈的栈顶. 但当前 Action
的 suggest 成员变量却是 null. public Suggest getModel() {
return new Suggest();
}

最新文章

  1. 测试或运维工作过程中最常用的几个linux命令?
  2. Senparc.Weixin.MP SDK 微信公众平台开发教程(十七):个性化菜单接口说明
  3. chrome开发总结(交互/权限/存储)-爬虫
  4. WPF学习之路(三) 属性与依赖
  5. TeamTalk源码分析之服务端描述
  6. Linux下搭建Lotus Domino集群
  7. 一起学CUDA(零)
  8. 读书笔记 (一) ———Fundamentals of Multiagent Systems with NetLogo Examples by Prof. Jose M Vidal
  9. Postman 安装 &amp; 资料
  10. 为什么不能在scrollview中直接添加一个image,然后使animation.begin()??
  11. 基于S5pv210流媒体server的实现之网络摄像头(by liukun321 咕唧咕唧)
  12. CSS禁止用户选择复制
  13. Git详解之四:服务器上的Git
  14. nginx解决反向代理超时
  15. MyBatis进阶(四)
  16. 在PHP中使用AES加密算法加密数据
  17. Spring Security 中的过滤器
  18. synchronized 关键字如何使用
  19. hdu1251 && hud 1247 (字典树)
  20. window 2008 定时任务调用bat不成功的解决方法

热门文章

  1. js判断数组中是不是有某个元素
  2. Fiddler 4 界面功能介绍
  3. JavaScript基础一
  4. 整体二分求动态区间第k大
  5. 【MySQL】【4】数据库时间与实际时间相差8小时
  6. 什么是BFC、IFC、GFC和FFC
  7. python-django rest framework框架之视图
  8. tar打包时的排除选项
  9. zzw原创_根据某一文件复制出大量固定位数后缀名的递增的文件
  10. TLS 改变密码标准协议(Change Cipher Spec Protocol) 就是加密传输中每隔一段时间必须改变其加解密参数的协议