Struts服务端验证

对客户端的数据进行验证有两种方式:
    一种是客户端验证,一种是服务端验证。对于客户端验证主要有javascript,但这种验证有可能被禁用或绕过,所以有必要对数据进行
    服务端验证:


第一种方式:(自定义ActionErrors对象)

    ①在Action里面做验证:
  
        
         【第1步】
         ==Action中的execute方法==
 
          public ActionForward execute(ActionMapping actionMapping,
                               ActionForm actionForm,
                               HttpServletRequest servletRequest,
                               HttpServletResponse servletResponse)
          {
              UserActionForm userActionForm = (UserActionForm) actionForm;
              String username = userActionForm.getUserName();//从ActionForm中获取姓名
              String password = userActionForm.getPassword();//从ActionForm中获取密码
           
              if(username.equals("")||password.equals(""))//判断用户名是否为空或者密码是否为空
              {
                  ActionErrors errors=new ActionErrors();//创建错误集合对象
                  errors.add("error_key",new ActionError("errores"));//★★创建错误对象放入集合中,"error_key"是键值,表明
                                                               //错误对象要在页面输出的键。new ActionError("error2")是个错误
                                                               //对象,"error2"是资源文件(属性文件)中的键值
                  this.saveErrors(servletRequest,errors);//★★将错误集合放入request里面
                 
                  // return new ActionForward(actionMapping.getInput());//★★通过ActionForward类跳转,这里跳转到struts-config.xml
                                                                        //配置文件中配置好的页面 :<action input="/error2.jsp"/>
                  return actionMapping.findForward("error");//★★跳转到"error"映射的页面<forward name="error" path="/error.jsp" />
              }
              else//表示验证通过,继续执行下面的语句
              {
                  ...   ... 
              }
           }

         说明:上面有两种跳转,都是可行的。另外this.saveErrors(servletRequest,errors);是将错误集合放入Request,这一步是必须的
                
 
          【第2步】
         ==struts-config.xml==

           <struts-config>
             <form-beans>
                 ...  ...  ...
             </form-beans>

             <action-mappings>
               <action input="/error2.jsp" ...  ...">★1
                 <forward name="error" path="/error.jsp" />★2
               </action>
             </action-mappings>
             <message-resources parameter="ApplicationResources" />★3
           </struts-config>


          说明:
              ★1:这里设置了input属性为error2.jsp,表示当在Action中用return new ActionForward(actionMapping.getInput())方式
                   跳转时将调转到error2.jsp
              ★2:这是跳转页面的映射关系,表示当在Action中用return actionMapping.findForward("error")方式
                   跳转时将调转到error.jsp
              ★3:这个配置很重要,表示错误对应的资源文件是src/ApplicationResources.properties属性文件
                   
 
          【第3步】
         ==ApplicationResources.properties==

         errores= UserName or password is Required
         error2=You name or password is not right

         说明:
             属性文件都是以键值对的方式存储,其中键值对应程序中的错误参数例如,上面的程序中的
             errors.add("error_key",new ActionError("errores"))。就是将属性文件中对应的键值为errores的信息对应到"error_key"
             错误对象中,页面将错误打印到页面的时候就将显示  "UserName or password is Required".
                   
 
          【第4步】
         ==error.jsp==

         <html:errors property="error_key"/>

         说明:
            这里用的是Struts标签,输出错误信息。property参数将会找到errors集合中对应的键值的错误对象,并将错误打印出来


    程序流程:
      首先是有属性文件ApplicationResources.properties,属性文件中存储所有的错误提示信息。通过struts-config.xml配置,将属性
      文件加载为资源文件,配置如下<message-resources parameter="ApplicationResources" />,在程序中对客户端提交的数据进行验证
      当验证没有通过的时候,将产生错误对象,并将错误对象添加到错误集合中
      ActionErrors errors=new ActionErrors();
      errors.add("error_key",new ActionError("errores"));
      "error_key"为添加到错误集合中的错误对象的键值, "errores"为属性文件中错误提示信息的键值。
      在把错误集合添加到Request里面
      this.saveErrors(servletRequest,errors);
      最后通过Struts标签,把错误信息打印出来
      <html:errors property="error_key"/>
      在显示错误信息时,程序会通过property属性去错误集合中找键值为"error_key"的错误对象,找到错误对象后,又通过错误对象的
      "errores"参数去属性文件中的找匹配的错误提示信息,最后将相对应的错误信息打印出来。

      最后,如果数据没通过验证,页面将输出:UserName or password is Required
 

 

    ===================================================================
  

    ②在ActionForm里面做验证
    

       在ActionForm里面做验证与在Action里面做验证基本上相同,只是在做逻辑判断的位置不同而已,在ActionForm里面实现validate方法
    其他的步骤都一样。

    ==Action中的execute方法==

     public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest)
     {
         ActionErrors errors=new ActionErrors();
         if((userName==null)||(userName.equals("")))
         {
            errors.add(ActionErrors.GLOBAL_MESSAGE,new ActionError("error.name"));
            //errors.add("error_key",new ActionError("error.name"));
         }
         return errors;
     }

     注意:这里不需要指明验证不通过的话,将要跳转的页面,也不要将验证的错误集合放入Request里面,这是与上面验证不同的地方,
           当验证不通过的话,系统会自动跳转到<action input="/**.jsp" ...  ...">所指定的页面。
     说明:这里是验证用户名是否为空,如果为空的话,创建错误对象放入错误集合,最后将错误集合返回,注意,这里用的是错误常量
           来做错误键值,这样做的话,可以在页面输出错误信息时可以省略键值,例如:<html:errors />,这样做的话,会将所有错误
           信息全部打印出来,如果只要显示特定的错误信息,最好指定错误对象的键值。
 
     其他步骤都相同,故省略 ...  ...

    

 


========================================================================================

 

 


第二种方式:(使用Struts Validator验证框架)

 

1
【第1步】继承至ValidatorForm

FormAction应该为
import org.apache.struts.validator.ValidatorForm;
public class LoginForm extends ValidatorForm{
    ...  ...
    去掉validator() 和 reset()方法

}

==================================================

2
【第2步】创建validation.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration
    1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">

<form-validation>
<formset>
  <form name="loginForm">  
        <field property="userName" depends="minlength">
               <arg0 key="loginForm.userName"/>
               <arg1 key="${var:minlength}" name="minlength" resource="false"/>
           <var>
          <var-name>minlength</var-name>
          <var-value>6</var-value>
           </var>
     </field>
  </form>
</formset>
</form-validation>


说明:
  每一个表单验证都在<formset></formset>中配置验证信息。
     <form name="loginForm">表示要对具体哪个表单进行验证。
     name="loginForm"属性对应struts-config.xml的<action  name="loginForm" ... .../>配置

  而每一个表单中的表单数据都在<field></field>中配置验证信息。
     <field property="userName" depends="minlength">表示要对表单中的userName属性进行验证,验证的是长度验证,
     depends="minlength"对应validator-rules.xml中的配置(validator-rules.xml文件是Struts自带的)。
     <arg0  .../>是子标签,是给配置文件中的占位符在指定参数,下标是从0开始,
         属性说明:
             resource表示参数值是否从属性文件中取得,默认的情况下是true,当设置为true时,得在属性文件中设置相对应的键值对。
             key表示要传值的键值,如果resource设置为true时,键值为属性文件中的键值名,如果resource设置为false时,key对应的
             是validator-rules.xml文件中配置好的参数名,写法如上:<arg1 key="${var:minlength}" name="minlength" resource="false"/>
             name="minlength"对应validator-rules.xml文件中配置好的参数名。
           
     <var .../>也是子标签,是给validator-rules.xml文件中配置好的参数传具体的值,上面的配置是给最小的长度设置为6

  上面的这段的配置的内容如下:
     给对应于struts-config.xml配置文件中名称为:loginForm表单中的userName属性做验证,最小长度不能小于6,如果验证不通过,则
     跳转到struts-config.xml配置文件中的<action input="/***.jsp"/>页面。页面中显示的错误信息是属性文件中对应于
     validator-rules.xml中配置的<validator name="minlength" ...  .... msg="****key">键值

详细说明:
   下面介绍一下validation.xml配置文件的标签:
     <form-validation></form-validation>是总框架
     <formset></formset>是对Form里的数据进行配置
     <form name="ActionForm对应的名称"></form>对一个ActionForm里的数据进行验证配置
     <field property="ActionForm里的属性名" depends="验证规则,
                       可以是Validation-rules里定义好的也可以是自定义的验证规则">这里配置一个属性的验证内容
     <arg0 name="对应的验证规则名称" key="可以直接填入数值,也可填入变量表达式:
                       ${var:变量名}" resource="true/false"(代表是否从资源文件中读取信息,否则Key的值以参数的形式返回)>
     <var></var>定义一个变量的标签体,可以在里面具体设置变量的名称以及数值
     <var-name>对应Key里定义的变量名称</var-name>
     <var-value>值</var-value>
     <msg name="对应的验证规则名称" key="资源文件中定义的变量名称">这里定义了信息变量后,会默认定义的信息变量。
     在验证规则中大部分可以使用已经预定义好的规则,它们在validator-rules.xml里,当然我们自己也可以定义规则。
     其实,这个文件名可以是任意的,可以起成别的名字,比如:validators.xml,不过,
     也要相应修改struts-config.xml文件中的加入validator框架PlugIn中的value属性。
     这个value属性用来指定validator-rules文件和具体的验证文件。

 

==================================================

3
【第3步】配置struts-config.xml配置文件,插入插件,但服务启动时加载validator-rules.xml配置与validation.xml配置

==struts-config.xml==
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

==================================================

4
【第4步】在ApplicationResources.properties 属性文件中添加struts-config.xml已经定义好的错误信息

==ApplicationResources.properties==
errors.minlength={0} can not be less than {1} characters.

==================================================

5
【第4步】页面输出错误信息

在页面上添加
<html:errors property="username"/>

 

 

========================================================================================

 


第三种方式:(使用自定义Struts Validator验证框架)


1.
【第1步】在validator-rules.xml 文件中添加自定义的信息配置

  validator-rules.xml 这个文件包含了一组验证规则,对所有struts应用都适用。一般情况不用修改这个文件,除非要修改或扩展默认规则。
  例如添加的信息如下:


== validator-rules.xml ==
  <validator
        name="startsWith"
        classname="self.SelfValidator"
        method="validateStartsWith"
        methodParams="java.lang.Object,
                      org.apache.commons.validator.ValidatorAction,
                      org.apache.commons.validator.Field,
                      org.apache.struts.action.ActionErrors,
                      javax.servlet.http.HttpServletRequest"
        depends=""
        msg="errors.startsWith">
       <javascript> 
          ...  ...  ...
       </javascript>
  </validator>

  说明:
     通用的验证规则都在<validator>标签内配置,他有7个属性:
     Name属性:name属性指定验证规则的逻辑名,这个名字必须是唯一的。
     Classname和method属性:classname和method属性分别指定实现验证规则逻辑的类和方法。
     MethodParams:属性用来指定验证方法包含的参数,多个参数之间以逗号隔开(这些参数类型是固定的)。
     Msg属性:msg属性指定来自于Resource Bundle中的消息key。当验证失败时,
              Validator框架将根据这个消息key到resource Bundle中查找匹配的消息文本,对应属性文件中错误消息的键值。
     Depends属性:depends属性指定在调用当前验证规则之前必须先调用的其他验证规则。

 

2.
【第2步】在ApplicationResources.properties属性文件中添加对应的错误信息
   
== ApplicationResources.properties ==
  errors.startsWith = BAD STARTS ! SHOULD BE 'Mr.' !

  说明:这里的键值对应validator-rules.xml配置中的Msg属性


3.
【第3步】在validation.xml文件中对表单进行具体的验证

== validation.xml ==
<form-validation >

  <formset>
       <form name="userActionForm">
        <field property="userName" depends="startsWith">★
           </field>
       </form>
  </formset>

</form-validation>

  说明:这里是对userActionForm表单中的userName进行验证,depends属性对应validator-rules.xml配置好的逻辑名,表示,验证的规则
        对应validator-rules.xml中逻辑名为"startsWith"的配置信息。


4.
【第4步】编写自定义的类对数据进行验证,但类名与方法名必须对应validator-rules.xml中的Classname和method属性

 //自定义验证类
package self;

import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;

public class SelfValidator {
    //验证方法。Object指FormBean,封装要验证的字段;
    //ValidatorAction封装validator-rules.xml中此项验证的<validator>定义;
    //Field封装validation.xml中要验证字段的<field>定义;
    //ActionErrors用于存放错误
    public static boolean validateStartsWith (Object formBean,
                                              ValidatorAction action,
                                              Field field,
                                              ActionErrors errors,
                                              HttpServletRequest request) {
        //从FormBean中取字段的值,field.getProperty()可获得字段名
        String value = ValidatorUtil.getValueAsString(formBean,field.getProperty());
        //验证。。。
        if(value.startsWith("Mr."))★★//自定义验证规则,这里是验证要验证的字符串是否是以"Mr."开头的。
        {
           return true;
        }else {
            //添加错误
            errors.add(field.getKey(),Resources.getActionError(request,action,field));
            return false;
        }

    }
}

  
说明:
   这个类的写法是通用的,唯一要变的话,就是在验证规则这里做改变

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值