Struts1.x系列教程(2):简单的数据验证

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://androidguy.blog.51cto.com/974126/215245
  简单验证从本质上说就是在服务端来验证客户端提交的form 中的数据。这种验证只是对form 中的数据规则进行检查,如必须输入用户ID ,价格不能小于0 或是对email 格式的验证。在这个验证过程中,并不需要访问数据库。因此,简单验证需要在用户提交form 后,并且在服务器处理form 中的数据之前进行。
    在进行完简单验证后,如果form 中的数据不合法,程序就会forward 到指定的JSP 页(一般是包含form 的页面),并显示相应的错误信息。如果form 中的数据完全正确,程序就会继续执行。

一、在 validate 方法中进行简单验证

   
在上一篇文章中我们知道,Struts1.x 通过ActionForm 的子类来封装了客户端提交的form 中的数据。而服务端程序只需要通过ActionForm 的子类的对象实例就可以访问form 中的数据,而如果不使用ActionForm 类,就必须通过request 对象来获得form 中的数据。 通过这种封装机制可以使代码更容易理解。然而,ActionForm 类不仅可以封装form 中的数据,还可以通过ActionForm 类的validate 方法来验证form 中的数据。validate 方法的定义如下:
public  ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
 
    当客户端向服务端提交form 后,Servlet 引擎首先通过ActionForm 的子类的对象实例装载form 中的数据,然后再调用validate 方法进行验证。validate 方法返回了一个ActionErrors 对象。这个对象相当于一个Map ,如果ActionErrors 中没有错误信息,Servlet 引擎就认为form 中的数据是正确的,这时服务端程序就会继续执行。如果ActionErrors 中有错误信息,程序就会跳转到指定的错误页面。下面让我们通过一个完整的例子来演示一下如何通过validate 方法来验证form 中的数据。实现这个例子需要如下五步:

【第 1 步】 建立JSP 页面
    在这一步将建立一个叫simpleValidation.jsp 的页面,这个JSP 页面用于采集用户的输入信息。在<samples 工程目录> 中建立一个simpleValidation.jsp 文件,并编写如下的代码:
   <% @ page pageEncoding = " GBK " %>
  
<% @ taglib uri = " http://struts.apache.org/tags-html "  prefix = " html " %>
  
< html >
      
< head >
          
< title > 注册信息(测试简单验证) </ title >
          
< style  type ="text/css" >
  .text 
{
      height
:  20px ;
      width
:  160px ;
  
}
  
</ style >
      
</ head >
      
< body >
          
< html:form  action ="simpleValidation" >
              
< table  width ="100%" >
                  
< tr >
                      
< td  align ="right"  width ="45%" >  用户名: </ td >
                      
< td  width ="55%" >
                          
< html:text  property ="user"  styleClass ="text"   />
                          
< font  color ="red" >< html:errors  property ="errorUser"   /></ font >
                      
</ td >
                  
</ tr >< tr  />< tr  />
                  
< tr >
                      
< td  align ="right" > 登录密码: </ td >
                      
< td >
                          
< html:password  property ="password"  styleClass ="text"   />
                          
< font  color ="red" >< html:errors  property ="errorPassword"   /></ font >
                      
</ td >
                  
</ tr >< tr  />< tr  />
                  
< tr >
                      
< td  align ="right" > 重复登录密码: </ td >
                      
< td >
                          
< html:password  property ="password1"  styleClass ="text"   />
                          
< font  color ="red" >< html:errors  property ="errorPassword1"   /></ font >
                      
</ td >
                  
</ tr >< tr  />< tr  />
                  
< tr >
                      
< td  align ="right" > 电子邮件: </ td >
                      
< td >
                          
< html:text  property ="email"  styleClass ="text"   />
                          
< font  color ="red" >< html:errors  property ="errorEmail"   /></ font >
                      
</ td >
                  
</ tr >< tr  />< tr  />
                  
< tr >
                      
< td  align ="right" >   < br >  ${requestScope.success }  </ td >
                      
< td  align ="left" >   < br >   < html:submit  value =" 提交 "   />   </ td >
                  
</ tr >
              
</ table >
          
</ html:form >
      
</ body >
  
</ html >
 
  在启动 Tomcat 后,在 IE 的地址栏中输入如下的 URL

http://localhost:8080/samples/simpleValidation.jsp

当通过上面的URL 访问simpleValidation.jsp 时,并不能正确显示用户信息采集界面。原因是<html:form> 标签使用了一个simpleValidation ,当JSP 转换成Servlet 时,这个动作必须在struts-config.xml 文件中正确定义,否则将抛出一个javax.servlet.jsp.JspException 异常。

【第 2 步】 建立simpleValidation 动作
由于本例的着重点是简单验证,因此,simpleValidation 动作并不需要处理更多的工作。一个动作对应于一个动作类,这个动作类一般是org.apache.struts.action.Action 类的子类。simpleValidation 动作只做如下两项工作:
1.  设置验证成功后,在目标页中显示的信息字符串(保存在request 的属性中)。
2.       跳转到目标页。
    simpleValidation 动作对应的动作类是SimpleValidationAction ,在<samples 工程目录>"src"action 目录中建立一个SimpleValidationAction.java 文件,并输入如下的代码:
   package  action;
  
  
import  javax.servlet.http. * ;
  
import  org.apache.struts.action. * ;
  
  
public   class  SimpleValidationAction  extends  Action
  {
      
public  ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
              
throws  Exception
      {        
          request.setAttribute(
" success " " 提交成功! " );   //  设置在目标页中显示的信息字符串
           return  mapping.findForward( " simple " );   //  跳转到目录页(simple所指的JSP页)
      }
  }
   package  actionform;
  
  
import  javax.servlet.http.HttpServletRequest;
  
import  org.apache.struts.action. * ;

  
public   class  SimpleValidationForm  extends  ActionForm
  {
      
//  以下四个变量分别对应于simpleValidation.jsp中的四个文本框中的值。
       private  String user;    
      
private  String password;
      
private  String password1;
      
private  String email;
  
      
public  String getUser()  
      {
          
return  user;
      }
      
public   void  setUser(String user)
      {
          
this .user  =  user;
      }
      
public  String getPassword()
      {
          
return  password;
      }
      
public   void  setPassword(String password)
      {
          
this .password  =  password;
      }
      
public  String getPassword1()
      {
          
return  password1;
      }  
      
public   void  setPassword1(String password1)
      {
          
this .password1  =  password1;
      }
      
public  String getEmail()
      {
          
return  email;
      }
      
public   void  setEmail(String email)
      {
          
this .email  =  email;
      }  
      
//  开始验证用户提交的信息 
       public  ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
      {
          ActionErrors error 
=   new  ActionErrors();
          
if  (user.equals( "" ))    //  必须输入用户名
              error.add( " errorUser " new  ActionMessage( " error.user.blank " ));
          
if  (password.equals( "" ))   //  必须输入密码
              error.add( " errorPassword " new  ActionMessage( " error.password.blank " ));
          
else   if  ( ! password.equals(password1))   //  两个登录密码必须一致
              error.add( " errorPassword1 " new  ActionMessage( " error.password1.confirmation " ));
          
if  (email.equals( "" ))   //  必须输入email
              error.add( " errorEmail " new  ActionMessage( " error.email.blank " ));
          
else   if  ( ! email.matches( " \\w+(\\.\\w+)*@\\w+(\\.\\w+)+ " ))   //  验证email的格式是否正确
              error.add( " errorEmail " new  ActionMessage( " error.email.invalid " ));
  
           //  返回错误信息,如果error中没有错误信息,
           //  就会调用SimpleValidationAction类的对象实例来执行execute方法。
           return  error;        
      }
  }
 
在编写SimpleValidationAction 类时应注意如下八点:
    1. 
要想在ActionForm 类中进行验证,必须在ActionForm 类的子类中覆盖validate 方法。
    2. validate 方法在ActionForm 类的对象实例装载完用户提交的数据后调用,因此,在调用validate 方法时,ActionForm 类的属性值已经是用户提交的信息了。所以可以直接使用这些属性值进行验证。
    3.  validate 方法中验证用户提交的数据时,要使用ActionErrors 类的实例对象返回错误信息
  
4. ActionErrors 类的构造方法的第二个参是一个ActionMessage 类的对象实例,而不是错误描述信息。
   5.ActionMessage类的构造方法的参数并不是错误描述信息,而是错误描述信息的key,具体的信息在Java属性文件中(将在下一步实现)。

    6.  使用ActionForm 的属性可以非常好地验证字符串类型,但对于其他的数据类型(如整型)的某些验证却不太适合。如当用户提交数据时,本该提交一个整数,但用户却提交了一个非整数信息。对于这种情况,在ActionForm 类的对象实例中这个用户提交的数据的值为0 。虽然使用ActionForm 类的属性无法准确验证这种情况,但我们可以使用validate 方法的第二个参数request getParameter 方法直接获得客户端提交的数据来进行验证。
    7.  如果ActionErrors 对象中有错误信息,在JSP 中需要使用<html:errors> 标签显示错误信息。
   8. Struts实际上是将ActionErrors对象以org.apache.struts.action.ERROR作为键值保存在了request的 属性中。因此,<html:errors>标签实际上是从request的属性中获得的错误信息描述。如我们也可以通过如下的Java代码来 获得produceID属性的错误描述信息:
   <
    java
.util.Iterator<org.apache.struts.action.ActionMessage >  it =
 ((org.apache.struts.action.ActionErrors)request
                      .getAttribute("org.apache.struts.action.ERROR")).get("productID");
    out.println(((org.apache.struts.util.PropertyMessageResources )request
       .getAttribute("org.apache.struts.action.MESSAGE")).getMessage("error.productID.blank",null));
  %>
 
【第 4 步】 建立Java 属性文件

Java 属性文件相当于资源文件,以key = value 形式保存了在程序中需要的字符串信息。Java 属性文件的扩展名为properties 。在<samples 工程目录>"src 目录中建立一个struts 目录,在struts 目录中建立一个ErrorDescription.properties 文件,并输入如下的内容:
 
ErrorDescription.properties
  error.user.blank  =  User can't be null.
  error.password.blank 
=  Password can't be null.
  error.password1.confirmation 
=  Password doesn't match confirmation.
  error.email.blank 
=  Email can't be null.
  error.email.invalid 
=  It is not a valid email address.
 
【第 5 步】 配置struts-config.xml 文件

   
在本例中需要配置struts-config.xml 文件的三个标签:<form-bean> <action> <message-resources>
    1. 
配置<form-bean> 标签
这个标签用来定义ActionForm 。在<form-beans> 标签中加入如下所示的<form-bean> 标签:
< form-bean  name ="simpleValidationForm"  type ="actionform.SimpleValidationForm"   />
2.  配置<action> 标签
   
    这个标签用来定义Struts中的动作类。在<action-mappings>标签中加入如下所示的<action>标签:
   < action  name ="simpleValidationForm"  path ="/simpleValidation" scope ="request"  type ="action.SimpleValidationAction"
               input
="simpleValidation.jsp" >
      < forward  name ="simple"  path ="simpleValidation.jsp"   />
  </ action >

    <action> 标签中的属性含义描述如下:
1.   name :表示ActionForm 的名称。也就是<form-bean> 标签中的name 属性的值。
2. path :表示Struts 动作,必须以“/ ”开头。
3. scope :表示ActionForm 类的对象实例(在本例中是SimpleValidationForm 类的对
象实例)保存的范围。这个属性值只能取request session 。默认值是session 。如果scope 的值为request ,表示将SimpleValidationForm 类的对象实例以simpleValidationForm 作为键值保存到了request 的属性中。如果scope 的值为session ,表示不将SimpleValidationForm 类的对象实例保存到request 的属性中。但不管scope 的值是request 还是session Struts 都会将SimpleValidationForm 类的对象实例保存到session 的属性中。
4. type :表示SimpleValidationAction 类的全名。
5. input :表示如果客户端提交的数据未通过简单验证后要跳转到的页面,也就是在
SimpleValidationForm 类的validate 方法中返回的ActionErrors 对象中含有错误描述信息。Struts 会自动跳转到input 属性所指的JSP 页面。
    <action> 标签中的子标签<forward> 定义了可以在动作类(在本例中就是SimpleValidationAction 类)中读取的forward 页的URL
2.       配置<message-resources> 标签
这个标签用来定义程序中所使用的属性文件。在struts-config.xml 文件的<struts-config>根节点中加入如下内容:
< message-resources  parameter ="struts.ErrorDescription"   />
 
    其中parameter 属性表示属性文件的路径,在本例中属性文件ErrorDescription.properties 位于struts 目录中,因此,parameter 属性的值为struts.ErrorDescription 。扩展名properties 不用写。其中“. ”也可以使用“/ ”或“" ”代替。

   
下面我们测试一下这个例子程序。首先启动Tomcat ,然后在IE 中输入如下的URL

http://localhost:8080/samples/simpleValidation.jsp

    访问上面的URL 后的界面如图1 所示。


图1
  在不输入任何信息的情况下,点击“确定”按钮后的界面如图 2 所示。



图2

你可能感兴趣的:(超链接,数据,服务端,文章,的)