首页 > 代码库 > SSH-Struts(三)—ActionForm

SSH-Struts(三)—ActionForm

    

ActionForm

    ActionForm用于封装用户的请求数据,即用户在页面上输入的数据。它充当了一个运输工具的角色。为了可以立体的理解ActionFrom,下面从两个角度看看:
    从封装的数据内容来看,通常实体对象是根据数据库的表来建立的,换句话说就是实体对象面对的是数据库。而ActionForm则面对的是界面上显示的数据。从作用来看,大家知道在没有引入Struts之前数据都是以页面上的元素为单位存放于Session或者request中。这样的麻烦是取数据不方便,不够面向对象。而ActionForm使得用户输入的和实体不对应的数据也对象化了,以对象的方式存放在Session或者Request中。

ActionForm作用流程

    通过一个时序图大概了解ActionForm的作用流程。因为没有先画类图,所以直接用文字描述的。多担待!


作用域和生命周期

    所谓生命周期就是ActionForm从创建到消亡的整个过程,从上面的时序图基本上也已经能够看个大概了。 ActionForm的生命周期有两种存在范围:request和session。如果ActionForm存在于request范围,它仅在当前的请求生命周期中有效。在请求从一个Web组件转发到另一个Web组件的过程中,ActionForm实例一直有效。当服务器把响应结果返回给客户,ActionForm实例及其包含的数据就会被销毁。如果ActionForm存在于session范围,同一个ActionForm实例在整个HTTP会话中有效。也就是说只要浏览器不关闭,session不过期,ActionForm就存在。

动态ActionForm

    使用ActionForm可以给开发者在处理HTML表单时带来极大的帮助,它简化了代码的编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。首先,如果ActionForm对应的HTML表单添加或删除一些属性,ActionForm类就可能需要修改并重新编译;其次,如果HTML表单是动态的,那么ActionForm更是无能为力了;另外,ActionForm增加了项目中类的绝对数量!
    于是从Struts1.1起,就引入了动态ActionForm(DyanActionForm)概念。动态ActionForm使得用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DyanActionForm类及其子类实现了动态ActionForm。

配置动态ActionForm

     动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,无须编写任何额外的JAVA代码。以下为示例:
      
<form-bean name="dynaFormForm" type="org.apache.struts.action.DynaActionForm">
           <form-property name="userName" type="java.lang.String" />
           <form-property name="userPwd" type="java.lang.String" />
</form-bean>

题外话——VO/DTO:

    所谓的VO和DTO实际上就是两种数据传输对象,而ActionForm就是一种VO所以这里满引入这个内容。

  • VO :value object值对象 / view object表现层对象

  主要对应页面显示(web页面/swt、swing界面)的数据对象。可以和表对应,也可以不,这根据业务的需要。

在struts中,用ActionForm做VO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtils的copy方法。
  • DTO (TO) :Data Transfer Object数据传输对象

  用在需要跨进程或远程传输时,它不应该包含业务逻辑。比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

   总结:ActionForm 从用户输入端出发对数据做了一个封装,使得程序更加的对象化。它扮演了一个运输工具的角色!


SSH-Struts(三)—ActionForm