随笔 - 312, 文章 - 14, 评论 - 1393, 引用 - 0
数据加载中……

Struts2教程4:使用validate方法验证数据

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Struts2教程3:struts.xml常用配置解析

Struts2中最简单的验证数据的方法是使用validate。我们从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldErroraddActionError加入相应的错误信息,如果存在ActionField错误,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);
}

下面我们来实现一个简单的验证程序,来体验一个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>

在上面的代码中,使用了Struts2tag<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;
    }
}

大家从上面的代码可以看出,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>

假设应用程序的上下文路径为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();
}

下一篇:Struts2教程5:使用Validation框架验证数据




Android开发完全讲义(第2版)(本书版权已输出到台湾)

http://product.dangdang.com/product.aspx?product_id=22741502



Android高薪之路:Android程序员面试宝典 http://book.360buy.com/10970314.html


新浪微博:http://t.sina.com.cn/androidguy   昵称:李宁_Lining

posted on 2008-04-17 15:17 银河使者 阅读(30955) 评论(14)  编辑  收藏 所属分类: Struts2 原创

评论

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

谢谢,学习了.
2008-06-05 16:32 | nihao955

# re: Struts2教程4:使用validate方法验证数据[未登录]  回复  更多评论   

很不错的学习教程
2008-07-21 09:15 | 风中叶

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

回帖是一种美德,
2008-12-07 12:41 | leonone23

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

thanks
2009-01-21 16:37 | Hadis

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

谢谢,学习中。。。
2009-06-08 14:11 | 横行

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

lz,在这个例子中我加了namespace
<package name="demo" extends="struts-default" namespace="/mystruts">
返回路径是这样写的:<result name="input">sum.jsp</result>
之后会报The requested resource (/mystruts/sum.jsp) is not available.
的错误,它自动在jsp页面前加了一个namespace
请问lz怎么解决?谢谢
2009-08-11 13:29 | 五角

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

好帖
2009-10-22 13:36 | haozi

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

这网站能提供个直接翻页的吗
2011-05-31 09:54 | gzww

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

验证错误时,为什么下次如果验证正确也不会跳转到success页面呢
2013-01-08 16:46 | wdw

# re: Struts2教程4:使用validate方法验证数据[未登录]  回复  更多评论   

很好,容易理解!
2013-04-30 07:37 | abc

# re: Struts2教程4:使用validate方法验证数据[未登录]  回复  更多评论   

容易理解,很精彩!
2013-04-30 07:53 | abc

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

我就是按上面操作的,但怎么提示“HTTP Status 404 - No result defined for action action.ValidateAction and result input”这样的错误呢?请高手指点
2013-07-04 22:47 | toyato

# re: Struts2教程4:使用validate方法验证数据[未登录]  回复  更多评论   

@toyato
好像action的name不能为validate
2013-08-14 17:37 | 呵呵

# re: Struts2教程4:使用validate方法验证数据  回复  更多评论   

2014-8-15 9:42:28 org.apache.struts2.util.TextProviderHelper warn
警告: The first TextProvider in the ValueStack (com.mystruts.action.UserAction) could not locate the message resource with key 'msg.hello'
2014-8-15 9:42:28 org.apache.struts2.util.TextProviderHelper warn
警告: The default value expression 'msg.hello' was evaluated and did not match a property. The literal value 'msg.hello' will be used.

<s:fielderror key="msg.hello"/> 这句这样写后台会有这个错误信息

void com.opensymphony.xwork2.ActionSupport.addFieldError(String fieldName, String errorMessage)

方法里定义的参数是fieldName,改成<s:fielderror fieldName="msg.hello"/>这样就好了

2014-08-15 09:43 | leietal

只有注册用户登录后才能发表评论。


网站导航: