Struts框架中的视图组件主要包括:
·JSP页面
·ActionForm类
·Struts自定义标记
·消息资源
其中,ActionForm类是Struts框架的核心组件之一,是Struts的关键视图组件。
1.ActionForm的作用机理
ActionForm本质上是一种JavaBean,是专门用来传递数据的DTO(Data Transfer Object,数据传递对象)。它包括用于表单数据验证的validate()方法和用于数据复位的reset()方法。
Struts框架利用ActionForm对象来临时存放视图页面中的表单数据。例如一个登录页面会有一个用户输入框和一个密码输入框,以及用来提交登录请求的按钮。当用户提交登录请求后,Struts将用户名和密码两个输入域的数据自动填充到相应的ActionForm对象中,然后控制层可以从该ActionForm对象中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm中,然后返回给视图显示。
ActionForm有请求(request)和会话(session)两种作用域(scope)。如果ActionForm的作用域设定为request,ActionForm实例将保存在request对象中,像其他保存在request对象中的属性一样,仅在当前的请求/响应范围内有效。如果ActionForm的作用域设定为session,那么ActionForm实例将被保存在session对象中,同一个ActionForm实例在整个HTTP会话中有效。
当验证ActionForm时,如果检测到一个或多个验证错误,Struts框架会把错误转发回配置文件struts-config.xml中<action>元素的input属性所指定的输入页面。
2.ActionForm的使用方法
(1)创建ActionForm
可以通过扩展Struts软件包的ActionForm类,来创建具体的ActionForm。Struts软件包中的ActionForm类本身是一个抽象类,在扩展该类时,为每一个要从HTML表单中捕获的输入域定义一个属性,使表单输入域与ActionForm的属性一一对应,以使ActionForm能够捕获需要的表单输入。定义了具体的属性,就可以覆写validate()和reset()方法,来实现具体的ActionForm验证规则和初始化方法。
(2)配置ActionForm
每创建一个ActionForm类,就需要在Struts的配置文件struts-config.xml中配置这个类,例如:
<form-beans>
<form-bean name="loginActionForm" type="login.loginActionForm" />
</form-beans>
<form-beans>元素用来指定全体ActionForm的配置,一个Struts应用所有的ActionForm的配置都要位于该元素标记内。<form-beans>元素的子元素<form-bean>用来配置一个具体的ActionForm类,每个<form-bean>元素对应的内容为一个form bean实例。一旦定义了<form-beans>元素,就可以在Action中使用它。
(3)访问ActionForm
ActionForm可以被JSP,Struts自定义标记,Action或其他Web组件访问。访问ActionForm的一般方法如下:
·使用Struts HTML标记库
Struts HTML标记库提供了一组和ActionForm密切关联的标记,这些标记对应到HTML表单域。如<html:form>标记对应HTML的<form>标记,<html:text>标记对应HTML表单的text类型<input>输入域。这些标记和ActionForm交互,以把ActionForm中的属性值显示出来。
·从request或session对象中取出ActionForm对象
根据作用域的不同,Struts框架把ActionForm实例保存在request或session对象中,保存时采用的key值为<form-bean>元素的名字,即name属性的值。因此,可以像取出任何存放在request或session对象中的属性一样取出ActionForm实例。例如:
loginActionForm form=(loginActionForm)request.getAttribute("loginActionForm");
·在Action类的execute()方法中直接访问ActionForm
如果配置了ActionForm和Action映射,Struts框架就会把ActionForm作为参数传递给Action类的execute()方法,在execute()方法中,可以直接读取或设置ActionForm属性。
3.表单数据验证
表单验证是ActionForm的主要功能之一,要实现这个功能,我们需要采取4个步骤:
·重写validate()方法。
·在资源文件ApplicationResources.properties中设置可能的验证错误的标识。
·要在配置文件struts-config.xml中,把<action>元素的validate属性设置为true,并添加<message-resources>元素以指明资源文件的存放路径。
·在相应输入页面的相应位置加如错误标记<html:errors>,以输出可能的验证错误。
(1)重写validate()方法
对该form bean的validatet()方法进行重写。ActionErrors类封装了一组验证错误,它的用法类似Map类。而ActionMessage类封装了单个验证错误,它的构造函数内的参数就指向资源文件内的一个错误文本。例如语句“ActionMessage("login.password.error");”中的参数"login.password.error"其实就是资源文件ApplicationResources.properties中的一条错误文本的键(key)。通过ActionErrors对象的add()方法,可以把ActionMessage对象加入到ActionErrors对象中。
(2)设置资源文件
在Struts的资源文件ApplicationResources.properties中设置可能的验证错误的标识:
#用户名错误
error.username.required=<li>Please input your username again!</li>
#密码错误
error.password.required=<li>Please input your password again!</li>
(3)修改配置文件struts-config.xml
将配置文件struts-config.xml中<action>元素的validate属性设定为true。此外,还需要增加<message-resource>元素,以指明资源文件的路径。
(4)在输入页面中加入错误标记
表单数据验证的目的是,一旦用户在输入页面表单中输入的数据不符合要求或出现错误,Struts验证机制将把验证错误在该输入页面相应的位置显示出来。
<html:errors>是Struts的一个自定义标记。它能根据它的property属性从资源文件ApplicationResources.properties中取出相应的验证错误,并在输入页面中指定的位置显示验证错误。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javashl/2008311/104075.html#)