【问题标题】:JSF2 custom UIComponent attributes data typesJSF2 自定义 UIComponent 属性数据类型
【发布时间】:2013-08-11 22:03:17
【问题描述】:

如何为 UIComponent 属性创建自定义数据类型?

示例:假设一个人有一个UIInputDate(一个UIInput)并且有一个属性Date maxDate,我将如何确保输入的任何maxDate 将始终返回Date

【问题讨论】:

  • 您的意思是,您要验证最终用户(特别是使用您的自定义组件的开发人员)指定的属性值?
  • 不是真的!我的自定义组件接受minDatemaxDate。我想要这样,无论 Java 中的日期格式如何,我都可以验证(用户)输入的值是否与开发人员指定的 minDatemaxDate 匹配。
  • 嗯,我了解到您询问如何验证开发人员是否指定了 java.util.Date 而不是例如java.lang.StringmaxDate。无论如何,答案很简单,使用验证器(您可以在组件的构造函数中添加一个)。但是,我仍然觉得你的问题令人困惑。
  • 哦,抱歉,我曾想过使用 String 作为属性类型,但要满足所有 RFC3339 日期格式的要求,这很具有挑战性。所以,我决定使用Date 作为属性类型。问题是开发人员如何将日期值设置为这些属性,并在以后的验证和转换中使用它?组件的值,我可以用转换器,那不是问题,是附加属性。

标签: java jsf-2


【解决方案1】:

您可以按照通常的方式创建自定义验证器。输入组件已作为第二个参数可用,您只需将其转换即可。

public class UIInputDateRangeValidator implements Validator {

    public void validate(FacesContext context, UIComponent component, Object value) {
        UIInputDate inputDate = (UIInputDate) component;
        Date minDate = inputDate.getMinDate();
        Date maxDate = inputDate.getMaxDate();
        Date date = (Date) value;

        // ... Use Date#after(), Date#before(), etc.
    }

}

您可以在自定义组件的构造函数中创建和添加验证器。

public UIInputDate() {
    addValidator(new UIInputDateRangeValidator());
    // You can use setConverter() with new DateTimeConverter() if you didn't already do that.
}

【讨论】:

  • 感谢 BalusC,我的问题是,开发人员如何在其 xhtml 页面上输入 minDatemaxDate 作为值(其中这些属性是 Date)?
  • 只是通常的方式? <your:inputDate minDate="#{bean.minDate}"> 等。我不了解您的具体问题。它与所有其他属性没有什么不同。
  • 我在想一些更像<your:inputDate minDate="new Date()" /> 的东西。如果那是不可能的,那么我会接受你之前的评论。
  • 至于 EL 中的 new Date(),不,那是不可能的。它确实需要是一个 bean 属性,甚至是整个 bean。您可以在 faces-config.xml 中将 java.util.Date 注册为托管 bean。 OmniFaces 在请求和应用程序范围内也有两个这样的 bean,分别为 #{now}#{startup}。相关:stackoverflow.com/questions/9174310/…
  • 感谢 BalusC,我想知道如何将 java.util.Date 作为 faces-config.xml 中的托管 bean。无论如何,如果一个组件有一个默认转换器并且开发人员在 xhtml 上明确链接另一个转换器,是否会覆盖默认转换器?
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2017-09-28
  • 2015-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多