博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts1.x系列教程(2):简单的数据验证
阅读量:6335 次
发布时间:2019-06-22

本文共 8671 字,大约阅读时间需要 28 分钟。

  
简单验证从本质上说就是在服务端来验证客户端提交的
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




当通过上面的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页)
      }
  }
【第3步】建立ActionForm类
    在这一步我们来建立一个用于接收有户的提交信息的ActionForm类:SimpleValidationForm。这个类从org.apache.struts.action.ActionForm类继承。在<samples工程目录>"src"actionform目录中建立一个SimpleValidationForm.java文件,代码如下:
  
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




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


图2
 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215245,如需转载请自行联系原作者
你可能感兴趣的文章
腾讯猜字游戏
查看>>
叶子节点测试hdu 4217 线段树
查看>>
js 数据拷贝
查看>>
E: Sub-process /usr/bin/dpkg returned an error code 解决办法
查看>>
异步线程C#异步委托的使用
查看>>
Javascript s04
查看>>
c#防止反编译(加壳)
查看>>
TempData,ViewData和ViewBag的比较
查看>>
去除有向图中两节点间的环
查看>>
windows服务的创建、安装和调试
查看>>
實戰ESXi 5設置MPIO 打造IP-SAN負載平衡容錯
查看>>
几个随机算法【转载+整理】
查看>>
Draw2d中的布局管理器Layout比较
查看>>
Cracking the coding interview--Q2.1
查看>>
Inno Setup使用上的几个问题 (转)
查看>>
软件架构实现
查看>>
开发者必备的6款源码搜索引擎
查看>>
VirtualBox Bridged 无线网卡
查看>>
烟大 2238: 括号匹配(栈和队列)
查看>>
express 学习笔记
查看>>