在Struts中ActionForm也是一个很重要的组件。他的主要作用就是收集数据。
1、ActionForm的作用
ActionForm 用来收集表单中的数据,可以将其看作是模型和视图的中介,它负责保存视图中的数据供模型或者视图使用。同时ActionForm 具有的过滤保护的作用,可以在将ActionForm数据发送到 Action 处理之前进行验证。
2、ActionForm的执行时间
ActionForm 是与一个或多个 ActionConfig 关联的JavaBean,在相应的 action 的 execute 方法被调用之前,ActionForm 会自动利用请求参数来填充自己(初始化属性)。
3、定义自己的ActionForm
ActionForm 是一个抽象类,必须通过继承来实现自己的类。在ActionForm中需要定义要收集的属性名,即表单中的信息,并为每个属性设置getter和setter方法,举个例子:
Jsp文件:
<body>
<form action="login.do" method="post">
用户名:<input type="text" name="username"><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" name="login">
</form>
</body>
则对应的自己的ActionForm为:
package wh;
import org.apache.struts.action.ActionForm;
publicclass LoginActionForm extends ActionForm {
private String username;
private String password;
//注意get和set后的内容与表单中的name相同
public String getUsername() {
returnusername;
}
publicvoid setUsername(String username) {
this.username = username;
}
public String getPassword() {
returnpassword;
}
publicvoid setPassword(String password) {
this.password = password;
}
}
需要注意的是,因为ActionForm利用属性的 getter 和 setter 方法来实现初始化,所以getUsername中的Username(首字母可大写)应该与表单中name="username"相同。
4、ActionForm的验证
初始化完毕后,在ActionServlet调用Action类前,ActionForm 的 validate() 方法被调用,我们可以在其中来检查请求参数的正确性和有效性:
Public ActionErrors validate(ActionMapping mapping, ServletRequest request)
Public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
我们需要在自己的ActionForm bean里覆盖validate()方法,并在配置文件里设置<action>元素的validate为true。调用validate()后,如果返回的ActionErrors不是null,则ActinForm会根据错误关键字将ActionErrors存储在请求属性列表中。
如果返回的不是null,而且长度大于0,则根据错误关键字将实例存储在请求的属性列表中,然后ActionServlet将响应转发到配置文件<action>;元素的input属性所指向的目标。
如果需要执行特定的数据有效性检查,最好在Action类中进行这个操作,而不是在ActionForm类中进行。
验证返回null之后ActionForm 将被作为参数传给 action 的 execute 方法以供使用。
5、ActionForm的生命周期
ActionForm bean 的生命周期可以设置为 session(缺省)和 request,当设置为 session 时,注意在 reset() 方法中将所有的属性重新设置为初始值。
public void reset(ActionMapping mapping,HttpServletRequest request)
public void reset(ActionMapping mapping,ServletRequest request)
6、ActionForm的配置:
Struts框架假设用户在应用程序中为每个表单都创建了一个ActionForm bean,对于每个在struts-config.xml文件中定义的bean,框架在调用Action类的perform()方法之前会在相关联的关键字下,检查用于适当类的bean实例,没有可用的bean,它就会自动创建一个新的bean,对于请求中每个与bean属性名称对应的参数,Action调用相应的set方法设置。当Action perform()被调用时,最新的ActionForm bean传送给它,参数值就可以立即使用了。
上面例子的Form bean的配置举例:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<form-beans>
<form-bean name="loginForm" type="wh.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="wh.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/error.jsp"
>
<forward name="success" path="/success.jsp"></forward>
<forward name="error" path="/error.jsp"></forward>
</action>
</action-mappings>
</struts-config>