gpt4 book ai didi

validation - 我可以使用 JSF 标记中指定的选项制作 JSF 验证器吗?

转载 作者:行者123 更新时间:2023-12-01 08:36:48 24 4
gpt4 key购买 nike

例如:我有一个 JSF Validator 来验证电子邮件:

@FacesValidator(value="validateEmail")
public class Email implements Validator
{

private static final String EMAIL_REGEXP =
"^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

@Override
public void validate(FacesContext context, UIComponent c, Object val) throws ValidatorException
{
String email = (String) val;
Pattern mask = null;
mask = Pattern.compile(EMAIL_REGEXP);
Matcher matcher = mask.matcher(email);

if (!matcher.matches()) {
FacesMessage message = new FacesMessage();
message.setDetail("Must be of the form xxx@yyy.zzz");
message.setSummary("E-mail Addresss not valid");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(message);
}
}
}

如果用户不输入电子邮件,此验证器将引发异常。但是有时我想让电子邮件成为可选字段。有没有一种方法不需要我编写不同的验证器?

理想情况下,我希望它检查使用它的 JSF 标记中某处的参数。

最佳答案

要回答您的具体问题,您可以使用 <f:attribute>它包含在同一个组件中。

<h:inputText>
<f:validator validatorId="validateEmail" />
<f:attribute name="foo" value="bar" />
</h:inputText>

validate()里面UIComponent#getAttributes()提供的方法第 2 次 UIComponent论据。

String foo = component.getAttributes().get("foo"); // bar

但是,在您的特定情况下,更好的解决方案是让验证器 return当值为 null 或为空时。

if (email == null || email.isEmpty()) {
return;
}

在 JSF 1.x 中这不是必需的,因为当输入为 null 或为空时不会调用验证器。但是在 JSF 2.x 中,为了支持 JSR303 bean 验证,这已经改变了。因此,如果您想跳过对空字段的验证,则需要在每个 JSF Validator 中进行检查。 .

请注意,当您的 web.xml 中有此内容时

<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>

那么您可以放心地省略 email.isEmpty()部分检查,因为它总是 null而不是一个空字符串。


与具体问题无关,您所拥有的模式已经过时。这些天 unicode 字符是 allowed在电子邮件地址中。

private static final String EMAIL_REGEXP = "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)";

(注意 ^$ 是不必要的,因为 Pattern 已经隐式使用了它)

此外,我还建议执行 Pattern#compile()直接在 static final多变的。编译模式相对昂贵,并且 Pattern无论如何,实例都是线程安全的。

private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEXP);

关于validation - 我可以使用 JSF 标记中指定的选项制作 JSF 验证器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com