当前位置: 首页 > news >正文

struts2之ModelDriven

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

可以根据Action属性的不同将它分为两类:Field-Driven(属性驱动) Action和Model-Driven(模型驱动) Action。
一、Field-Driven(属性驱动)Action,Action拥有自己的属性,这些属性一般是Java的基本类型。表单字段直接和Action的属性 对应。

二、实现了modelDriven接口可以在action中直接获得例如User对象,它会将 Object getModel()取得的User放到ValueStack中。可以理解为将这个User的属性追加到Action中。它主要是作用是实现类似 Struts的FormBean功能。

在struts2中,提供了一种直接使用领域对象的方式,就是让action实现com.opensymphony.xwork2.ModelDriven接口,ModelDriven让你可以直接操作应用程序中的领域对象,允许你在web层和业务层使用相同的对象。

ModelDriven接口只有一个方法

        public Object getModel() {
return null;
}

该方法返回一个用于接收用户输入数据的对象模型,在这个模型对象中的属性可以直接通过(属性 名)userName来访问,而不需要使用(对象名.属 性名)user.userName这种格式来访问了,在action也不需要对对象提供getter和setter方法了,但是必须要在action中进 行new操作

如下

// ModelDriven要使用泛型哦

public class LoginAction extends ActionSupport implements ModelDriven<User>{

private static final long serialVersionUID = -6434128483294080524L;

//这里必须要new
private User user=new User();
public String login() throws Exception {
// TODO Auto-generated method stub  
return SUCCESS;
}

//这里是实现接口方法

@Override
public User getModel() {
// TODO Auto-generated method stub

//别忘记了,要把返回值写上哦
return user;
}
}

这样一个ModelDriven就实现完毕了

和属性驱动的Action有很大的区别,下面一一列举:

(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。

(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。

(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter与setter。

好了,上面的三件事做完之后,Action就会去自动调用User的setter将表单中的name属性的值赋给User中的属性。而Action的后续处理的Jsp页面后者是Servlet就可以使用user对象了。

到底是用属性驱动和是模型驱动呢?

这个问题困扰了很多Struts2的初学者,我这里提供一些建议:

(1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。

(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模型驱动吧,毕竟看起来代码要整洁得多。

(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。

转载于:https://my.oschina.net/thinkinginc/blog/64679

相关文章:

  • asp.net开发注意事项
  • 金融创新推动资产管理公司发展
  • 安全策略的制定企业经营的基础
  • 钱盾反诈公益平台造反诈骗“防弹衣”
  • Salesforce:到2021年人工智能将创造80万工作岗位和1.1亿美元收入
  • vsftp日志内容详解
  • 带你认识DaoCloud这家做Docker的创业公司!
  • 技术不是神,不要随随便便的崇拜
  • 如何打破复杂网络中“孤岛化”防护?Fortinet让企业的信息安全更“任性”
  • 截获所有以太网帧数据并进行具体分析
  • 中国人工智能学会通讯——2016机器智能前沿论坛召开
  • Linux下mysql数据库简单导入和导出操作
  • poj 2954 Triangle
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Ubuntu设置root密码
  • hexo+github搭建个人博客
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Android Studio:GIT提交项目到远程仓库
  • Android单元测试 - 几个重要问题
  • AngularJS指令开发(1)——参数详解
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java精华积累:初学者都应该搞懂的问题
  • js递归,无限分级树形折叠菜单
  • leetcode46 Permutation 排列组合
  • MaxCompute访问TableStore(OTS) 数据
  • vue脚手架vue-cli
  • 构造函数(constructor)与原型链(prototype)关系
  • 机器学习中为什么要做归一化normalization
  • 追踪解析 FutureTask 源码
  • C# - 为值类型重定义相等性
  • Semaphore
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #pragma once
  • (26)4.7 字符函数和字符串函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (一)80c52学习之旅-起始篇
  • (转)memcache、redis缓存
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)虚函数剖析
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理出现中文乱码的情况
  • .NET MVC之AOP
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 事件模型教程(二)
  • .net快速开发框架源码分享
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @Autowired多个相同类型bean装配问题
  • @Builder用法
  • [] 与 [[]], -gt 与 > 的比较
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory