ActionForm

ActionForm用于封装用户的请求数据。即用户在页面上输入的数据。它充当了一个运输工具的角色。为了能够立体的理解ActionFrom。以下从两个角度看看:

    从封装的数据内容来看。通常实体对象是依据数据库的表来建立的,换句话说就是实体对象面对的是数据库。而ActionForm则面对的是界面上显示的数据。从作用来看。大家知道在没有引入Struts之前数据都是以页面上的元素为单位存放于Session或者request中。这种麻烦是取数据不方便。不够面向对象。

而ActionForm使得用户输入的和实体不正确应的数据也对象化了,以对象的方式存放在Session或者Request中。

ActionForm作用流程

通过一个时序图大概了解ActionForm的作用流程。由于没有先画类图,所以直接用文字描写叙述的。

多担待。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1b2ppYWppbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

作用域和生命周期

所谓生命周期就是ActionForm从创建到消亡的整个过程。从上面的时序图基本上也已经可以看个大概了。 ActionForm的生命周期有两种存在范围:request和session。

假设ActionForm存在于request范围,它仅在当前的请求生命周期中有效。

在请求从一个Web组件转发到还有一个Web组件的过程中,ActionForm实例一直有效。当server把响应结果返回给客户,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的更多相关文章

  1. struts(三)——struts框架实现登录示例

    前两篇讲解了struts框架的基本实现,自己感觉讲的也有些枯燥,今天拿登录的例子来做一个实现. 1.新建一个javaweb项目,并将struts的jar包拷贝到WebRoot/WEB-INF/lib下 ...

  2. SSH—Struts(三)—跑步者(Action)

    如已经描述Struts其基本原理和控制器ActionServlet,根据一个请求通过流ActionServlet之后就要到达Action类中做详细的处理了.ActionServlet通过ActionM ...

  3. SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  4. 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓

    hibernate工作原理 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提 ...

  5. 如何写一个SSH项目(三)如何进行交互的

    下面以登录为例子,展示从前台到后端的一整套流程并进行分析. 首先介绍一下我的SSH的分层结构 action和service一起是业务逻辑层          action层调用service层 dao ...

  6. 如何增加黑客通过ssh入侵的难度--保护ssh的三把锁

    源文档:https://blog.csdn.net/cnbird2008/article/details/6130696 简介 如果需要远程访问计算机并启用了 Secure Shell (SSH) 连 ...

  7. SSH(Struts、Spring、Hibernate)三大框架整合

    1. 新建数据库ssh_db -> 新建表user_tb(id为主键,自动递增) 2. 导入jar包(struts.hibernate 和 spring) 3. 注册页面reg.jsp,将表单的 ...

  8. 菜鸟学SSH(三)——Struts2国际化自动检测浏览器语言版

    前几天发了一篇Struts国际化的博客——<菜鸟学习SSH(二)——Struts2国际化手动切换版>,有网友提了一个意见,见下图: 于是就有了下面修改的版本: web.xml <?x ...

  9. [转] 浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓

      hibernate工作原理 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6 ...

  10. 保护SSH的三把锁

    ///////////////////////////////写在前面//////////////////////////////////////原帖地址:http://www.ibm.com/dev ...

随机推荐

  1. 远程连接到vultr vps的mysql服务器

    实验环境 vultr centos 6.7 x64 1. 首先要打开远程 vps的3306端口用于 mysql的连接 修改/etc/sysconfig/iptables 文件,添加3306端口的支持 ...

  2. redis入门(转)

    Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...

  3. 使用 WPF 创建单实例应用程序

    一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口 ...

  4. 【DataStructure】The description of Java Collections Framework

    The Java Connections FrameWork is a group of class or method and interfacs in the java.util package. ...

  5. redis预切片技术,实现

    平时,我们将创建多个redis实例,以缓解单redis压力范例.但,作为高速缓存的数量增加.对redis对于扩展是一种非 - 不要无所谓.对redis有几种方法用于扩张可能.让我们添加每个redis最 ...

  6. RH033读书笔记(9)-Lab 10 Understanding the Configuration Tools

    Lab 10 Understanding the Configuration Tools Sequence 1: Configuring the Network with system-config- ...

  7. 构造函数为什么不能为虚函数 &amp; 基类的析构函数为什么要为虚函数

    一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数 ...

  8. 基于高性能的硬件配置Nginx

    Nginx高级配置将涉及硬件,假设你配置不好,直接使各种性能下降. 我这里总结一下.怎样依据server的硬件设备来配置Nginx. 见下图: 低訪问量的网络,能够这样配置. 标准的网络訪问量,能够这 ...

  9. 算法导论学习---红黑树具体解释之插入(C语言实现)

    前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...

  10. Direct3D 使用质地

    关于使用质地 1 创建纹理 2 纹理寻址模式 3 纹理过滤 1 创建纹理 <1> D3DXCreateTexture功能 创建一个空的纹理. HRESULT  D3DXCreateText ...