Struts2即支持属性驱动,也支持模型驱动

属性驱动:在Action中提供与表单字段一一对应的属性,然后一一set赋值

模型驱动:使得表单字段都自动被set到一个JavaBean中,类似于Struts1.XActionForm

采用属性驱动的方式时,是由每个属性来承载表单的字段值,运转在MVC流程里面

采用模型驱动的方式时,是由模型对象来承载所有的属性值,运转在MVC流程里面

若使用模型驱动方式的话,就必须单独提供一个JavaBean

可能与持久层打交道的JavaBean不太一样,因此很可能要对每个对象提供两个JavaBean

比如Struts1的ActionForm,一般来说绝对不会把ActionForm作为JavaBean跟持久层交互

ActionForm仅仅是联系Web和Action的一个桥梁,因此推荐使用属性驱动接收表单字段


com.opensymphony.xwork2.ModelDriven接口源代码中有一段很重要的说明,现抄录如下

ModelDriven Actions provide a model object to be pushed onto the ValueStack in addition

to the Action itself,allowing a FormBean type approach like Struts

翻译:模型驱动的Action。将模型对象以及Action对象都放到ValueStack里面

         允许像Struts一样的FormBean方式

也即:一个Action要想成为模型驱动的话,就必须实现ModelDriven接口

         而我们之前所一直继承的ActionSupport类并没有实现ModelDriven接口

以下是采用模型驱动的Action代码示例

  1. public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
  2. private User user = new User();
  3. public User getModel() {
  4. System.out.println(user);
  5. return user;
  6. }
  7. public String execute() throws Exception {
  8. System.out.println("Username is :" + user.getUsername());
  9. System.out.println("Password is :" + user.getPassword());
  10. return SUCCESS;
  11. }
  12. }

ModelDrivenAction类的执行流程是:首先调用getModel()方法得到User对象

接着根据JavaBean的原则将客户端传过来的属性,一个一个的set到User对象的属性中

将属性全部set完之后,再执行execute()方法。对于模型驱动,只要了解这些就足够了


模型驱动的底层实现机制

这里用到了defaultStack拦截器栈中的modelDriven拦截器

它对应com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor类,其API描述如下

public class ModelDrivenInterceptor extends AbstractInterceptor

Watches for ModelDriven actions and adds the action`s model on to the value stack.

翻译:观察模型驱动的Action,并将这个Action的模型【这里指User对象】放到值栈中

Note:The ModelDrivenInterceptor must come before the both StaticParametersInterceptor

and ParametersInterceptor if you want the parameters to be applied to the model.

翻译:若希望将表单提交过来的参数应用到模型里面

         那么ModelDrivenInterceptor拦截器就必须位于StaticParametersInterceptorParametersInterceptor拦截器前面

实际上struts-default.xml已完成这个工作了。可以在defaultStack拦截器栈中查看三者位置

所以对于采用模型驱动的方式的话,在struts.xml中只需要指定模型驱动的类就可以了

其它的都不需要我们手工修改


ModelDrivenInterceptor的部分源代码如下所示

  1. public class ModelDrivenInterceptor extends AbstractInterceptor{  
  2.     public String intercept(ActionInvocation invocation) throws Exception{  
  3.         Object action = invocation.getAction();  
  4.         // 这个action就是当前拦截器准备拦截的Action对象  
  5.         // 我们这里的action就是ModelDrivenAction,它实现了ModelDriven<User>接口  
  6.         // 根据多态性,可认为子类对象就是父类的一个实例,故action属于ModelDriven的实例  
  7.         if(action instanceof ModelDriven){  
  8.             // 将action强制转换为ModelDriven类型,获得ModelDriven的实例  
  9.             ModelDriven modelDriven = (ModelDriven)action;  
  10.             ValueStack stack = invocation.getStack();  
  11.             // 调用getModel(),此时ModelDrivenAction中的getModel()才会被执行,获得User对象  
  12.             Object model = modelDriven.getModel();  
  13.                 if(model != null){  
  14.                     // 获得User对象之后,就把它推入【压入】到值栈中,供后面调用  
  15.                     stack.push(model);  
  16.                 }  
  17.                 //以下略..  

Struts2的模型驱动的更多相关文章

  1. Struts2的属性驱动与模型驱动的区别

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  2. Struts2第十二篇【模型驱动】

    什么是模型驱动 在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装. 为什么要使用模型驱动? 我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的-既然有了p ...

  3. Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用

    1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...

  4. [java]struts2 模型驱动 2016-05-01 21:40 702人阅读 评论(19) 收藏

    一开始敲网上商城的时候,对于数据的传递方式我是很惊艳了一把的,感觉特别高大上,就感觉,竟然不用像.net一样取谁的值,给谁赋值这样,只要需要用的时候,简单的get一下就ok了,简直高大上啊. 然后发现 ...

  5. struts2的action从request获取参数值的几种方式

    使用jquery框架的ajax能够方便的向后台传递参数,以$.post为例,参数有2种方式字符串和键值对:$.post(url, "name=aty&age=25")和$. ...

  6. Struts2【开发Action】知识要点

    前言 前面Struts博文基本把Struts的配置信息讲解完了.....本博文主要讲解Struts对数据的处理 Action开发的三种方式 在第一次我们写开发步骤的时候,我们写的Action是继承着A ...

  7. action类中属性驱动和模型驱动的区别

    1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...

  8. jquery中ajax 从前端到后端 完整过程解析

    几个原则: 1.get方式访问浏览器时,常加参数缘由: GET访问浏览器是等幂的,就是一个相同的URL只有一个结果[相同是指整个URL字符串完全匹配],所以第二次访问的时候如果 URL字符串没变化,浏 ...

  9. SSH电力项目

    第一步:创建测试表Elec_Text: create table Elec_Text(textID varchar(50) not null primary key,textName varchar( ...

随机推荐

  1. myeclipse笔记(3):导入的项目切换jdk版本

    有时候,从外面导入的javaweb项目会访问不了,这个时候改变jdk版本就是其中解决的方法之一. 右键点击项目 --> bulid path --> configure​ ​​​ 选择需要 ...

  2. OpenCV——识别手写体数字

    这个是树莓派上运行的, opencv3 opencv提供了一张手写数字图片给我们,如下图所示,可以作为识别手写数字的样本库. 0到9共十个数字,每个数字有五行,一行100个数字.首先要把这5000个数 ...

  3. Edusoho 的 Arale validator使用说明

    1.js控制器文件开端 var Validator = require('bootstrap.validator'); require('common/validator-rules').inject ...

  4. HTML&CSS基础学习笔记1.2-HTML的全局属性?

    HTML元素都有属性,下面的这些全局属性是所有的HTML元素都可以使用的. 常见的有: HTML元素也有一些本身自己独特的属性,我们以后的笔记中有机会,会再为大家介绍哦. 下面是代码测验,具体的内容可 ...

  5. canvas个人总结

    今天做了大量的canvas作业,发现很多的步奏都是一样的,我自己就封装了一个画直线形2D图形函数.功能不是很强大. function drawModule(Json,strokeStyle,fillS ...

  6. C 语言字符 和字符串输出

    int main(void){ char ch; char str[80]; printf("Input a string: ");    //先输入字符串 gets(str);/ ...

  7. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  8. (Stack)Basic Calculator I && II

    Basic Calculator I Implement a basic calculator to evaluate a simple expression string. The expressi ...

  9. HashMap Collision Resolution

    Separate Chaining Use data structure (such as linked list) to store multiple items that hash to the ...

  10. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...