现在的位置: 首页 > 综合 > 正文

struts Validator 框架和 ActionForm得介绍

2013年03月09日 ⁄ 综合 ⁄ 共 15554字 ⁄ 字号 评论关闭

struts Validator 框架和 ActionForm

1.Validator 框架和 ActionForm
Validator 框架不能用于验证标准的 ActionForm 类。如果要使用Validator 框架,应该采用 ActionForm

1.Validator 框架和 ActionForm
Validator 框架不能用于验证标准的 ActionForm 类。如果要使用Validator 框架,应该采用 ActionForm 类的两个子类:DynaValidatorForm 和 ValidatorForm。其中前者支持在动态 ActionForm 中使用 Validator 框架。
DynaValidatorForm 和 ValidatorForm也都实现了 validate() 方法,在validate()方法中调用验证框架的验证方法进行验证,如果验证失败,就会返回包含错误消息的 ActionErrors 对象。所以在 JSP 中可以使用<html:errors> 对象向用户显示 validator 框架生成的验证错误消息

2.“客户端验证”
Validator 框架也可以进行浏览器客户端验证,这只需要用到 Struts 的<html:javascript>标签,它能够在 JSP 页面中自动生成用于客户端验证的 Javascript 脚本。
在 Jsp 文件中添加<html:javascript>标签,以便生成JavaScript校验代码,具体内容如下:
  <html:javascript formName = “xxx”>
  formName 属性代表了将要校验的 Form 的名称,这个跟 validation.xml 文件中的 <form> 元素的 name 属性一致
修改<html:form>标签,添加 onsubmit 事件.事件访问的方法如下:
  validateXXX(),期中 XXX 代表 Action 对应的 Form 的名称,这个名称要跟formName 的属性值保持一致. 例如:
    <html:javascript formName="loginActionForm"/>
       <html:form action="loginAction" onsubmit="return 
                                  validateLoginActionForm(this);">

3.使用常数
在有的表单验证中,可能会对不同的字段实施相同的正则表达式验证,为了避免重复定义,可以将正则表达式声明为一个常数。两种选择:
定义一个全局常量
定义单个<formset>中的每个字段
可以使用 ${contant-name} 来引用

4.使用 validwhen

validwhen 验证器:当一个字段的验证取决于另一个字段的时候,通过 validwhen 可以公式化复杂的依赖关系。
validwhen 需要声明一个叫test的var字段,这个变量的值是一个布尔型的表达式,value部分要用()括起来
当布尔型表达式返回true时,验证才会成功
字面量 *this* 表示当前被验证的表单
逻辑运算符为 and 和 or 

5.DispatcherAction 类

DispatcherAction:能够在同一个 Action 类中完成一组相关的业务操作,以达到减少重复编程,使程序更加便于维护。
创建一个扩展 DispatchAction 类的子类,不必覆盖 excute() 方法,而是创建一些实现业务逻辑的方法,这些业务逻辑方法都应该和 excute() 方法具有相同的方法签名,即它们的参数和返回类型都应该相同,此外也应该声明抛出Exception 异常.
在配置 DispatchAction 类时,需要把 parameter 属性的值设置为”method”.
把 parameter 的属性配置为”method”后,当用户请求访问 DispatchAction 时,应该提供 method 请求参数.例如:
  http://localhost:9090/test/test?method=add
<action>的parameter属性:指定 Action 的配置参数。在Action类的 excute() 方法中,可以调用 ActionMapping 对象的 getParameter() 方法来读取配置参数

6.LookupDispatchAction 类

LookupDispatchAction 类:DispatcherAction 的子类,在该类中可以定义多个业务方法,适用于一个表单中有多个提交按钮,且这些按钮又都有一个共同名字的场合。
它与DispatchAction类的作用差不多,唯一不同的是:这个类是通过资源包中的key作为请求参数来进行对方法的映射,而DispatchAction是通过请求参数来选择方法.
LookupDispatchAction的用法:
用MessageResource将按钮的文本和ResKey相关联
在Action配置中一个parametr属性,属性值与submit按钮的property属性值相同,这个属性可以指定执行LookupDispatchAction中对应的方法 

继承LookupDispatchAction,重写getKeyMethodMap()方法, 将ResKey和MethodName对应起来
DispatchAction 类使用请求参数的值确定调用哪种方法,而LookupDispatchAction类利用请求参数值,反向查询资源绑定,并将它与类中的一种方法匹配,这两种方法有异曲同工之妙。

7.MappingDispatchAction 类

该类是 DispatchAction的子类,用于将相关的请求组织到一个Action之中。
MappingDispatchAction的用法:
将一个 MappingDispatchAction 类根据不同的请求进行多次声明,其中path属性因请求的不同而不同,并为每个 action 添加 parameter 属性来指定相同 Action 类处理不同请求的方法名
创建一个扩展 MappingDispatchAction 类的子类,不必覆盖 excute() 方法,而是创建一些实现业务逻辑的方法,这些业务逻辑方法都应该和 excute() 方法具有相同的方法签名,即它们的参数和返回类型都应该相同,此外也应该声明抛出Exception 异常.
与DispatcherAction的区别:
MappingDispatcherAction:当想要为相同的Action定义多个表单操作处理器的时候,使用它
DispatcherAction:如果基于某种理由不想要定义多个表单操作处理器的时候,使用它

8.使用动态ActionForm

在Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据. 用户可以选择的覆盖两个方法:reset()和validate().

ActionForm的唯一缺点是必需以编程的方式创建大量的ActionForm类,如果HTML表单字段发生变化,就必须修改并编译相关的 ActionForm类。Struts1.1对此进行了改进,引入了动态ActionForm类的概念,Struts框架的DynaActionForm 类及其子类实现了动态ActionForm,该类是ActionForm类的子类。

9.使用动态ActionForm
1、配置动态ActionForm
?动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,没有必要编写额外的程序创建具体的ActionForm 类,配置动态ActionForm的方法为:在Struts配置文件中配置一个<form-bean>元素,将type属性设置为 DynaActionForm或它的某个子类的全名.

10.使用动态ActionForm

?    <form-bean>的<form-property>子元素用来设置动态ActionForm的属性,<form- property>元素的name属性指定属性名,type指定属性类型,可以把动态的ActionForm的属性设置为以下Java类型:
java.lang.BigDecimal       java.lang.BigInteger
java.lang.Boolean          java.lang.Byte
java.lang.Character        java.lang.Class
java.lang.Double           java.lang.Float
java.lang.Integer          java.lang.Long
java.lang.Short            java.lang.String
java.sql.Date              java.sql.Time
java.sql.Timestamp

11.使用动态ActionForm

    如果表单的字段值为Java基本类型,在配置时应该用相应的包装类型来代替,比如:int类型的包装类型为Integer:
???? <form-property
???????????????initial="0"
?????????????? name="age"
?????????????? type="java.lang.Integer"/>

2、访问动态ActionForm
?   Action类和JSP都可以访问动态ActionForm,使用方法与标准ActionForm大致相同,如果使用标准的ActionForm对象,在标准的ActionForm中针对每个属性都提供了get/set方法,来读取或设置属性。
?   而DynaActionForm把所有的属性保存在一个Map类对象中,并提供了下面的用于访问所有属性的通用方法:
???  public Object get(String name);
???  public void set(String name,Object value);
??  get(String name)方法根据指定的属性名返回属性值;set(String name,Object value)方法用于为给定的属性赋值。例如,如果访问DynaActionForm类中的email属性,可以采用:
?? //get email
?? String email = (String)form.get("email");
?? //?set email
? form.set("email", "example@hisoft.com");
3、动态ActionForm的表单验证
?   DynaActionForm基类的validate()方法没有提供任何默认的验证行为,可以定义扩展的DynaActionForm的子类,然后覆盖 validate()方法,但是以编程的方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初衷,即以配置来代替编程,可以采用另一种验证机制,即Validator框架来完成验证,该框架允许采用特定的配置文件来为动态的ActionForm配置验证规则。
使用action的俩种方式对比:
jsp文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h4>DispatchAction</h4>
   <html:link action="stumg?method=stusave">添加一个学生信息</html:link><br><br>
   <html:link action="stumg?method=studel">删除一个学生信息</html:link> <br><br>
   <html:link action="stumg?method=stuupdate">修改一个学生信息</html:link><br><br>
   <html:link action="stumg?method=stuquery">查询一个学生信息</html:link><br><br>
  
   <br><br><br>
   <h4>MappingDispatChAction</h4>
   <html:link action="stusave">添加一个学生信息</html:link><br><br>
   <html:link action="studel">删除一个学生信息</html:link><br><br>
   <html:link action="stuupdate">修改一个学生信息</html:link><br><br>
   <html:link action="stuquery">查询一个学生信息</html:link><br><br>
</body>
</html>
MappingDispatchAction。java
public class StudentMgAction_ extends MappingDispatchAction {

    public ActionForward stuquery(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("查询学生信息......");
        return null;
       
    }
    public ActionForward stuupdate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("更新学生信息......");
        return null;
    }
   
    public ActionForward studel(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("删除学生信息......");
        return null;
    }
    public ActionForward stusave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("保存查询学生信息......");
        return null;
    }
}
DispatchAction。java
public class StudentMgAction extends DispatchAction {

    public ActionForward stuquery(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("查询学生信息......");
        return null;
       
    }
    public ActionForward stuupdate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("更新学生信息......");
        return null;
    }
   
    public ActionForward studel(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("删除学生信息......");
        return null;
    }
    public ActionForward stusave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("保存查询学生信息......");
        return null;
    }
}
struts-congig.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
 <action-mappings>
  <action path="/stumg"
      type="cn.itcast.struts.StudentMgAction"
      parameter="method">
      </action>
     
     
     
    <action path="/stusave"
            type="cn.itcast.struts.StudentMgAction_"
            parameter="stusave">
            </action> 
           
             <action path="/studel"
      type="cn.itcast.struts.StudentMgAction_"
      parameter="studel">
      </action>
    <action path="/stuupdate"
            type="cn.itcast.struts.StudentMgAction_"
            parameter="stuupdate">
            </action> 
           
             <action path="/stuquery"
      type="cn.itcast.struts.StudentMgAction_"
      parameter="stuquery">
      </action>
  
 </action-mappings>
</struts-config>

:DynaValidatorForm 和 ValidatorForm。其中前者支持在动态 ActionForm 中使用 Validator 框架。
DynaValidatorForm 和 ValidatorForm也都实现了 validate() 方法,在validate()方法中调用验证框架的验证方法进行验证,如果验证失败,就会返回包含错误消息的 ActionErrors 对象。所以在 JSP 中可以使用<html:errors> 对象向用户显示 validator 框架生成的验证错误消息

2.“客户端验证”
Validator 框架也可以进行浏览器客户端验证,这只需要用到 Struts 的<html:javascript>标签,它能够在 JSP 页面中自动生成用于客户端验证的 Javascript 脚本。
在 Jsp 文件中添加<html:javascript>标签,以便生成JavaScript校验代码,具体内容如下:
  <html:javascript formName = “xxx”>
  formName 属性代表了将要校验的 Form 的名称,这个跟 validation.xml 文件中的 <form> 元素的 name 属性一致
修改<html:form>标签,添加 onsubmit 事件.事件访问的方法如下:
  validateXXX(),期中 XXX 代表 Action 对应的 Form 的名称,这个名称要跟formName 的属性值保持一致. 例如:
    <html:javascript formName="loginActionForm"/>
       <html:form action="loginAction" onsubmit="return 
                                  validateLoginActionForm(this);">

3.使用常数
在有的表单验证中,可能会对不同的字段实施相同的正则表达式验证,为了避免重复定义,可以将正则表达式声明为一个常数。两种选择:
定义一个全局常量
定义单个<formset>中的每个字段
可以使用 ${contant-name} 来引用

4.使用 validwhen

validwhen 验证器:当一个字段的验证取决于另一个字段的时候,通过 validwhen 可以公式化复杂的依赖关系。
validwhen 需要声明一个叫test的var字段,这个变量的值是一个布尔型的表达式,value部分要用()括起来
当布尔型表达式返回true时,验证才会成功
字面量 *this* 表示当前被验证的表单
逻辑运算符为 and 和 or 

5.DispatcherAction 类

DispatcherAction:能够在同一个 Action 类中完成一组相关的业务操作,以达到减少重复编程,使程序更加便于维护。
创建一个扩展 DispatchAction 类的子类,不必覆盖 excute() 方法,而是创建一些实现业务逻辑的方法,这些业务逻辑方法都应该和 excute() 方法具有相同的方法签名,即它们的参数和返回类型都应该相同,此外也应该声明抛出Exception 异常.
在配置 DispatchAction 类时,需要把 parameter 属性的值设置为”method”.
把 parameter 的属性配置为”method”后,当用户请求访问 DispatchAction 时,应该提供 method 请求参数.例如:
  http://localhost:9090/test/test?method=add
<action>的parameter属性:指定 Action 的配置参数。在Action类的 excute() 方法中,可以调用 ActionMapping 对象的 getParameter() 方法来读取配置参数

6.LookupDispatchAction 类

LookupDispatchAction 类:DispatcherAction 的子类,在该类中可以定义多个业务方法,适用于一个表单中有多个提交按钮,且这些按钮又都有一个共同名字的场合。
它与DispatchAction类的作用差不多,唯一不同的是:这个类是通过资源包中的key作为请求参数来进行对方法的映射,而DispatchAction是通过请求参数来选择方法.
LookupDispatchAction的用法:
用MessageResource将按钮的文本和ResKey相关联
在Action配置中一个parametr属性,属性值与submit按钮的property属性值相同,这个属性可以指定执行LookupDispatchAction中对应的方法 

继承LookupDispatchAction,重写getKeyMethodMap()方法, 将ResKey和MethodName对应起来
DispatchAction 类使用请求参数的值确定调用哪种方法,而LookupDispatchAction类利用请求参数值,反向查询资源绑定,并将它与类中的一种方法匹配,这两种方法有异曲同工之妙。

7.MappingDispatchAction 类

该类是 DispatchAction的子类,用于将相关的请求组织到一个Action之中。
MappingDispatchAction的用法:
将一个 MappingDispatchAction 类根据不同的请求进行多次声明,其中path属性因请求的不同而不同,并为每个 action 添加 parameter 属性来指定相同 Action 类处理不同请求的方法名
创建一个扩展 MappingDispatchAction 类的子类,不必覆盖 excute() 方法,而是创建一些实现业务逻辑的方法,这些业务逻辑方法都应该和 excute() 方法具有相同的方法签名,即它们的参数和返回类型都应该相同,此外也应该声明抛出Exception 异常.
与DispatcherAction的区别:
MappingDispatcherAction:当想要为相同的Action定义多个表单操作处理器的时候,使用它
DispatcherAction:如果基于某种理由不想要定义多个表单操作处理器的时候,使用它

8.使用动态ActionForm

在Struts框架中,ActionForm对象用来包装HTML表单数据,并能动态返回用于显示给用户的数据. 用户可以选择的覆盖两个方法:reset()和validate().

ActionForm的唯一缺点是必需以编程的方式创建大量的ActionForm类,如果HTML表单字段发生变化,就必须修改并编译相关的ActionForm类。Struts1.1对此进行了改进,引入了动态ActionForm类的概念,Struts框架的DynaActionForm类及其子类实现了动态ActionForm,该类是ActionForm类的子类。

9.使用动态ActionForm
1、配置动态ActionForm
?动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,没有必要编写额外的程序创建具体的ActionForm类,配置动态ActionForm的方法为:在Struts配置文件中配置一个<form-bean>元素,将type属性设置为DynaActionForm或它的某个子类的全名.

10.使用动态ActionForm

?    <form-bean>的<form-property>子元素用来设置动态ActionForm的属性,<form-property>元素的name属性指定属性名,type指定属性类型,可以把动态的ActionForm的属性设置为以下Java类型:
java.lang.BigDecimal       java.lang.BigInteger
java.lang.Boolean          java.lang.Byte
java.lang.Character        java.lang.Class
java.lang.Double           java.lang.Float
java.lang.Integer          java.lang.Long
java.lang.Short            java.lang.String
java.sql.Date              java.sql.Time
java.sql.Timestamp

11.使用动态ActionForm

    如果表单的字段值为Java基本类型,在配置时应该用相应的包装类型来代替,比如:int类型的包装类型为Integer:
???? <form-property
???????????????initial="0"
?????????????? name="age"
?????????????? type="java.lang.Integer"/>

2、访问动态ActionForm
?   Action类和JSP都可以访问动态ActionForm,使用方法与标准ActionForm大致相同,如果使用标准的ActionForm对象,在标准的ActionForm中针对每个属性都提供了get/set方法,来读取或设置属性。
?   而DynaActionForm把所有的属性保存在一个Map类对象中,并提供了下面的用于访问所有属性的通用方法:
???  public Object get(String name);
???  public void set(String name,Object value);
??  get(String name)方法根据指定的属性名返回属性值;set(String name,Object value)方法用于为给定的属性赋值。例如,如果访问DynaActionForm类中的email属性,可以采用:
?? //get email
?? String email = (String)form.get("email");
?? //?set email
? form.set("email", "example@hisoft.com");
3、动态ActionForm的表单验证
?   DynaActionForm基类的validate()方法没有提供任何默认的验证行为,可以定义扩展的DynaActionForm的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm违背了Struts框架提供动态ActionForm的初衷,即以配置来代替编程,可以采用另一种验证机制,即Validator框架来完成验证,该框架允许采用特定的配置文件来为动态的ActionForm配置验证规则。
使用action的俩种方式对比:
jsp文件
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
   <h4>DispatchAction</h4>
   <html:link action="stumg?method=stusave">添加一个学生信息</html:link><br><br>
   <html:link action="stumg?method=studel">删除一个学生信息</html:link> <br><br>
   <html:link action="stumg?method=stuupdate">修改一个学生信息</html:link><br><br>
   <html:link action="stumg?method=stuquery">查询一个学生信息</html:link><br><br>
  
   <br><br><br>
   <h4>MappingDispatChAction</h4>
   <html:link action="stusave">添加一个学生信息</html:link><br><br>
   <html:link action="studel">删除一个学生信息</html:link><br><br>
   <html:link action="stuupdate">修改一个学生信息</html:link><br><br>
   <html:link action="stuquery">查询一个学生信息</html:link><br><br>
</body>
</html>
MappingDispatchAction。java
public class StudentMgAction_ extends MappingDispatchAction {

    public ActionForward stuquery(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("查询学生信息......");
        return null;
       
    }
    public ActionForward stuupdate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("更新学生信息......");
        return null;
    }
   
    public ActionForward studel(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("删除学生信息......");
        return null;
    }
    public ActionForward stusave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("保存查询学生信息......");
        return null;
    }
}
DispatchAction。java
public class StudentMgAction extends DispatchAction {

    public ActionForward stuquery(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("查询学生信息......");
        return null;
       
    }
    public ActionForward stuupdate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("更新学生信息......");
        return null;
    }
   
    public ActionForward studel(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("删除学生信息......");
        return null;
    }
    public ActionForward stusave(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response){
        System.out.println("保存查询学生信息......");
        return null;
    }
}
struts-congig.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
 <action-mappings>
  <action path="/stumg"
      type="cn.itcast.struts.StudentMgAction"
      parameter="method">
      </action>
     
     
     
    <action path="/stusave"
            type="cn.itcast.struts.StudentMgAction_"
            parameter="stusave">
            </action> 
           
             <action path="/studel"
      type="cn.itcast.struts.StudentMgAction_"
      parameter="studel">
      </action>
    <action path="/stuupdate"
            type="cn.itcast.struts.StudentMgAction_"
            parameter="stuupdate">
            </action> 
           
             <action path="/stuquery"
      type="cn.itcast.struts.StudentMgAction_"
      parameter="stuquery">
      </action>
  
 </action-mappings>
</struts-config>

抱歉!评论已关闭.