struts2支持三种验证方式:
编程式验证、声明式验证、注解式验证
服务器端验证(输入校验、struts2自带的validate框架验证)
1.我们需要配置struts2项目的最基本的jar包。(validate验证框架是有"xwork-core"包提供的)
2.使用struts2自带的validate验证有两种方法
a):编程式验证 (也就是重写ActionSupport中的validate()方法) 在validate方法中进行编写我们需要的验证功能 这里需要提几点的就是:
1>.当我们需要对action中的某一个指定的方法使用validate()方法验证时我们需要自定义一个validate
2>.当我们使用自定义的validate方法时,最好将重写的ActionSupport的validate方法去掉 (这是为了避免
引起冲突,因为如果action类中存在重写的validate()方法 程序会自动调用我们自定义的validate方法 之
后再调用它 这样就验证了多次,非常不利于程序的效率。而且容易出现冲突)
3>.在创建自定义的validate方法时需要注意该方法的 方法名! 该方法名由 validate+对应的表单提交的
action中的 执行方法名称(首字母大写)(java代码中的方法名)
b):声明式验证(使用xml文件进行配置验证功能)(建议使用xml配置文件进行validate的验证)
: 1.需要使用到xwork-core包下的 xwork-validate.dtd(版本根据项目进行选择,不过大体相同)
: 2.关于使用Xml进行验证 的两种情况: 全局验证 和局部验证
a1):关于全局验证
全局就是针对整个action对象进行xml验证
当我们使用全局验证时候需要在 action对象的同目录下创建一个xml配置文件
文件名是由 : action对象的名称+(-validation.xml)
a2):关于局部验证
局部验证是针对action对象中的某一个方法进行xml验证
使用局部验证的时候同样要在 action对象的同目录下创建一个xml配置文件
不过使用局部验证需要在struts.xml 中进行配置
代码如下:(struts.xml)
1)编程式验证(即validate验证)(使用编码方式实现)
校验流程:
1. 类型转换器负责对字符串的请求参数执行类型转换。并将这些值设置成Action的属性值。
2. 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其封装到fieldError中。
3. 通过反射调用validateXxx()方法,其中Xxx是即将处理用户请求的处理逻辑所对应的方法名。。
4. 调用validate(),在validate()方法中,如果系统发现有不合法输入时,调用其父类的addFieldError() 方法记录一个fieldError错误,当流程进入到execute()方法之前,系统检查有没有fieldError,如果有,则不再执行execute()方法,而是返回一个input逻辑视图通过<s:fielderror/>显示失败信息。
注意:首先执行validateXxx()方法,不管validateXxx()方法执行后的结果如何,都会去执行validate()方法
执行完validate()之后,如果没有发现存在Field或者Action级别的ERROR的话
那么才会执行相应的业务逻辑的方法,如Xxx()方法
1 2 3 4
validateXxx() -> Xxx() -> validate() -> excute()
如果1有异常,则不再执行2,进入3,3有异常,则不再进入4.
程序示例:
先来在Web根目录建立一个主页面(validate.jsp),代码如下:
<s:fielderror key="msgInfo" />
<%@ 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="msgInfo" />
<br/>
<s:submit/>
</s:form>
</body>
</html>
在上面的代码中,使用了Struts2的tag:<s:actionerror>、<s:fielderror>和<s:actionmessage>,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示
ValidateAction .java
public class ValidateAction extends ActionSupport
{
private String msg;
private String phone;
//节约篇幅,这里省略set/get方法
public String execute()
{
return SUCCESS;
}
public void validate()
{
if(!msg.equalsIgnoreCase("hello"))
{
System.out.println(INPUT);
this.addFieldError("msg.hello", "必须输入hello!");// 可以直接写addFieldError("msgInfo", "必须输入hello!")
this.addActionError("处理动作失败!");
}
else
{
this.addActionMessage("提交成功");
}
if(phone==null||"".equals(phone)){
this.addFieldError("phoneMsg", "必须输入手机号!"); }
else {
this.addActionMessage("提交成功");
}
/ * 大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错误) 而Action错误和Action消息只要提供一个信息字符串就可以了。
}*/
}
大家从上面的代码可以看出,Field错误需要一个key(一般用来表示是哪一个属性出的错误),而Action错误和Action消息只要提供一个信息字符串就可以了。
最后来配置一下这个Action,代码如下:
struts.xml
<package name="demo" extends="struts-default">
<constant name="struts.ui.theme" value="simple" /> // 配置不要自动生成table元素,此处也可以在jsp中设置<s:form action="" validate="true">
<action name="validate" class="action.ValidateAction">
<result name="success">/error/validate.jsp</result>
<result name="input">/error/validate.jsp</result>//使用验证框架则必须配置input
</action>
</package>
validateXxx()同上。
关于addFieldError()讲解如下:
这两个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
[/size]