struts2入门教程五(表单数据的校验)


一: 手动编写代码实现校验

操作方式

通过重写validate() 方法实现, validate()方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息

 

注意:

通过validateXxx()方法实现,validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。

 

 

Java 代码:

package action;
 
import java.util.Date;
import java.util.regex.Pattern;
 
importcom.opensymphony.xwork2.ActionSupport;
 
public class ValidateAction extendsActionSupport {
 
        
         privateString name;
         privateString pass;
         privateDate birth;
         privateInteger age;
      
         @Override
         publicString execute() throws Exception {
                  
                   returnSUCCESS;
         }
        
        
         publicString add(){
                   returnSUCCESS;
         }
         publicvoid validateAdd(){
                   System.out.println("validateAdd---------------");
                  
                   if(name==null|| "".equals(name.trim())){
                            this.addFieldError("name","名称不能为空");
                   }
                  
                   if(age==null){
                            this.addFieldError("age","名称不能为空");
                   }elseif(!Pattern.compile("^([0-9]|[0-9]{2}|100)$").matcher(String.valueOf(age)).matches()){
                           
                   }
             {
                       addFieldError("age","年龄必须为1-100");
             }
                   }
        
         publicString getName() {
                   returnname;
         }
         publicvoid setName(String name) {
                   this.name= name;
         }
         publicString getPass() {
                   returnpass;
         }
         publicvoid setPass(String pass) {
                   this.pass= pass;
         }
         publicDate getBirth() {
                   returnbirth;
         }
         publicvoid setBirth(Date birth) {
                   this.birth= birth;
         }
 
 
         publicInteger getAge() {
                   returnage;
         }
 
 
         publicvoid setAge(Integer age) {
                   this.age= age;
         }
        

}


Struts.xml

<

?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD StrutsConfiguration 2.3//EN"
   "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
  
   <package name="hello" namespace="/hello"extends="struts-default">
      <action name="login" class="action.ValidateAction"method="add">
 
         <result>
            /index.jsp
         </result>
         <result name="input">
            /login.jsp
         </result>
      </action>
   </package>
 
</struts>

 

Login.jsp

 

<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"prefix="s" %>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
 <head>
   
   
   <title>My JSP 'index.jsp' starting page</title>
  
 </head>
 
 <body>
 
 <s:fielderror/>
  <s:form action="/hello/login">
  <s:textfield name="name" label="用户名" />
      <s:textfield name="pass" label="密码" />
      <s:textfield name="age" label="年龄" />
      <s:textfield name="birth" label="生日" />
      <s:submit value="注册" />
  </s:form>
 </body>
</html>


校验流程

1。类型转换器对请求参数执行类型转换,并把转换后的值赋给action中的属性。

2。如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入第3步。

3。系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。

4。再调用action中的validate()方法。

5。经过上面4步,如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。

 

测试效果:

 

二:使用配置文件进行校验

 常见的struts2 校验器

1.conversion validator 字段验证器,检查转换错误发生。

2.date validator     字段验证器检查提供的日期是否在特定的范围内。

3double validator   指定字段验证器检查双在一定范围内。

4email validator EmailValidator检查一个给定的字符串字段,如果不是空的,是一个有效的电子邮件地址。

字符串的正则表达式用于验证电子邮件地址是:

\\b(^[_A-Za-z0-9-](\\.[_A-Za-z0-9-])*@([A-Za-z0-9-])+((\\.com)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$)\\b

 

5expression validator 无级别验证器,验证基于正则表达式提供。6 fieldexpression验证器6fieldexpression validator   验证一个字段使用OGNL表达式。

7int validator          字段验证器,检查是否在一定的范围内指定的整数。

8regex validator     使用正则表达式验证字符串字段。

9required validator   要求field的值不能为null

10requiredstring validator必填字符串校验器,要求field的值不能为null,并且长度大于0,默认情况下会对字符串去前后空格

11stringlength validator   字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格

12url validator 检查给定的字段是一个字符串和一个有效的URL

13visitor validator  用于校验action中的复合属性,它指定一个校验文件用于校验复合属性中的属性

 

创建输入表单。

<%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"prefix="s"%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp'starting page</title>
</head>
<body>
   <s:fielderror />
   <s:form action="/hello/login">
      <s:textfield name="name" label="用户名" />
      <s:textfield name="pass" label="密码" />
      <s:textfield name="age" label="年龄" />
      <s:textfield name="birth" label="生日" />
      <s:submit value="注册" />
   </s:form>
</body>
</html>


 

创建Action类

 

package action;
 
import java.util.Date;
import java.util.regex.Pattern;
 
import com.opensymphony.xwork2.ActionSupport;
 
public classValidateAction extends ActionSupport {
 
   /**
    *
    */
   private static final long serialVersionUID= 1L;
   private String name;
   private String pass;
   private Date birth;
   private Integer age;
 
   @Override
   public String execute() throws Exception {
 
      return SUCCESS;
   }
 
   public String add() {
      return SUCCESS;
   }
 
  
   public String getName() {
      return name;
   }
 
   public void setName(String name) {
      this.name = name;
   }
 
   public String getPass() {
      return pass;
   }
 
   public void setPass(String pass) {
      this.pass = pass;
   }
 
   public Date getBirth() {
      return birth;
   }
 
   public void setBirth(Date birth) {
      this.birth = birth;
   }
 
   public Integer getAge() {
      return age;
   }
 
   public void setAge(Integer age) {
      this.age = age;
   }
 
}


 

创建验证器

验证器的命名规范为 <ActionClassName>-validation.xml or <ActionClassName>-<ActionAliasName>-validation.xml.

类的验证器

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphonyGroup//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="name.requried"></message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
 
<field-validator type="stringlength">
   <param name="maxLength">10</param>
   <param name="minLength">2</param>
   <param name="trim">true</param>
   <message><![CDATA[密码应在2-10个字符之间1111]]></message>
</field-validator>
 
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">100</param>
<message>年龄必须在1到100之间</message>
</field-validator>
</field>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2014-01-01</param>
<message>生日必须在${min}到${max}之间!</message>
</field-validator>
</field>
</validators>


 

类的特定方法的验证器

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphonyGroup//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
 
 
<field-validator type="stringlength">
   <param name="maxLength">10</param>
   <param name="minLength">2</param>
   <param name="trim">true</param>
   <message><![CDATA[密码应在2-10个字符之间]]></message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">100</param>
<message>年龄必须在1到100之间</message>
</field-validator>
</field>
<field name="birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2014-01-01</param>
<message>生日必须在${min}到${max}之间!</message>
</field-validator>
</field>
</validators>


 

验证效果

两个验证器同时存在效果--无短路:

 

 

两个验证器同时存在效果--短路:

将两个方法的名字的验证短路  设置short-circuit="true"

<field name="name">
<field-validator type="requiredstring"short-circuit="true">
<param name="trim">true</param>
<message key="name.requried"></message>
</field-validator>
</field>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值