Struts2之ModelDriven<T>的使用-程序员宅基地

技术标签: SSH  

我们可以根据Action属性的不同将它分为两类:Field-Driven(属性驱动)Action和Model-Driven(模型驱动)Action。 

一、Field-Driven(属性驱动)Action,Action拥有自己的属性,这些属性一般是Java的基本类型。表单字段直接和Action的属性对应 

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

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


public class DepartmentAction extends ActionSupport implements ModelDriven<Department>{
	private DepService depService;
	private int currPage = 1;
        //   必须NEW一个新的对象
	private Department department = new Department();
	//   getmodel()执行后会将department对象压入ValueStack值栈中
	public Department getModel() {
		// TODO Auto-generated method stub
		return department;
	}
         
	public void setDepService(DepService depService) {
		this.depService = depService;
	}
	public void setCurrPage(int currPage) {
		this.currPage = currPage;
	}
	//    分页查询,将对象压入值栈后,页面可直接使用对应属性名字进行输出
	public String findByPage(){
		PageBean<Department> pageBean = depService.findByPage(currPage);
		ActionContext.getContext().getValueStack().push(pageBean);
		return "findPage";
	}
}
这样一个ModelDriven就实现完毕了 


在jsp页面中从ModelDriven中取值

value="%{model.did}" --did为需要取值的字段名


和属性驱动的Action有很大的区别,下面列举: 
(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的JavaBean了。 
(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。 

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

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

到底是用  Field-Driven(属性驱动)  还是  Model-Driven(模型驱动)  呢?  

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

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

Spring中Bean的作用域、生命周期!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41517936/article/details/80281598

智能推荐

Gps 整体框架文字版_简述gps标准体系的框架结构-程序员宅基地

GPS架构1.1 GPS总体架构GPS总体架构如图所示。相关模块功能描述:LocationManager提供定位服务,GpsLocationProvider用于抽象GNSS提供的服务,Network Provider用于抽象网络定位服务,Libgps用于对接Android接口,解析NMEA,Gps engine通过计算raw data,计算出PV并打包到NMEA,AGPS负责S..._简述gps标准体系的框架结构

流畅的 Python-程序员宅基地

内容简介本书致力于帮助 Python 开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道 Python 风格的代码。本书尤其深入探讨了 Python 语言的高级用法,涵盖数据结构、Python 风格的对象、并行与并发,以及元编程等不同的方面。 Python 数据模型:理解为什么特殊方法是对象行为一致的关键。   数据结构:充分利用内置类..._流畅的python

Element UI——布局容器el-container子元素强制上下排列_element ui 上下布局-程序员宅基地

问题描述 <el-container> <content-header></content-header> <dashboard-content></dashboard-content> <content-footer></con..._element ui 上下布局

一个比较好玩的智力题_opooc的博客-程序员宅基地

问题描述//// ViewController.m// iOSzonglan//// Created by doushuyao on 2021/3/12.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; for(int i

随便推点

WebSphere MQ java开发遇到的问题及解决办法-程序员宅基地

最近公司需要消息组件,采用的是IBM的mq,由于网上资料相对来说比较少,遇到了不少问题,每次到网上去搜索也挺费劲,下面列出我遇到部分问题及解决办法。问题一:2033错误 出现该错误的原因可能是队列中数据为空,取不到值引起的。 问题二:2085错误 可能原因是配置的MQ名称大小写或者队列名字不对引起的。 问题三:2058错误..._mq2033错误

框架画一个横的柱状图html_用HTML和CSS画一个小黄人开始之前_祁了个画的博客-程序员宅基地

那些人就不要看了如果内心明显感觉不安,就不要看了。事无纲则繁3.Eyes and Goaale护目镜。Eyes由巩膜sclera,瞳&孔pupil组成。在HTMl中,都用去掉后成这样,goggle-strap link是→去掉后成这样,goggle-strap link是→4.Mouth。$mouth-width:60px;锁定嘴巴宽度,top left margin-left heigh..._html+css写横向多层关系架构图

Oracle数据库系统视图USER_TAB_COLS和USER_TAB_COLUMNS_user_tab_column里有事图吗-程序员宅基地

视图SYS.USER_TAB_COLS和SYS.USER_TAB_COLUMNS都保存了当前用户的表、视图和Clusters中的列信息。通过检索这两个表,可以方便的获取到表的结构。主要的列属性有: TABLE_NAME 表、视图或Clusters名称 COLUMN_NAME 列名 DATA_TYPE 数据类型 DATA_TYPE_MOD Da_user_tab_column里有事图吗

主流消息队列MQ对比_mq 对比-程序员宅基地

本文将从多个维度综合对比Kafka、RabbitMQ、RocketMQ、ActiveMQ这4款当前最主流的MQ消息中间件产品,希望能为您的下一次产品的架构设计和MQ消息中间件选型提供参考依据。 特点RabbitMQActiveMQKafkaRocketMQ资料文档资料数量多资料数量多资料数量中等资料数量少,建议去官网上看开发语言ErlangJavaScalaJava支持的协议AMQPOpenWire、STOMP、..._mq 对比

Android计时器TimerTask,Timer,Handler-程序员宅基地

Android计时器TimerTask,Timer,若要在TimerTask中更新主线程UI,鉴于Android编程模型不允许在非主线程中更新主线程UI,因此需要结合Android的Handler实现在Java的TimerTask中更新主线程UI。现给出一个简单示例。代码使用标准Java的TimerTask和Timer启动一个计时器Task。该任务每隔2秒更新主线程的UI(在主线程的TextV

QLineEdit的输入验证-程序员宅基地

Qt中有Validator这个类,用来给QLineEdit之类的加入输入验证,原生的验证器有QIntValidator, QDoubleValidator, QRegExpValidator, QRegularExpressionValidator,分别对应着int,double,及正则,其中QRegularExpressionValidator是Qt5之后引入用以替代QRegExpValidat...