若没有实现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. python记录_day22 序列化

    序列化是指把内存里的数据类型转换成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘和网络传输时只能接受bytes 一.pickle 把python对象写入到文件中的一种解决方案,但是写入到文件 ...

  2. SpringBoot利用注解@Value获取properties属性为null

    参考:https://www.cnblogs.com/zacky31/p/8609990.html 今天在项目中想使用@Value来获取Springboot中properties中属性值. 场景:定义 ...

  3. 一、集合框架(关于ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet)

    一.ArrayList 解决了数组的局限性,最常见的容器类,ArrayList容器的容量capacity会随着对象的增加,自动增长.不会出现数组边界的问题. package collection;   ...

  4. html 中一些不常见的标签

    标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> 定义小号字. ...

  5. 【转】MVC form提交实体接收参数时空字符串值变成null

    问题:entity.BZ的值是null,Request.Form["BZ"]的值是空字符串 目标:让entity.BZ的值是空字符串. 解决方法:在实体的BZ属性上加上 [Disp ...

  6. 漫谈moosefs中cgi各项的意义

    原创:http://www.cnblogs.com/bugutian/p/6869278.html 转载请注明出处 一.先上一张图 二.解释 1. Metadata Servers (masters) ...

  7. HDU 1005 Number Sequence(数论)

    HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...

  8. 模块化&os&sys

    syspath python 使用import模块调用的优先级是根据sys.path路径来的,此变量中位置在列表中的先后顺序来调用,如果先找到对应的模块,则先调用此模块. import sys pri ...

  9. Uva 11520 - Fill the Square 贪心 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  10. Object value iterator:值迭代器

    // ES5 // 对于数组,使用标准的 for 循环,其实这种方式并不是在遍历值,而是遍历下标来指向值!ES5中增加了一些数组迭代器:forEach.every.some // forEach:遍历 ...