在JSF 2中对定制验证器进行参数化

在JSF 2中编写自定义验证器并不复杂。 您实现Validator接口,添加@FacesValidator批注,并在faces-config.xml中插入Validator声明, 仅此而已 。 一块蛋糕。 但是,让我们考虑以下情形:

您需要自定义日期验证器,比方说检查rich:calendar中的日期是否不是过去的日期。 因此,我们在日历组件中放置了验证器。

<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd">
        <f:validator validatorId="dateNotInThePast"/>
    </rich:calendar>

我们的验证器可能如下所示:

@FacesValidator("dateNotInThePast")
public class DateNotInThePastValidator implements Validator {

  @Override
  public void validate(FacesContext facesContext, UIComponent uiComponent, Object value)
                                                              throws ValidatorException {
    if (ObjectUtil.isNotEmpty(value)) {
      checkDate((Date)value, uiComponent, facesContext.getViewRoot().getLocale());
    }
  }

  private void checkDate(Date date, UIComponent uiComponent, Locale locale) {
    if(isDateInRange(date) == false) {
      ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
      String messageText = rb.getString("date.not.in.the.past");
      throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                     messageText, messageText));
    }
  }

  private boolean isDateInRange(Date date) {
    Date today = new DateTime().withTime(0, 0, 0, 0).toDate();
    return date.after(today) || date.equals(today);
  }
}

如果我们在属性文件中提供键值,我们将看到类似以下内容:

因此,看来我们已经可以使用生产就绪的自定义验证器。

问题

但是,当我们的表格变得越来越复杂时,我们可能会遇到以下屏幕上描述的问题:

因此,问题在于用户如何确定哪个日期有效和哪个日期无效? 我们的验证器使用相同的属性键来显示两个错误消息。

解决方案

我们需要以某种方式向我们的自定义验证器提供已验证字段的标签。 而且,对于JSF而言,令人惊讶的是,它可以很容易地实现。 唯一的问题是您必须知道如何做 :)

因此,在Java Server Faces中,我们可以对具有属性( f:attribute标签)的组件进行参数化。 因此,我们将属性添加到rich:calendar,然后在分配给此日历字段的验证器中读取此传递的值。 因此,现在我们的日历组件应如下所示:

<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd">
        <f:validator validatorId="dateNotInThePast"/>
        <f:attribute name="fieldLabel" value="Date field 2" />
    </rich:calendar>

在我们的验证器Java类中,我们可以使用uiComponent.getAttributes()。get(“ fieldLabel”);获得此值

private void checkDate(Date date, UIComponent uiComponent, Locale locale) {
        if(isDateInRange(date) == false) {
            ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            String messageText = getFieldLabel(uiComponent) +" " + rb.getString(getErrorKey());

            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                            messageText, messageText));
        }
    }

    protected String getFieldLabel(UIComponent uiComponent) {
        String fieldLabel = (String) uiComponent.getAttributes().get("fieldLabel");

        if(fieldLabel == null) {
            fieldLabel = "Date" ;
        }

        return fieldLabel;
    }

我们错误的属性值应为过去的值,因为日期或字段标签将添加到错误消息的开头。

工作示例应显示与此屏幕类似的内容:

参考:来自Code Hard Go Pro博客的JCG合作伙伴 Tomasz Dziurko 在JSF 2中对定制验证器进行参数化

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/10/parametrizing-custom-validator-in-jsf-2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值