首页  ·  知识 ·  编程语言
Struts验证框架详细介绍
网友  收集  Java  编辑:德仔   图片来源:网络
引言 数据校验也称为输入校验,指导对用户的输入进行基本的过滤,包括必填的字段,字段必
引言
     数据校验也称为输入校验,指导对用户的输入进行基本的过滤,包括必填的字段,字段必须为数字及两次输入的密码必须匹配等。本文重点介绍了struts的校验框架。
1、struts的数据校验大致有如下几种方式:
  
  1. ActionForm的代码校验
  2. Action里的代码校验
  3. 结合commons-validator.jar的校验

1.1 ActionForm的代码校验
   ActionForm的代码校验是最基本的校验方式。这种校验方式是重写ActionForm的validate方法,在该方法内对所有的字段进行基本的校验。如果出现不符合要求的输出,则将出错提示封装在ActionError对象里,最后将多个ActionError组合成ActionErrors对象,给对象里封装了全部的出错信息。
    以登陆页面为例,下面是重写了Validate方法的ActionForm的代码:

Java代码

  1. import javax.servlet.http.HttpServletRequest;    
  2.   
  3. import org.apache.struts.action.ActionError;    
  4. import org.apache.struts.action.ActionErrors;    
  5. import org.apache.struts.action.ActionForm;    
  6. import org.apache.struts.action.ActionMapping;    
  7.   
  8. public class LoginActionForm extends ActionForm {    
  9.         
  10.     private static final long serialVersionUID = 1L;    
  11.     private String username;    
  12.     private String password;    
  13.         
  14.     public String getUsername() {    
  15.         return username;    
  16.     }    
  17.     public void setUsername(String username) {    
  18.         this.username = username;    
  19.     }    
  20.     public String getPassword() {    
  21.         return password;    
  22.     }    
  23.     public void setPassword(String password) {    
  24.         this.password = password;    
  25.     }    
  26.         
  27.     //重写validate方法,完成数据校验    
  28.     @SuppressWarnings("deprecation")    
  29.     @Override    
  30.     public ActionErrors validate(ActionMapping mapping,    
  31.             HttpServletRequest request) {    
  32.         //ActionErrors用于包装所有的出错信息    
  33.         ActionErrors  errors = new ActionErrors();    
  34.         //如果用户名为空    
  35.         if((username == null)||(username.equals(""))) {    
  36.             //error.username对应资源文件中的key,用户名是对应资源文件的第一个参数    
  37.             errors.add("username", new ActionError("error.username","用户名"));    
  38.         }    
  39.         //如果密码为空    
  40.         if((password == null )||(password.equals(""))) {    
  41.             errors.add("password", new ActionError("error.password","密码"));    
  42.         }    
  43.         //返回封装了所有的出错信息    
  44.         return errors;    
  45.     }    
  46. }  

import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionError;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;public class LoginActionForm extends ActionForm { private static final long serialVersionUID = 1L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } //重写validate方法,完成数据校验 @SuppressWarnings("deprecation") @Override public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { //ActionErrors用于包装所有的出错信息 ActionErrors errors = new ActionErrors(); //如果用户名为空 if((username == null)||(username.equals(""))) { //error.username对应资源文件中的key,用户名是对应资源文件的第一个参数 errors.add("username", new ActionError("error.username","用户名")); } //如果密码为空 if((password == null )||(password.equals(""))) { errors.add("password", new ActionError("error.password","密码")); } //返回封装了所有的出错信息 return errors; }}
在JSP页面中值需要更改一处即可****之间的部分:
Jsp代码

  1. <%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%>    
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
  3. <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>      
  4. <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>      
  5. <html>    
  6.   <head>    
  7.     <!-- 使用国际化资源文件的key输出标题 -->    
  8.     <title><bean:message key="login"/></title>    
  9.   </head>    
  10.   <!-- 下面的标签用于输出出错信息 -->    
  11.   <!-- *******************************************-->    
  12.   <html:errors/>    
  13.   <!-- ******************************************* -->    
  14.   <body>    
  15.     <font color="red">    
  16.     <%    
  17.     //用于输出出错信息,出错信息保存在request的err属性中    
  18.         if(request.getAttribute("err")!=null) {    
  19.             out.println(request.getAttribute("err"));    
  20.         }    
  21.     %>    
  22.     </font>    
  23.     <br><br>    
  24.     <!-- 下面是登陆表单 -->    
  25.     请输入用户名和密码:<hr>    
  26.         <html:form action="login.do" method="post">    
  27.             <bean:message key="username" />:<html:text property="username" />    
  28.             <br>    
  29.             <bean:message key="password" />:<html:text property="password" />    
  30.             <br>    
  31.             <html:submit>    
  32.                 <bean:message key="login"/>    
  33.             </html:submit>    
  34.             <br>    
  35.         </html:form>    
  36.     </body>    
  37. </html>  

<%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <html> <head> <!-- 使用国际化资源文件的key输出标题 --> <title><bean:message key="login"/></title> </head> <!-- 下面的标签用于输出出错信息 --> <!-- *******************************************--> <html:errors/> <!-- ******************************************* --> <body> <font color="red"> <% //用于输出出错信息,出错信息保存在request的err属性中 if(request.getAttribute("err")!=null) { out.println(request.getAttribute("err")); } %> </font> <br><br> <!-- 下面是登陆表单 --> 请输入用户名和密码:<hr> <html:form action="login.do" method="post"> <bean:message key="username" />:<html:text property="username" /> <br> <bean:message key="password" />:<html:text property="password" /> <br> <html:submit> <bean:message key="login"/> </html:submit> <br> </html:form> </body></html>
由于在本项目中用到了资源文件,因为有了资源文件的支持,JSP页面只需要简单的<html:errors/>标签就可以生成全部的出错信息,下面是资源文件:
资源文件代码

  1. # -- standard errors --    
  2. username=用户名    
  3. password=密码    
  4. login=登陆    
  5. noname=请输入用户名,然后在登陆    
  6. nopassword=请输入密码,然后在登陆    
  7. #html:errors将自动加载errors.header作为出错提示标题    
  8. errors.header=<h3><font color="red">验证出错</font></h3>你必须按以下提示修改你的输入才能继续....    
  9. error.username={0} 必须填写.<br>    
  10. error.password={0} 必须填写.<br>    
  11. #html:errors将自动加载errors.footer作为出错的最后一行    
  12. errors.footer=<h3><font color="green">你完成上面提示部分</font></h3>  

# -- standard errors --username=用户名password=密码login=登陆noname=请输入用户名,然后在登陆nopassword=请输入密码,然后在登陆#html:errors将自动加载errors.header作为出错提示标题errors.header=<h3><font color="red">验证出错</font></h3>你必须按以下提示修改你的输入才能继续....error.username={0} 必须填写.<br>error.password={0} 必须填写.<br>#html:errors将自动加载errors.footer作为出错的最后一行errors.footer=<h3><font color="green">你完成上面提示部分</font></h3>
注:上述资源文件还不能直接在项目中应用,在使用前需要转换成unicode格式。
命令:native2ascii MessageResources_zh_CN.properties MessageResources.properties
以上是使用ActionForm进行数据验证的方法,但是使用ActionForm的数据验证有个显著的问题:ActionErrors和ActionError都是struts不在推荐使用的类,因此,应尽量避免使用这种验证方法。
1.2  Action的代码验证
     在Action里通过代码完成输入验证,是最基本,也是最容易使用的方法。与当初的MVC设计相似,在调用业务逻辑组件之前,先对数据进行基本的验证,这是最传统也是最原始的方法。
      在Action里面完成数据验证,实际上就是在execute方法前面增加数据验证的部分代码。下面是增加了数据验证Action代码:

Java代码

  1. import java.sql.ResultSet;    
  2.   
  3. import javax.servlet.http.HttpServletRequest;    
  4. import javax.servlet.http.HttpServletResponse;    
  5.   
  6. import org.apache.struts.action.Action;    
  7. import org.apache.struts.action.ActionForm;    
  8. import org.apache.struts.action.ActionForward;    
  9. import org.apache.struts.action.ActionMapping;    
  10.   
  11. import cn.com.newcom.dao.DbDao;    
  12.   
  13. public class LoginAction extends Action {    
  14.   
  15.     @Override  
  16.     //必须重写核心方法,该方法负责处理用户的请求    
  17.     public ActionForward execute(ActionMapping mapping, ActionForm form,    
  18.             HttpServletRequest request, HttpServletResponse response)    
  19.             throws Exception {    
  20.         //解析用户请求参数    
  21.         LoginActionForm  laf = (LoginActionForm)form;    
  22.         String username = laf.getUsername();    
  23.         System.out.println(" 您输入的用户名是:"+username);    
  24.         String password = laf.getPassword();    
  25.         //出错提示    
  26.         String errMsg = "";    
  27.         // 完成服务器端的校验    
  28.         if (username == null || username.equals("")) {    
  29.             errMsg += "您的用户名丢失或没有输入,请重新输入!";    
  30.         } else if (password == null || password.equals("")) {    
  31.             errMsg += "您的密码丢失或是没有输入密码,请重新输入!";    
  32.         } else {    
  33.                    //如果通过校验,则开始调用业务逻辑    
  34.         }    
  35.     }    
  36.         
  37. }  

import java.sql.ResultSet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import cn.com.newcom.dao.DbDao;public class LoginAction extends Action { @Override //必须重写核心方法,该方法负责处理用户的请求 public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //解析用户请求参数 LoginActionForm laf = (LoginActionForm)form; String username = laf.getUsername(); System.out.println(" 您输入的用户名是:"+username); String password = laf.getPassword(); //出错提示 String errMsg = ""; // 完成服务器端的校验 if (username == null || username.equals("")) { errMsg += "您的用户名丢失或没有输入,请重新输入!"; } else if (password == null || password.equals("")) { errMsg += "您的密码丢失或是没有输入密码,请重新输入!"; } else { //如果通过校验,则开始调用业务逻辑 } } }
    这种校验方式非常容易理解,所有的代码都需要程序员自己控制,相当灵活。但有几个不方便的地方:

  • 需要书写大量的验证代码,是程序变得繁琐
  • 数据验证应该在填充ActionForm里完成,最好能在客户端完成检验,而不是推迟到Action里才完成数据校验。

注意:在实际的使用中,这种校验方式不仅使程序开发变得复杂,且性能也不高。
1.3  Validator验证框架
    利用Struts的提供的Validator验证框架可实现客户端和服务器端双验证。Struts的Validator验证框架定义了常用的十几个验证规则,如:required(验证非空)、minlength(验证最小长度)、maxlength(验证最大长度)、intRange(验证整形范围)、email(验证电子邮件地址)、date(验证日期)等,并且实现了客户端的Javascript验证和服务器端验证,以下是在myeclipse环境下使用Validator验证框架的步骤:
  1. 配置
目前使用的版本是Struts1.2.9(下载地址:http://struts.apache.org/download.cgi),里面有validator-rules.xml和validator.xml两个文件,在使用Validator之前,需要先配置一些东西。
  1)必要的包:
   将Struts发行包中的commons-validator.jar和jakarta-oro.jar这两个文件放到Web应用的WEB-INF/lib目录中。
  2)自己定义的FormBean需要继承ValidatorForm,代码如下:
Java代码

  1. import org.apache.struts.validator.ValidatorForm;    
  2.   
  3. public class LoginActionForm extends ValidatorForm {    
  4.         
  5.     private static final long serialVersionUID = 1L;    
  6.     private String username;    
  7.     private String password;    
  8.         
  9.     public String getUsername() {    
  10.         return username;    
  11.     }    
  12.     public void setUsername(String username) {    
  13.         this.username = username;    
  14.     }    
  15.     public String getPassword() {    
  16.         return password;    
  17.     }    
  18.     public void setPassword(String password) {    
  19.         this.password = password;    
  20.     }    
  21. }  

import org.apache.struts.validator.ValidatorForm;public class LoginActionForm extends ValidatorForm { private static final long serialVersionUID = 1L; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
注:Validator框架不能用于验证标准的org.apache.struts.action.ActionForm类。如果要使用Validator框架应该采用ActionForm类的两个子类:DynavalidatorForm和ValidatorForm。
3)编写表单域时必须满足的校验规则。校验规则都由规则文件控制,规则文件有以下两个:  

  1. validator-rules.xml文件
  2. validation.xml文件

   第一个文件可在struts的解压缩后的文件夹lib下找到,只需将该文件复制到WEB-INF路径下,该文件是通用文件,一般不需要修改。除非打算修改或扩展这组规则,否则无需修改这个文件!
注意1:需要在资源包(ApplicationResources.properties)中加上一下的“键-值”:
资源文件代码

  1. # -- standard errors --    
  2. username=username    
  3. password=password    
  4. login=submit    
  5. noname=please enter name    
  6. nopassword=please  enter password    
  7.   
  8. # Struts Validator Error Messages    
  9. errors.required={0} is required.    
  10. errors.minlength={0} can not be less than {1} characters.    
  11. errors.maxlength={0} can not be greater than {1} characters.    
  12. errors.invalid={0} is invalid.    
  13.   
  14. errors.byte={0} must be a byte.    
  15. errors.short={0} must be a short.    
  16. errors.integer={0} must be an integer.    
  17. errors.long={0} must be a long.    
  18. errors.float={0} must be a float.    
  19. errors.double={0} must be a double.    
  20.   
  21. errors.date={0} is not a date.    
  22. errors.range={0} is not in the range {1} through {2}.    
  23. errors.creditcard={0} is an invalid credit card number.    
  24. errors.email={0} is an invalid e-mail address.    
  25.   
  26. #loginForm    
  27. loginActionForm.login=username  

# -- standard errors --username=usernamepassword=passwordlogin=submitnoname=please enter namenopassword=please enter password# Struts Validator Error Messageserrors.required={0} is required.errors.minlength={0} can not be less than {1} characters.errors.maxlength={0} can not be greater than {1} characters.errors.invalid={0} is invalid.errors.byte={0} must be a byte.errors.short={0} must be a short.errors.integer={0} must be an integer.errors.long={0} must be a long.errors.float={0} must be a float.errors.double={0} must be a double.errors.date={0} is not a date.errors.range={0} is not in the range {1} through {2}.errors.creditcard={0} is an invalid credit card number.errors.email={0} is an invalid e-mail address.#loginForm loginActionForm.login=username
因为,验证出错的时候,系统会自动在资源包中查找对应的错误消息, 比如:required验证规则出现错误时,就会输出“errors.required”的值。
注意2:在Struts 1.2.9中,验证类使用的是:“org.apache.struts.validator.FieldChecks”,
以前使用的是“org.apache.struts.util.StrutsValidtor”,
只要是从struts 1.2.x发行包中拷贝的“validation-rules.xml”文件,就可以保证是正确的。    而第二个validation.xml文件则是属于你自己项目的校验文件,负责每个表单域必须满足的规则,同样也要放在WEB-INF路径下面:
下面是本示例程序的validation.xml文件:
Xml代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN"    
  3. "validator_1_0_1.dtd" >  
  4. <!-- 检验规则文件的根元素 -->  
  5. <form-validation>  
  6.     <!-- 所需要校验的form都放在formset元素里面 -->  
  7.     <formset>  
  8.         <!-- 定义需要校验的表单,此处的name必须与struts-config.xml中定义的FormBean的名字一致 -->  
  9.         <form name="loginActionForm">  
  10.             <!-- 每个field元素定义一个表单域,即要验证的字段;必须满足怎样的规则 -->  
  11.             <field property="username" depends="required">  
  12.                 <!-- field:要验证的字段,即属性,depends:依赖的验证规则 -->  
  13.                 <arg0 key="loginActionForm.login" />  
  14.                 <!-- arg0:在资源包中配置错误消息的{0}参数值 -->  
  15.             </field>  
  16.             <field property="password" depends="required,minlength">  
  17.                 <!-- 多个验证规则用逗号分割 -->  
  18.                 <arg0 key="loginActionForm.password" />  
  19.                 <arg1 name="minlength" key="#{var:minlength}" resource="false" />  
  20.                 <!-- resource:false该key的值不在资源包中给出,而是在本文件给 -->  
  21.                 <var>  
  22.                     <!-- 定义变量,给上面的key所用 -->  
  23.                     <var-name>minlength</var-name>  
  24.                     <var-value>5</var-value>  
  25.                 </var>  
  26.             </field>  
  27.         </form>  
  28.     </formset>  
  29. </form-validation>  

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0.1//EN" "validator_1_0_1.dtd" ><!-- 检验规则文件的根元素 --><form-validation> <!-- 所需要校验的form都放在formset元素里面 --> <formset> <!-- 定义需要校验的表单,此处的name必须与struts-config.xml中定义的FormBean的名字一致 --> <form name="loginActionForm"> <!-- 每个field元素定义一个表单域,即要验证的字段;必须满足怎样的规则 --> <field property="username" depends="required"> <!-- field:要验证的字段,即属性,depends:依赖的验证规则 --> <arg0 key="loginActionForm.login" /> <!-- arg0:在资源包中配置错误消息的{0}参数值 --> </field> <field property="password" depends="required,minlength"> <!-- 多个验证规则用逗号分割 --> <arg0 key="loginActionForm.password" /> <arg1 name="minlength" key="#{var:minlength}" resource="false" /> <!-- resource:false该key的值不在资源包中给出,而是在本文件给 --> <var> <!-- 定义变量,给上面的key所用 --> <var-name>minlength</var-name> <var-value>5</var-value> </var> </field> </form> </formset></form-validation>
4)在struts-config.xml中设置插件:
  
Xml代码

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

<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /> </plug-in>
注:value值用来指定验证规则的文件的路径,多个验证规则文件要用逗号分割
同时还要在该文件中的Action元素里面增加两个属性:input属性和validate属性,input属性指定不满足规则时返回的页面,应该将validate的属性值设置为true。
  5)修改JSP页面
   代码如下:
  
Java代码

  1. <%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%>    
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
  3. <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>      
  4. <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>      
  5. <html:html>    
  6.   <head>    
  7.     <!-- 使用国际化资源文件的key输出标题 -->    
  8.     <title><bean:message key="login"/></title>    
  9.   </head>    
  10.       
  11.       
  12.   <!-- 下面的标签用于输出出错信息 -->    
  13.   <html:errors/>    
  14.       
  15.   
  16.   <body>    
  17.     <font color="red">    
  18.     <%    
  19.     //用于输出出错信息,出错信息保存在request的err属性中    
  20.         if(request.getAttribute("err")!=null) {    
  21.             out.println(request.getAttribute("err"));    
  22.         }    
  23.     %>    
  24.     </font>    
  25.     <br><br>    
  26.     <!-- 下面是登陆表单 -->    
  27.     请输入用户名和密码:<hr>    
  28.         <html:form action="login.do" method="post" onsubmit="return validateLoginActionForm(this);">    
  29.             <bean:message key="username" />:<html:text property="username" />    
  30.             <br>    
  31.             <bean:message key="password" />:<html:password property="password"/>    
  32.             <br>    
  33.             <html:submit>    
  34.                 <bean:message key="login"/>    
  35.             </html:submit>    
  36.             <br>    
  37.         </html:form>    
  38.         <html:javascript formName="loginActionForm"/>    
  39.     </body>    
  40. </html:html>  

<%@ page language="java" contentType="text/html; charset=GB2312" errorPage="error.jsp"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%> <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %> <html:html> <head> <!-- 使用国际化资源文件的key输出标题 --> <title><bean:message key="login"/></title> </head> <!-- 下面的标签用于输出出错信息 --> <html:errors/> <body> <font color="red"> <% //用于输出出错信息,出错信息保存在request的err属性中 if(request.getAttribute("err")!=null) { out.println(request.getAttribute("err")); } %> </font> <br><br> <!-- 下面是登陆表单 --> 请输入用户名和密码:<hr> <html:form action="login.do" method="post" onsubmit="return validateLoginActionForm(this);"> <bean:message key="username" />:<html:text property="username" /> <br> <bean:message key="password" />:<html:password property="password"/> <br> <html:submit> <bean:message key="login"/> </html:submit> <br> </html:form> <html:javascript formName="loginActionForm"/> </body></html:html>
注:实现客户端的javascript验证,只需在<form onSubmit=”return validateLonginActionForm(this);”>配置提交事件和使用<html:javascript formName=”loginActionForm”/>
本文作者:网友 来源:网络收集
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读