`
peonyzzdx
  • 浏览: 581684 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2校验(一):编程式验证(validate()验证)

    博客分类:
  • J2EE
 
阅读更多

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]
  
  • 大小: 36.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics