如何validationvaadin中的字段
我正在用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
但我不明白如何使用validation器,或者即使这是我想要使用的。 我一直在谷歌寻找用法示例,但到目前为止没有成功。 感谢帮助!
瓦丁7
以下内容适用于Vaadin 7.在Vaadin 8中已删除validate()方法。
Vaadin中的所有Field类型都实现了Validatable
接口,该接口具有addValidator
方法,该方法接受Validator的实现作为参数。
因此,要添加一个检查TextField值的长度的validation器,您可以这样做:
TextField textField = new TextField(); textField.addValidator( new StringLengthValidator( "Must be between 2 and 10 characters in length", 2, 10, false));
Vaadin字段具有用于向用户显示validation错误的内置function。 默认情况下,该字段将以红色突出显示,并且该字段旁边会出现一个感叹号,将鼠标hover在该字段上将向用户显示更详细的消息。
自动validation
默认情况下,该字段现在将在下一个服务器请求上进行validation,该请求包含服务器字段的更改值。 如果该字段设置为“立即”,则在该字段失去焦点时会发生这种情况。 如果该字段不是立即的,则当某个其他UI操作触发返回服务器的请求时将进行validation。
明确validation
有时,您可能希望对validation何时发生以及何时向用户显示validation错误进行更多控制。 通过将validationVisible
设置为false,可以禁用自动validation。
textField.setValidationVisible(false);
当您准备好validation字段时(例如,在按钮单击侦听器中),您可以显式调用validate
(您也可以在TextField实例上使用commit()
如果它是缓冲字段)方法来触发validation。 如果值无效, validate
将抛出InvalidValueException
。 如果要使用TextField组件中包含的内置validation错误显示,则还必须将validationVisible
设置为true
。
try { textField.validate(); } catch (Validator.InvalidValueException ex) { textField.setValidationVisible(true); Notification.show("Invalid value!"); }
请注意,一旦validationVisbible设置为true,validation将隐式发生,因此如果要保持对validation的明确控制,则必须记住在下一个请求时将其设置为false。
validation消息
可以从Validator.InvalidValueException实例中提取单个validation消息,该实例在调用validate()
或commit()
时抛出。
try { textField.validate(); } catch (Validator.InvalidValueException ex) { for (Validator.InvalidValueException cause: ex.getCauses()) { System.err.println(cause.getMessage()); } }
validation器
validation器实现Validator接口,Vaadin附带了几个有用的validation器。 有关这些文档的更多信息,请查看API文档: https : //vaadin.com/api/7.4.5/com/vaadin/data/Validator.html
自定义validation器易于实现,这是一个取自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);
问题解决了,显然我以前看不够深。 它来了:
field.addValidator(new StringLengthValidator("The name must be 1-10 letters (was {0})",1, 10, true));
所有详细信息: https : //vaadin.com/book/-/page/components.fields.html
瓦丁8
使用Vaadin 8 com.vaadin.data.Binder
可以轻松validation您的字段。 请参阅手册中的将数据绑定到表单 。
创建TextField
和绑定器以validation文本字段。
public class MyPage extends VerticalLayout{ TextField investorCode = new TextField(); Binder beanBinder = new Binder (); //Info : MyBean class contains getter and setter to store values of textField. public MyPage (){ investorCode.addValueChangeListener(e->valueChange(e)); addComponent(investorCode); bindToBean(); } private void bindToBean() { beanBinder.forField(investorCode) .asRequired("Field cannot be empty") .withValidator(investorCode -> investorCode.length() > 0,"Code shold be atleast 1 character long").bind(MyBean::getInvestorCode,MyBean::setInvestorCode); } //rest of the code ..... private void valueChange(ValueChangeEvent e) { beanBinder.validate(); } }
从binder调用validate()将调用validation操作。
beanBinder.validate();
validation提交。 您可以从页面的任何位置调用此方法。 我过去常常在价值变化或点击按钮时调用它。