原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 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