当前位置: 首页 > 面试题库 >

如何验证vaadin形式的字段

何安宜
2023-03-14
问题内容

我正在使用vaadin进行Java项目。现在,我有一个用户注册表格,看起来像这样:

public class RegistrationComponent extends CustomComponent implements View {

    public static final String VIEW_NAME = "Registration";
    public RegistrationComponent(){
        Panel panel = new Panel("Registration Form");
        panel.setSizeUndefined();
        FormLayout content = new FormLayout();
        CheckBox checkBox1, checkBox2, checkBox3;
        checkBox1 = new CheckBox("Check Box 1");
        checkBox2 = new CheckBox("Check Box 2");
        checkBox3 = new CheckBox("Check Box 3");
        checkBox1.setRequired(true);
        checkBox2.setRequired(true);
        TextField mailTextField = new TextField("Email Address");
        TextField passwordTextField = new TextField("Password");
        TextField confirmPasswordTextField = new TextField("Confirm Password");
        final Button submitButton = new Button("Submit");
        content.addComponent(mailTextField);
        content.addComponent(passwordTextField);
        content.addComponent(confirmPasswordTextField);
        content.addComponent(checkBox1);
        content.addComponent(checkBox2);
        content.addComponent(checkBox3);
        content.addComponent(submitButton);
        content.setSizeUndefined(); // Shrink to fit
        content.setMargin(true);
        panel.setContent(content);
        setCompositionRoot(panel);



        //listeners:

        submitButton.addClickListener(new Button.ClickListener() {
            public void buttonClick(Button.ClickEvent event) {
                //
            }
        });

    }
    @Override
    public void enter(ViewChangeListener.ViewChangeEvent event){
        //
    }
}

当然,该表单除了显示之外不做任何其他事情。我想做的是,如果不满足某些要求,请让Vaadin在字段旁边显示错误消息。要求本身并不那么重要(假设我希望电子邮件字段至少包含8个字符)。我想知道的是:有没有简单的内置方法可以做到这一点?我在这里:https
:
//vaadin.com/api/com/vaadin/data/Validator.html

但我不明白如何使用验证器,即使那是我要使用的验证器。我一直在Google各处寻找用法示例,但到目前为止没有成功。感谢帮助!


问题答案:

以下内容适用于Vaadin7。Vaadin 8中的validate()方法已被删除。

Vaadin中的所有Field类型都实现了Validatable接口,该接口具有addValidator接受Validator实现作为参数的方法。

因此,要添加一个验证器来检查TextField值的长度,您可以这样做:

TextField textField = new TextField();

        textField.addValidator(

                new StringLengthValidator(
                     "Must be between 2 and 10 characters in length", 2, 10, false));

Vaadin字段具有内置功能,可向用户显示验证错误。默认情况下,该字段将以红色突出显示,并且该字段旁边会出现一个感叹号,将鼠标悬停在该字段上会向用户显示更详细的消息。

自动验证

默认情况下,该字段现在将在下一个服务器请求上验证,该请求包含服务器对该字段的更改值。如果将该字段设置为“立即”,则会在该字段失去焦点时发生。如果该字段不是立即数,则当其他一些UI操作触发向服务器的请求时,将进行验证。

显式验证

有时,您可能希望对何时进行验证以及何时向用户显示验证错误进行更多控制。通过设置validationVisible为false 可以禁用自动验证。

textField.setValidationVisible(false);

准备好验证字段时(例如,在按钮单击侦听器中),可以
在TextField实例上显式调用validate(也可以使用,commit()如果它是缓冲字段)方法来触发验证。如果该值无效,validate将抛出InvalidValueException。如果要使用TextField组件中包含的内置验证错误显示,则还必须将其设置validationVisibletrue

try {
    textField.validate();
} catch (Validator.InvalidValueException ex) {
    textField.setValidationVisible(true);
    Notification.show("Invalid value!");
}

请注意,将validationVisbible设置为true后,验证将隐式进行,因此,如果您要保持对验证的显式控制,则必须记住在下一个请求时将其设置为false。

验证信息

可以从Validator.InvalidValueException实例中提取单个验证消息,该实例在validate()commit()调用时引发。

try {
    textField.validate();
} catch (Validator.InvalidValueException ex) {
    for (Validator.InvalidValueException cause: ex.getCauses()) {
        System.err.println(cause.getMessage());
    }
}

验证者

验证程序实现了验证程序接口,并且Vaadin附带了几个有用的验证程序。查阅API文档以获取有关这些的更多信息:https
:
//vaadin.com/api/7.4.5/com/vaadin/data/Validator.html

自定义验证器易于实现,这是摘自Vaadin的示例:

class MyValidator implements Validator {
    @Override
    public void validate(Object value)
            throws InvalidValueException {
        if (!(value instanceof String &&
                ((String)value).equals("hello")))
            throw new InvalidValueException("You're impolite");
    }
}


final TextField field = new TextField("Say hello");
field.addValidator(new MyValidator());
field.setImmediate(true);
layout.addComponent(field);


 类似资料:
  • 我一直在试用Vaadin 7。首先,我必须说明我对Vaadin是个安静的呆子,对JAVA Perstression不是很熟悉。因此,我试图学习bean验证以及如何使用它。我已经学习了几个教程,但是很难确定哪一个是Vaadin7的最新和正确的教程。尽管如此,我尝试下载并使用JPA容器和BeanValidator,但无法使其工作。下面是我正在使用的代码: 而且 classnotfound异常已消失,但

  • 本文向大家介绍如何在C#中使用TryParse验证数字表示形式的字符串,包括了如何在C#中使用TryParse验证数字表示形式的字符串的使用技巧和注意事项,需要的朋友参考一下 以下是我们的字符串- 若要检查上面是否是带有数字表示形式的字符串,请使用TryParse and out。 这是完整的代码。 示例 输出结果

  • 问题内容: 具有角形的这种普通(名称属性由服务器要求)形式,无法弄清楚如何使验证有效。我应该在ng-show =“ TODO”中添加什么 http://jsfiddle.net/Xk3VB/7/ ps:这只是一种形式,更复杂 谢谢 问题答案: AngularJS依靠输入名称来暴露验证错误。 不幸的是,到目前为止,不可能(不使用自定义指令)动态生成输入的名称。确实,检查输入文档,我们可以看到name

  • 页上的窗体调用控制器中的方法。从控制器调用验证器。 如果用户输入了一个非数字值,我相信我可以使用以下方法来检查: typemismatch.java.lang.integer=您在一个需要数字的字段中输入了一个非数字值... 但是我的问题涉及到数据库中用户ID的检查,即如果ID不存在,那么输入应该被拒绝。 那么,服务可以在验证器类中使用吗?对此有什么反对的考虑吗?

  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 我希望根据模式的maximal/minimum(number)或maximumlength/minimumlength(string)来验证模式。我有一个json表单: 为什么这个例子不能使用验证?我的模型未验证为false。根据本文档,可以在数组中定义不同的类型,但是如何基于最小/最大值进行验证呢?