我正在使用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实现作为参数的方法。
Validatable
addValidator
因此,要添加一个验证器来检查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 可以禁用自动验证。
validationVisible
textField.setValidationVisible(false);
准备好验证字段时(例如,在按钮单击侦听器中),可以 在TextField实例上显式调用validate(也可以使用,commit()如果它是缓冲字段)方法来触发验证。如果该值无效,validate将抛出InvalidValueException。如果要使用TextField组件中包含的内置验证错误显示,则还必须将其设置validationVisible为true。
validate
commit()
InvalidValueException
true
try { textField.validate(); } catch (Validator.InvalidValueException ex) { textField.setValidationVisible(true); Notification.show("Invalid value!"); }
请注意,将validationVisbible设置为true后,验证将隐式进行,因此,如果您要保持对验证的显式控制,则必须记住在下一个请求时将其设置为false。
可以从Validator.InvalidValueException实例中提取单个验证消息,该实例在validate()或commit()调用时引发。
validate()
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);