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. Assimp场景模型输出Collada,STL,3DPDF

    本文介绍开源库模型的几种输出格式:DAE,STL,3DPDF. Assimp是C++写的,AssimpNet是C#重构其中主要数据结构,并开通Assimp中重要方法的调用接口,为不熟悉C++的码农带来 ...

  2. 一步步学会使用SeaJS(转)

    原文出处:一步步学会使用SeaJS 2.0 本文分为以下8步,熟悉之后就能够熟练使用SeaJS,从此之后你的生活会变得更加轻松愉悦! 1.SeaJS是什么? 2.下载并检阅SeaJS 3.建立工程和各 ...

  3. shopnc B2B2C商城 Nginx下开启伪静态

    B2B2C商城 Nginx下开启伪静态,伪静态开启后,对系统的SEO极为有利,可以最大限度让商城页面被搜索引擎抓取,但在实际安装中,很多客户在这块都会遇到各种各样的问题. 1. 编辑商城配置文件(da ...

  4. MVC 4.0 Razor模板引擎 @Html.RenderPartial 与 @Html.RenderAction 区别

    近来在学习MVC 4.0,设置布局全局网页的页脚,使用了Razor语法 @{ Html.RenderPartial("Footer", Model.FooterData); } 但 ...

  5. QEventLoop 的使用两例

    熟悉的陌生人 Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道.,只是你可能没有意识到: QCoreApplicaton::exec() QApplication ...

  6. C#中使用命名管道进行进程通信的实例

    原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用 ...

  7. Visual Studio中的lib的链接顺序

    描述:如果有一个exe工程,它依赖于A.lib,B.lib,A.lib和B.DLL我同样有他们的源码工程.依赖顺序是这样的exe->A.lib->B.DLL.那么如果我改动了B的源码,编译 ...

  8. ASP.NET MVC4中的Model验证 移除指定验证信息

    MVC中通过Model在页面间传值使的程序开发变得更加的快捷,但是很多时候,我们在数据传递的时候为了确保数据的有效性,要对Model的相关属性做基本的数据验证. 不多说直接上个代码,Model的实体类 ...

  9. Jtree(节点的渲染+资源管理器)(2)

    上一次我们建立一个比较简单的资源管理器,这次我们说一下上面的资源管理器的问题,并且得尽量的贴近windows的资源管理器. 这样一个简单的资源管理树就完成了,下面我们说说它的问题: ① 图片和外观和W ...

  10. .NET 面试题(2)

    61.Application .Cookie和 Session 两种会话有什么不同? 1.Application 储存在服务端,没有时间限制,服务器关闭即销毁(前提是自己没写销毁方法) 2.Sessi ...