若没有实现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();
}

Struts2中的ModelDriven接口的更多相关文章

  1. Struts2中的ModelDriven机制及其运用

    所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar.struts2.actions; public cla ...

  2. Struts2中的ModelDriven机制及其运用(转)

    所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar.struts2.actions; public cla ...

  3. struts2中的ModelDriven使用

    http://www.cnblogs.com/Topless/archive/2012/01/17/2324980.html 例子都为struts2中的文档例子 JSP提交数据:   <s:fo ...

  4. Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题

    1.为什么需要ModelDriven? 所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar.struts2 ...

  5. 1. Action 实现 ModelDriven 接口后的运行流程

    1). 先会执行 ModelDrivenInterceptor 的 intercept 方法. public String intercept(ActionInvocation invocation) ...

  6. Struts2中请求参数的接收方式和ModelDriven机制及其运用

    odelDriven 为什么需要ModelDriven 所谓ModelDriven,意思是直接把实体类当成页面数据的收集对象.比如,有实体类User如下: package cn.com.leadfar ...

  7. Struts2中ModelDriven的使用

    它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...

  8. 接触Struts2的ModelDriven<>接口

    最近在学SSH框架,实战项目,用到了Struts2的ModelDriven<>接口,在这做一点记录 ModelDriven,意为模型驱动,意思是直接把实体类当成页面数据的收集对象 参考他人 ...

  9. struts2中的jsp值传到后台action接收的三种方法

    struts2中的Action接收表单传递过来的参数有3种方法: 如,登陆表单login.jsp: <form action="login" method="pos ...

随机推荐

  1. 安卓——AppTheme

    <?xml version="1.0" encoding="utf-8"?> <resources> <style name=&q ...

  2. Leetcode 1004. 最大连续1的个数 III

    1004. 最大连续1的个数 III  显示英文描述 我的提交返回竞赛   用户通过次数97 用户尝试次数143 通过次数102 提交次数299 题目难度Medium 给定一个由若干 0 和 1 组成 ...

  3. python 小练习3

    求大蜜题:给你两个正整数a(0 < a < 100000)和n(0 <= n <=100000000000),计算(a^n) % 20132013并输出结果 ret = 1 d ...

  4. C# 语法特性 - 匿名方法(C#2.0)

    概述 匿名方法的本质其实就是委托. 编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量. (匿名方法可以省略参数:编译的时候会自动为这个方法按照委托签名的参数添加参数) ...

  5. python爬虫基本原理及入门

    爬虫:请求目标网站并获得数据的程序 爬虫的基本步骤: 使用python自带的urllib库请求百度: import urllib.request response = urllib.request.u ...

  6. noip2014生活大爆炸版石头剪刀布

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  7. loj 10001 种树

    *********贪心,把需要的路段终止点排序,然后在每个区间内判断是否已经满足条件,不满足的从区间右端向左端种树. #include<cstdio> #include<algori ...

  8. 逆袭之旅DAY13.东软实训.Oracle.简单的查询语句.限制.排序

    2018-07-09  21:34:00 一.简单查询: .查询数据表的所有列: SELECT * FROM 表名; SELECT 列名,列名.... FROM 表名; .起别名: SELECT 列名 ...

  9. Win10系列:UWP界面布局进阶7

    Canvas Canvas元素用于定义一个区域,可以向这个区域中添加不同的XAML界面元素.Canvas会对其内部的元素采用绝对布局方式进行布局,下面通过三个示例来介绍Canvas的使用方法. (1) ...

  10. css 中的grid布局基础

    CSS Grid Layout为CSS引入了一个二维网格系统.网格可用于布局主要页面区域或小型用户界面元素. 网格是一组交叉的水平和垂直线 - 一组定义列,其他行.元素可以放在网格上,以行或者列为标准 ...