Struts2的模型驱动
Struts2即支持属性驱动,也支持模型驱动
属性驱动:在Action中提供与表单字段一一对应的属性,然后一一set赋值
模型驱动:使得表单字段都自动被set到一个JavaBean中,类似于Struts1.X的ActionForm
采用属性驱动的方式时,是由每个属性来承载表单的字段值,运转在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代码示例
- public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {
- private User user = new User();
- public User getModel() {
- System.out.println(user);
- return user;
- }
- public String execute() throws Exception {
- System.out.println("Username is :" + user.getUsername());
- System.out.println("Password is :" + user.getPassword());
- return SUCCESS;
- }
- }
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拦截器就必须位于StaticParametersInterceptor和ParametersInterceptor拦截器前面
实际上struts-default.xml已完成这个工作了。可以在defaultStack拦截器栈中查看三者位置
所以对于采用模型驱动的方式的话,在struts.xml中只需要指定模型驱动的类就可以了
其它的都不需要我们手工修改
ModelDrivenInterceptor的部分源代码如下所示
- public class ModelDrivenInterceptor extends AbstractInterceptor{
- public String intercept(ActionInvocation invocation) throws Exception{
- Object action = invocation.getAction();
- // 这个action就是当前拦截器准备拦截的Action对象
- // 我们这里的action就是ModelDrivenAction,它实现了ModelDriven<User>接口
- // 根据多态性,可认为子类对象就是父类的一个实例,故action属于ModelDriven的实例
- if(action instanceof ModelDriven){
- // 将action强制转换为ModelDriven类型,获得ModelDriven的实例
- ModelDriven modelDriven = (ModelDriven)action;
- ValueStack stack = invocation.getStack();
- // 调用getModel(),此时ModelDrivenAction中的getModel()才会被执行,获得User对象
- Object model = modelDriven.getModel();
- if(model != null){
- // 获得User对象之后,就把它推入【压入】到值栈中,供后面调用
- stack.push(model);
- }
- //以下略..
Struts2的模型驱动的更多相关文章
- Struts2的属性驱动与模型驱动的区别
1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...
- Struts2第十二篇【模型驱动】
什么是模型驱动 在Struts2中模型驱动就是用来封装数据的..完成数据的自动封装. 为什么要使用模型驱动? 我们之前就使用过Sturts2的数据自动封装功能,是用params拦截器完成的-既然有了p ...
- Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用
1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...
- [java]struts2 模型驱动 2016-05-01 21:40 702人阅读 评论(19) 收藏
一开始敲网上商城的时候,对于数据的传递方式我是很惊艳了一把的,感觉特别高大上,就感觉,竟然不用像.net一样取谁的值,给谁赋值这样,只要需要用的时候,简单的get一下就ok了,简直高大上啊. 然后发现 ...
- struts2的action从request获取参数值的几种方式
使用jquery框架的ajax能够方便的向后台传递参数,以$.post为例,参数有2种方式字符串和键值对:$.post(url, "name=aty&age=25")和$. ...
- Struts2【开发Action】知识要点
前言 前面Struts博文基本把Struts的配置信息讲解完了.....本博文主要讲解Struts对数据的处理 Action开发的三种方式 在第一次我们写开发步骤的时候,我们写的Action是继承着A ...
- action类中属性驱动和模型驱动的区别
1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...
- jquery中ajax 从前端到后端 完整过程解析
几个原则: 1.get方式访问浏览器时,常加参数缘由: GET访问浏览器是等幂的,就是一个相同的URL只有一个结果[相同是指整个URL字符串完全匹配],所以第二次访问的时候如果 URL字符串没变化,浏 ...
- SSH电力项目
第一步:创建测试表Elec_Text: create table Elec_Text(textID varchar(50) not null primary key,textName varchar( ...
随机推荐
- Java学习笔记(2):jdk的配置
配置Java的开发环境 先说明一下,我的jdk文件目录是:D:\language\java\java soft\jdk1.6 JDK的安装与配置 解压“开发软件”中的jdk1.6.rar(解压版)到D ...
- arm+linux 裸机环境搭建之初试minicom+dnw烧写uboot
下面的步骤将会实现在linux下面使用dnw+minicom来烧写uboot 一.安装minicom 下载地址:http://download.csdn.net/detail/king_bingge/ ...
- DEDE栏目内容调用
{dede:sql sql='Select content from dede_arctype where id=1'} [field:content/] {/dede:sql},
- ServletContext对象(每个工程只有一个此对象)
一]重点方法: 1>存取对象 void setAttribute(String name, Object object);//将obj ...
- android dom方式创建xml
http://blog.csdn.net/nxh_love/article/details/7085174 在android dom 解析xml方式文章中,简单介绍了dom解析xml的应用.今天在原文 ...
- 自制单片机之十五……可串行驱动LCD12864的应用
在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864. 买了块S ...
- php面向对象编程之构造方法__construct()
php中构造方法是对象创建完成后第一个被对象自动调用的方法.在每个类中都有一个构造方法,如果没有显示地声明它,那么类中都会默认存在一个没有参数且内容为空的构造方法. 构造方法的作用 通常构造方法被用来 ...
- <PHP>字符串处理代码
字符串处理: strlen("aaa");取字符串的长度 *** strcmp("aaa","aaa");比较两个字符串 ...
- Struts2中将.action改为.do
struts2中action的默认拓展名是".action",而之前的拓展名一直为".do",工作中需要要把struts2的action拓展名改为". ...
- pyqt记录内容(音乐播放器)
#这是UI文件 # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'AudioPlayerDia ...