struts 1.3 核心组件(二)

3.ActionForm类的用法

ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的。RequestProcessor使用请求表单参数自动填充该ActionForm对象。
所有的ActionForm都被配置在struts-config.xml文件中,该文件包括了一个form-beans的元素。该元素内定义了所有ActionForm,每个ActionForm对应一个form-bean元素。

方法:
validate()方法
  validate方法的作用是验证客户输入的数据是否符合条件 。
reset()方法
   reset方法中可以对属性做重置,可以在这个方法中恢复各个属性的默认值。reset方法在每次为ActionForm赋值前调用。

当我们要用ActionServlet里的form时,首先要把form强制转换为我们所要用到的actionForm,那么就要定义一个ActionForm.但是怎样定义一个ActionForm呢?分为如下几步:

1.写一个类extends ActionForm,因为ActionForm是所有的Form的父类. 然后再写一些属性,这里的属性是网页上面的要得到的数据相应的名字,这里的名字可以是不同的,但是它们的get/set方法必须是页面上的输入框的名字首字母大写,所以这里最好是和页面上的输入框的名字相同,这样就可以避免一些问题.
2.就是生成get/set方法,使用ActionServlet的时候就会把页面上传入的数据根据属性,去调用set方法,自动的给封装成一个ActionForm,下面使用的时候就只管get就可以了.问题来了,说它是自动封装好了,如果有多个ActionForm那么它怎么知道对哪一个ActionForm进行封装数据呢,这就要在struts-config.xml文件里面进行配置,其中又在它的form-beans的节点下面进行配置,form-beans下面可以配置多个form-bean,那么我们就可以只对它的两个属性进行配置,name,type:
   name表示它的一个名字,它个名字和servlet里的class-name的作用是一样的,是一个中介,它可以action和form-bean连接起来,这样可以指定某一个ActionForm是某一个的action的.
   type表示是某一个具体的Action-form的构建路径(全路径).

写好了,也配置好了,还没有完呢,那它是怎样调用的呢,什么时候调用的呢,这就要涉及到了Actionform的生命周期了.

ActionForm的生命同期:

1.首先是控制器接收到了请求之后,然后在作用域里去找(默认是在Session),看有没有所请求的ActionForm已经存在.
   如果有,这就说明这个ActionForm已经用过了,里面就有上一次所用过的数据,所以就要调用reset()方法,把数据重置为初始值;如果没有,那么就要根据type的构建路径,来反射产生一个ActionForm放要作用域里,如果不想要它放在Session作用域里,就可以在Action里设置一个名叫scope的属性(scope="request"),然后反射后所产生的ActionForm就会放到request作用域里面;
   不管是找得到找不到最后都会一个空的ActionForm(就是没有装入数据),接下来就是向ActionForm里放入本次提交的数据;
2.把数据装入进去之后,又要分为两条分支,一是要进行数据的验证(看输入的数据是否合法),二是不进行数据的验证,直接把数据交给Action。
3.那么我们又怎样来判断是否进行数据的验证呢?
   这就又要涉及到Action的另一个validate属性,validate只有两个值true,false;其中true表示要进行数据的验证,false表示不进行数据的验证,它就把数据直接交给了Action;如果validate是true的话,就要调用ActionForm的Validate方法,这个方法有两个,一个是针对Http协议的,另一个是针对Servlet的,所以我们一般是用的针对Http协议的.
   验证数据就会有两个结束要么成功,要么失败;如果成功的话,就把数据交给了Action,Action再做一些处理,最后返回一些内容.
4.这样就完了吗?
  没有,别忘了还要根据返回的值进行配置,跳到相应的页面;如果没有成功就不会把数据交给Action而是要跳到错误的页面,那么我怎么知道该跳到哪一个张页面呢?就得用到Action的另一个属性(input),input表示当验证失败的时候就跳到相应的错误页面.
5.那么怎样来判断它验证是成功还是失败呢?
  这就要涉及到Validate返回的值,它返回的是一个ActionErrors,注意这里是S结尾,表示可以放多个或者一个都不放;怎样放进去呢?它所放的值和Map一样也是键值.也是用的Add()方法,Add(String key, new MessageError(String key))方法有两个参数;你肯定要疑惑为什么这里会有两个key,说我慢慢说来,前面key是针对值new MessageError(String key),它在页面上根据前面的key可以找到new MessageError(String key));而后一个key是用在国际化里的,根据这个key找到国际化文件里所对应的值,这样就是所谓的国际化.
6.最后是判断ActionErrors里有没有值:如有就跳到Action里Input所对应的页面;没有把数据交给了Action.
  这里说一个Action是在struts-config.xml里的Action-mappings里进行配置的.它也有属性其中有几是常用的.name,type,path,validate,input,scope.
4.Action类及其相关类的用法
定义的Action组件类为org.apache.struts.action.Action子类类型,RequestProcessor调用该类的execute()方法以处理不同的页面请求 。
Struts框架只会为每个Action类创建一个Action实例。所有客户请求共享同一个Action实例,并且所有请求线程可以同时执行它的execute()方法。在多个线程同时使用Action对象的时候,要注意数据的线程安全。
5.ActionMapping的用法
在Struts中,ActionServlet只是任务的分派者,它依请求分配任务给其它的组件来执行,而分配的依据是请求的URI以及struts-config.xml的<action-mappings>标签所设定的内容。
<action-mappings>用来描述一组ActionMapping组件,当中的每一个<action>标签都对应一个ActionMapping组件,当客户端发出请求至ActionServlet时,ActionServlet根据其URI及<action>标签设定的path属性查看对应的ActionMapping组件,ActionMapping组件会告诉ActionServlet该使用哪一个Action组件(在<action>标签中使用type属性设定),而ActionServlet再将工作交给该Action组件来执行。
ActionServlet实际上将工作交给Action组件,然而Action组件的一些需求的信息,如使用哪一个ActionForm、forward对象的查找、错误发生时的页面对象等等,Struts将这些信息包装在ActionMapping中,并作为参数传送给Action组件,以使得Action在需要相关的信息时可以从ActionMapping中取得。
总之,ActionMapping是用来封装struts-config.xml文件中<action>标记的配置信息 。

在Struts中,ActionMapping继承自ActionConfig,大部份的属性定义实际上都已经在ActionConfig中完成。

6.掌握ActionForward的用法
Action的execute()方法执行完毕后会返回一个ActionForward对象 。
ActionForward对象它封装了一个Web资源 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值