在加班的时候发现自己的一个知识盲点,Struts2中的ModelDriven.发现这个问题的过程是很有意思的,由于刚划分到新的部门,在使用新框架的时候发现前台jsp表单中的属性值传递到后台Action中之后被放在了一个在Action中定义好的对象里.就很奇怪了,它是如何实现的呢?接着就有了如下知识点的整理:
struts2中的Action根据其属性的不同可以分为两类:Filed-Driven Action(属性驱动)和Model-Driven Action(模型驱动).
<1>Field-Driven(属性驱动)Action,Action拥有自己的属性,这些属性一般是Java的基本类型。表单字段直接和Action的属性对应.
<2>Model-Driven Action(模型驱动),在struts2中,提供了一种直接使用领域对象的方式,就是让action实现com.opensymphony.xwork2.ModelDriven接口,ModelDriven让你可以直接操作应用程序中的领域对象,允许你在web层和业务层使用相同的对象.
ModelDriven接口只有一个方法 public Object getModel() { return null; } 该方法返回一个用于接收用户输入数据的对象模型,在这个模型对象中的属性可以直接通过(属性名)来访问,而不需要使用(对象名.属性名)这种格式来访问了,在action里也不需要对对象提供getter和setter方法了,但是必须要在action中进行new操作.
Filed-Driven Action和Model-Driven Action的区别:
(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型
(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象
(3)在Action提供一个泛型的私有对象,就是定义一个对象,并提供相应的getter与setter。
到底是用属性驱动和是模型驱动呢?
(1)请统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。
(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,建议使用模型驱动,这样看起来代码会整洁.
(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。