在Struts2
中最简单的验证数据的方法是使用validate
。我们从ActionSupport
类的源代码中可以看到,ActionSupport
类实现了一个Validateable
接口。这个接口只有一个validate
方法。如果Action
类实现了这个接口,Struts2
在调用execute
方法之前首先会调用这个方法,我们可以在validate
方法中验证,如果发生错误,可以根据错误的level
选择字段级错误,还是动作级错误。并且可使用addFieldError
或addActionError
加入相应的错误信息,如果存在Action
或Field
错误,Struts2
会返回“input
”(这个并不用开发人员写,由Struts2
自动返回),如果返回了“input
”,Struts2
就不会再调用execute
方法了。如果不存在错误信息,Struts2
在最后会调用execute
方法。
这两个add
方法和ActionErrors
类中的add
方法类似,只是add
方法的错误信息需要一个ActionMessage
对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage
方法加入成功提交后的信息。当提交成功后,可以显示这些信息。
以上三个
add
方法都在
ValidationAware
接口中定义,并且在
ActionSupport
类中有一个默认的实现。其实,在
ActionSupport
类中的实现实际上是调用了
ValidationAwareSupport
中的相应的方法,也就是这三个
add
方法是在
ValidationAwareSupport
类中实现的,代码如下:
private
final
ValidationAwareSupport validationAware
=
new
ValidationAwareSupport();
public void addActionError(String anErrorMessage)
{ validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage)
{
validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName, String errorMessage)
{
validationAware.addFieldError(fieldName, errorMessage);
}
public void addActionError(String anErrorMessage)
{ validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage)
{
validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName, String errorMessage)
{
validationAware.addFieldError(fieldName, errorMessage);
}
下面我们来实现一个简单的验证程序,来体验一个validate
方法的使用。
先来在Web
根目录建立一个主页面(validate.jsp
),代码如下:
<
%@ page
language
="java"
import
="java.util.*"
pageEncoding
="GBK"
%
>
< %@ taglib prefix ="s" uri ="/struts-tags" % >
< html >
< head >
< title > 验证数据 </ title >
</ head >
< body >
< s:actionerror />
< s:actionmessage />
< s:form action ="validate.action" theme ="simple" >
输入内容: < s:textfield name ="msg" />
< s:fielderror key ="msg.hello" />
< br />
< s:submit />
</ s:form >
</ body >
</ html >
< %@ taglib prefix ="s" uri ="/struts-tags" % >
< html >
< head >
< title > 验证数据 </ title >
</ head >
< body >
< s:actionerror />
< s:actionmessage />
< s:form action ="validate.action" theme ="simple" >
输入内容: < s:textfield name ="msg" />
< s:fielderror key ="msg.hello" />
< br />
< s:submit />
</ s:form >
</ body >
</ html >
在上面的代码中,使用了Struts2
的tag
:<s:actionerror>
、<s:fielderror>
和<s:actionmessage>
,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示。
现在我们来实现一个动作类,代码如下:
package
action;
import javax.servlet.http. * ;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor. * ;
public class ValidateAction extends ActionSupport
{
private String msg;
public String execute()
{
System.out.println(SUCCESS);
return SUCCESS;
}
public void validate()
{
if ( ! msg.equalsIgnoreCase( " hello " ))
{
System.out.println(INPUT);
this .addFieldError( " msg.hello " , " 必须输入hello! " );
this .addActionError( " 处理动作失败! " );
}
else
{
this .addActionMessage( " 提交成功 " );
}
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this .msg = msg;
}
}
import javax.servlet.http. * ;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor. * ;
public class ValidateAction extends ActionSupport
{
private String msg;
public String execute()
{
System.out.println(SUCCESS);
return SUCCESS;
}
public void validate()
{
if ( ! msg.equalsIgnoreCase( " hello " ))
{
System.out.println(INPUT);
this .addFieldError( " msg.hello " , " 必须输入hello! " );
this .addActionError( " 处理动作失败! " );
}
else
{
this .addActionMessage( " 提交成功 " );
}
}
public String getMsg()
{
return msg;
}
public void setMsg(String msg)
{
this .msg = msg;
}
}
大家从上面的代码可以看出,Field
错误需要一个key
(一般用来表示是哪一个属性出的错误),而Action
错误和Action
消息只要提供一个信息字符串就可以了。
最后来配置一下这个Action
,代码如下:
<
package
name
="demo"
extends
="struts-default"
>
< action name ="validate" class ="action.ValidateAction" >
< result name ="success" > /error/validate.jsp </ result >
< result name ="input" > /error/validate.jsp </ result >
</ action >
</ package >
< action name ="validate" class ="action.ValidateAction" >
< result name ="success" > /error/validate.jsp </ result >
< result name ="input" > /error/validate.jsp </ result >
</ action >
</ package >
假设应用程序的上下文路径为demo
,则可通过如下的URL
来测试程序:
http://localhost:8080/demo/validate.jsp
我们还可以使用ValidationAware
接口的其他方法(由ValidationAwareSupport
类实现)获得或设置字段错误信息、动作错误信息以及动作消息。如hasActionErrors
方法判断是否存在动作层的错误,getFieldErrors
获得字段错误信息(一个Map
对象)。下面是ValidationAware
接口提供的所有的方法:
package
com.opensymphony.xwork2;
import java.util.Collection;
import java.util.Map;
public interface ValidationAware
{
void setActionErrors(Collection errorMessages);
Collection getActionErrors();
void setActionMessages(Collection messages);
Collection getActionMessages();
void setFieldErrors(Map errorMap);
Map getFieldErrors();
void addActionError(String anErrorMessage);
void addActionMessage(String aMessage);
void addFieldError(String fieldName, String errorMessage);
boolean hasActionErrors();
boolean hasActionMessages();
boolean hasErrors();
boolean hasFieldErrors();
}
import java.util.Collection;
import java.util.Map;
public interface ValidationAware
{
void setActionErrors(Collection errorMessages);
Collection getActionErrors();
void setActionMessages(Collection messages);
Collection getActionMessages();
void setFieldErrors(Map errorMap);
Map getFieldErrors();
void addActionError(String anErrorMessage);
void addActionMessage(String aMessage);
void addFieldError(String fieldName, String errorMessage);
boolean hasActionErrors();
boolean hasActionMessages();
boolean hasErrors();
boolean hasFieldErrors();
}
本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/216507,如需转载请自行联系原作者