使用者输入验证

允许使用者输入几乎是每个系统都需要的功能,为了确保资料内容或格式的正确性,通常会加上一些资料验证规则来确保使用者输入是符合预期的,以下介绍几种 zk 的输入验证方法。

client端验证: constraint

内建规则

每个输入元件都支援 constraint 属性,你可以指定许多内建的验证规则。例如,先前所提的英雄列表范例中,我不允许英雄的名字为空字串。
https://ithelp.ithome.com.tw/upload/images/20210927/20050621kiDUj954nZ.jpg

我可以这麽做:

<textbox id="newNameBox" ... constraint="no empty: 不能为空字串"/>
  • 冒号的後面是错误讯息,当输入违反验证规则时就会显示该讯息

可指定多个规则:

<datebox constraint="no empty, no future: now or never"/>

正规表示式

可自定 regular expression 来验证:

<textbox constraint="/.+@.+\.[a-z]+/: e-mail address only"/>

ZK 内建 constraint 是在浏览器端由 JavaScript 实作来验证。

自订 Constraint

如果内建规则不能满足,例如要验证的是自订的业务逻辑,则可自行实作 Constraint
https://ithelp.ithome.com.tw/upload/images/20210927/20050621yTGPPxkg0x.jpg

public class EvenNumberConstraint implements Constraint {
    public void validate(Component comp, Object value) throws WrongValueException {
        if (value != null && Integer.valueOf(value.toString()).intValue() % 2 == 1)
            throw new WrongValueException(comp, "Only even numbers are allowed, not "+value);
    }
}

然後指定给某个输入元件:

<?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c"?>
<textbox constraint="${c:new('quickstart.validate.EvenNumberConstraint')}"/>

上面这个例子,我用了ZK 内建的 tag library 来产生一个新物件。

合并验证

如果你已经用了 client端 constraint,又需要在服务器验证,就可用 onChange 倾听器做验证:
https://ithelp.ithome.com.tw/upload/images/20210927/20050621w4XVywBytQ.jpg

public class ValidateComposer implements Composer {
    @Override
    public void doAfterCompose(Component comp) throws Exception {
        if (comp instanceof Textbox){
            comp.addEventListener(Events.ON_CHANGE, event -> {
               Textbox box = (Textbox) comp;
                if (box.getValue().length() <= 1){
                    throw new WrongValueException(box, "至少要超过一个字");
                }
            });
        }
    }
}
  • 当验证失败时,必须要丢出 WrongValueException,传入的字串就是会显示在画面上的错误讯息
  • box 传进 WrongValueException,错误讯息才会显示在 <textbox>

用 apply 套在元件上:

<textbox constraint="no empty" apply="quickstart.validate.ValidateComposer"/>

这是另一种实作控制器的方法:只实作 Composer 介面,覆写 doAfterCompose() 即可。通常用在你要对元件加上客制化行为时,而实作在一个特定的控制器可以让你很容易地套用在不同元件上,又可以轻易地拿掉。

继承预设 SimpleConstraint

另一种做法就是继承 ZK 内建的验证类别,然後加上自订的验证规则:
https://ithelp.ithome.com.tw/upload/images/20210927/20050621zx9Ps89w8C.jpg

public class YouthConstraint extends SimpleConstraint {

    /* 初始化念间规则 */
    public YouthConstraint(int flags) {
        super(flags);
    }

    /* 自订验证规则 */
    @Override
    public void validate(Component comp, Object value) throws WrongValueException {
        if (value != null && Integer.valueOf(value.toString()).intValue() >=18)
            throw new WrongValueException(comp, "必须小於 18");
    }
}

在控制器中指定要用的验证规则:

public class YouthValidationComposer implements Composer {
    @Override
    public void doAfterCompose(Component component) throws Exception {
        if (component instanceof Intbox){
            Intbox box = (Intbox) component;
            box.setConstraint(new YouthConstraint(SimpleConstraint.NO_NEGATIVE+
                    SimpleConstraint.END_AFTER));
        }
    }
}

套在元件上时,要加上一个空的 onChange 倾听器,让元件把值送到服务器:

<intbox apply="quickstart.validate.YouthValidationComposer" onChange=""/>

参考:


<<:  Day 14:vim-plug

>>:  [Day 12] Create新增资料

Day27 Javascript元件库 Jquery介绍

今天要接触我们的Javascript,让网页更多动画,互动性,不是一个只有图片跟文字的死板网页,而J...

不只懂 Vue 语法:什麽是 slot?请示范 slot 的用法?

问题回答 slot(插槽)的概念是把外层的内容塞进子元件的指定位置里。跟插槽的字面意思一样,前提是:...

离职倒数24天:说出内心烦恼、学到新知识、得到新的角度,三个愿望一次满足

最近看了很多好书,看完的共通感想是,为什麽以前没人推荐我看这些?如果早点看,不知道可以少走多少弯路。...

Gulp 基础介绍 gulp-sass DAY80

今天要来介绍 gulp-sass 如何安装与使用 gulp-sass 介绍 https://www....

30天打造品牌特色电商网站 Day.24 电商必用的各类提示

相信大家使用网站时,一定会遇到大大小小固有或弹出的提示框,这次的主题就是他! 提示框在用户经验上会以...