struts入门之验证(3)自定义验证器(custom validator)前传

 上两节我试了试服务器验证,客服端验证,短路验证。其中有些可以调用内置方法,有些是用XML文件来验证的。我查看了下它内建的可以验证的内型,总共有十多种,基本的验证都可以用内建的。这里我就不写出来了。有空查查文档就搞定了。

 

但是我想了想,万一我们我要验证的一个东西,那些内建的验证都不能达到我想要的效果怎么办。能不能用自己定义一个喃。仿佛我在说废话,肯定可以撒。

 

好了,不说了。开工。。。

 

说明下:为了加快我的练习速度,我选择了一个工具,也就是一个IDE——其名曰:JDeveloper。在我总结的时候我尽量忽略IDE的差异,只把原理讲来,这样具体情况,以后就可以根据具体的情况来配置自己的IDE了。

 

第一件事情:搭建好开发环境,一些库,jar包,什么什么的。该怎么弄就怎么弄。

 

然后就是:创建两个页面,还是和以前一样。login.jsp            done.jsp.

login.jsp:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
    <title>O(&cap;_&cap;)O~~</title>
    <style type="text/css">
      body {
      background-color: #f7f7f7;
}
    </style>
  </head>
  <body>
  <div align="center">
      <s:form action="login" method="POST" namespace="/test1/test2">
        <s:textfield label="姓名" name="name"/>
        <s:textfield label="性别" name="sex"/>
        <s:textfield label="国籍" name="county"/>
        <s:reset value="重置"/>
        <s:submit value="提交"/>
      </s:form>

    </div></body>
</html>

我不想过多解释了。有问题,想知道答案吗?百度知道。O(∩_∩)O哈哈~

 

done.jsp

  <body>done.jsp</body>

只是做个标记。

 

然后是web.xml


<?xml version = '1.0' encoding = 'GBK'?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee">
     <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
</web-app>

struts.xml


<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GB18030" />
<package name="test" extends="struts-default" namespace="/test1/test2">
    <action name="login" class="actions.LoginAction">
        <result name="done" >/done.jsp</result>
         <result name="failed" >/login.jsp</result>
         <result name="input" >/login.jsp</result>
    </action>
</package>
</struts>

 

LoginAction.java

 

 

package actions;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
    private String name;
    private String sex;
    private String county;
   
    public LoginAction() {
   
    }

    public String execute(){
        return "done";
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }

    public void setCounty(String county) {
        this.county = county;
    }

    public String getCounty() {
        return county;
    }
}

上面的我不再过多的做解释了,如果你不理解的话,你可以看看这里

 

 

下面我要做的就是,关键的了。

 

 

今天我要要验证的是国籍,如果是中国,方可通过,要不然。。。 边边上玩去。

 

 

首先:

 

创建一个java文件,叫做CountyValidator.java

package custom;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class CountyValidator extends FieldValidatorSupport {
  
    public CountyValidator() {
    }

    public void validate(Object object) throws ValidationException {
       
        String fieldName;
        fieldName=this.getFieldName();
       
        String county;
        county = (String)this.getFieldValue(fieldName,object);//get the textfield's value
        if(!"CHINA".equalsIgnoreCase(county)){
            this.addFieldError(fieldName,"sorry , only when you come from china can enter the site!");
        }else if("JAPAN".equalsIgnoreCase(county)){
            this.addFieldError(fieldName,"please do not try again!");
         }else if("CHINA".equalsIgnoreCase(county)){
             System.out.println(county);
         }else{
             this.addFieldError(fieldName,"sorry ,this is only design for chinses!");
         }
    }
}

这个就是我们自定义的一个类型验证器。它继承于FieldValidatorSupport 大家就看validate方法就可以了。他的流程是:1.取得textfield的名字2.取得名字为fieldName的textfield里面的值。3接下来就是验证部分。大家还知道addFieldError() 的作用嘛。当struts知道fielderror里面有值的话,他就知道有错误了。然后就会返回 “input”   至于input对于的view部分,大家可以看看struts.xml 里面对应的页面。

 

好了,就这样哈。

 

接下来,我们要注册我的的valdator。怎么样注册了。用最简单的方法是:

创建一个xml文件:叫做validators.xml

 

如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="validatecounty" class="custom.CountyValidator"/>
</validators>

注意他放的位置,他是放在  你的项目名/WEB-INF/classes/下面的哦。文档说明不要掉了哦。

 

 

最后我们还要创建一个xml文件:

就是验证文件:

 

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator
1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring" short-circuit="true">
            <message>姓名要求不能为空</message>
        </field-validator>
    </field>
    <field name="sex">
        <field-validator type="requiredstring" short-circuit="true">
            <message>性别要求不能为空</message>
        </field-validator>
    </field>
    <field name="county"><!--这个是forma里面的字段名,不要搞混了-->
        <field-validator type="validatecounty" short-circuit="true">
            <message>哈哈,有点问题!</message>
        </field-validator>
    </field>

</validators>

 

请和上面 的alidators.xml对应。大家猜猜这个XML文件该是什么名字勒?该放在哪里勒?给大家留个问题在这里哈!

 


然后我们运行:

看结果:

 

 

 

点击提交:

 

 

 

我们只填姓名和性别喃:

 

 

填个JAPAN试试:

 

 

填个CHINA试试:

 

good  成功了。看见没有,根据我们定义的那个java类,只有输入china才会通过,其实那个验证的java文件的validate方法里面还可以做更多的东西。这里只是一个抛砖引玉 !!!

 

看看这里:

 

 

这个是我的IDE的创建的文件的树形结构,当然不同的IDE组织方式肯定有点区别:

 

但是我还是有个问题。很纳闷:

看这里:

        if(!"CHINA".equalsIgnoreCase(county)){
            this.addFieldError(fieldName,"sorry , only when you come from china can enter the site!");
        }else if("JAPAN".equalsIgnoreCase(county)){
            this.addFieldError(fieldName,"please do not try again!");
         }else if("CHINA".equalsIgnoreCase(county)){
             System.out.println(county);
         }else{
             this.addFieldError(fieldName,"sorry ,this is only design for chinses!");


 

我在这里增加了错误信息的,但是为什么显示不出来

显示的是:

 

 

是不是因为

的原因。但是如果我去掉了message里面的字符,就没有显示了。

 

是个问题,有待解决。

 

睡觉了吧,12:45了。估计等我上床就1点多了,明天再说。不对,应该是今天迟点再说。。。。

 

未完待续。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值