Struts之ActionForm(包括校验)

Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图:
① org.apache.struts.action包中
public abstract class ActionForm implements Serializable
public class DynaActionForm extends ActionForm implements DynaBean

② org.apache.struts.validator包中
public class ValidatorForm extends ActionForm implements Serializable
public class DynaValidatorForm extends DynaActionForm implements DynaBean, Serializable

③ org.apache.struts.validator包中
public class ValidatorActionForm extends ValidatorForm implements Serializable
public class DynaValidatorActionForm extends DynaValidatorForm implements DynaBean, Serializable

1 .ActionForm中比较常用的两个方法是reset()和validator():

// 恢复ActionForm属性的默认值,如把boolean型设为true/false,字符串设为null。
public void reset( ActionMapping mapping, HttpServletRequest request ) { }
// validate 只检查数据格式和语法,不检查数据是否符合业务逻辑。
public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }

这两个方法的默认实现是不执行任何操作,我们可以重写这两个方法来实现相关逻辑。

注: 对于每个request,控制器都会先调用ActionForm的reset()方法,然后表单数据组装到ActionForm中。如 ActionForm在request范围内,那么对于每个新的request请求都会创建新的ActionForm实例。新实例创建后,如果它的属性已 经被初始化为默认值,那么接着再在reset()方法中把属性设为默认值不是很有必要,这时可以让reset()方法为空。
对于session范围内的ActionForm,同一ActionForm实例会被多个请求共享,reset()方法在这种情况下极为有用。

2 .其中,ActionForm需要我们创建一个formbean类继承ActionForm,在ActionForm中可以定义一些property和get/set方法。

ActionForm 的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,这时可以使用Map对象来封装整个查询表单提交的数据,如下:

public class MapForm extends ActionForm {
    private Map map = null;
    public void setMap(Map map) {
        this.map = map;
    }
    public Map getMap() {
        return this.map;
    }
    // 增加查询条件(property)的get/set方法,并把数据放到Map中
    public void setAttribute(String attributeKey, Object attributeValue) {
        map.put(attributeKey, attributeValue);
    }
    public Object getAttribute(String attributeKey) {
        Object keyValue = map.get(attributeKey);
        return keyValue;
    }
}

在页面上可以通过
<html:text property="attribute(id)"/>
来获取表单数据,这会调用getAttribute("id")方法。

3 .其中,Dyna开头的动态ActionForm不需要创建具体的ActionForm类,只需通过Struts的配置文件就可以完成ActionForm的全部配置,如:
<form-bean name="optionsForm" type="org.apache.struts.action.DynaActionForm">
    <form-property name="fruit1" type="java.lang.String" initial="Pear" />
    <form-property name="fruit2" type="java.lang.String" initial="Apple" />
</form-bean>

4 .其中,含有validator的ActionForm用来进行表单验证,验证方法有两种。

① 在struts-config.xml中设置action的validate属性为"true"(默认为"true"),并且在相应的formbean中重写其中的validate方法,在validate方法中实现自己的数据验证逻辑。

② 通过validation框架进行验证,这分为三步:

⑴ 在struts-config.xml中配置validation插件,
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
                  value="/org/apache/struts/validator/validator-rules.xml,
                         /WEB-INF/validation.xml" />
</plug-in>
⑵ 配置formbean,有下面两种方法:
a. 使自己的formbean类继承含有validator的ActionForm,并配置struts-config.xml文件.
b. 使自己的formbean类继承含有validator的DynaValidatorForm

⑶ 配置validation.xml文件:
<formset>
    <form name="userForm">
        <field property="userName" depends="required">
            <arg key="userForm.userName" />
        </field>
    </form>
</formset>
注:注意 validation.xml文件中的userForm是struts-config.xml文件中formbean的名字。

关于arg的几个属性如下:

bundle :指定资源文件名,如不指定,则从默认资源文件中读取
key :从资源文件 ActionResources.properties 中得到的值
resource :key所指定的信息是否来自外部的资源文件,默认为true。如果为true,则代表key为buddle属性所指定的资源文件中的key。
position ,这个arg中的值用来替换信息中的哪一部分, 需要替换的部分以{n}标志。

5、关于ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别

对于一个actionform,可以被多个action所使用,而每个action可能需要的验证字段都不一样,而validation.xml中配置的验证方式(如<form name="userForm">)是对这个formbean进行的。
若name为struts-config.xml文件中action的path路径,则是对该action进行验证。

查看struts源码,可以很清楚的看到ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别

ValidatorForm 中的方法
@return validation key - the form element's name in this case
public String getValidationKey(ActionMapping mapping,
        HttpServletRequest request) {
        return mapping.getAttribute(); // 返回formbean的名字
}

ValidatorActionForm 中的方法
@return validation key - the action element's 'path' attribute in this * case
public String getValidationKey(ActionMapping mapping,
        HttpServletRequest request) {
        return mapping.getPath(); // 返回action的路径
}


7 .上面的验证是在服务器端进行,如需要在客户端进行js验证,需要在页面上配置:

① <html:form action="/ createUser" οnsubmit="return validateUserForm(this);">
格式为 return validate + formbean名称(首字母大写) + (this)用来在提交本页面时执行相应的js验证代码。

② 用来生成本页面的 js 验证代码。 有两种方法:

⑴ 在页面上声明
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="true"/>
因为dynamicJavascript/staticJavascript在JavascriptValidatorTag.java中默认为true,所以上面也可以直接写:<html:javascript formName="userForm"/>

注:在客户端执行的js验证如果不通过,会alert出对话框进行提示,服务器端的验证(在页面上可以用<html:errors/>来显示出错信息)就不会执行。
注意只有dynamicJavascript="true" + staticJavascript="true" 才能生成完整的 js 验证代码 ,如果把任何一个设为"false"提交页面时都会产生js错误,除非我们采用下面⑵的方法进行声明。

⑵ 在本页面上声明
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="false"/
<script language="Javascript1.1" src="staticJavascript.jsp"/></script>

定义staticJavascript.jsp的内容为
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>

注:dynamicJavascript 表示是否在页面内生成动态的js,staticJavascript属性代表是否在页面内生成静态js。 如staticJavascript设为"true",则validator-rules.xml文件中的规则检查生成的js代码都会生成到本页面内。这 样本页面会越来越大,一般最好是将staticJavascript设为"false", 将validator-rules.xml生成的js代码填充到一个指定的jsp页面(staticJavascript.jsp)中去。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值