【问题标题】:JSF Complex validation formatting using h:messages: How to get I18N message and label?使用 h:messages 的 JSF 复杂验证格式:如何获取 I18N 消息和标签?
【发布时间】:2013-12-07 19:06:28
【问题描述】:

当组件的验证失败时,我正在尝试做以下事情:

  • 将未通过验证的输入的边框更改为绿色
  • 将验证失败的输入边框更改为红色
  • 在页面顶部,呈现具有国际化标签/消息对的列表
  • 仅显示错误消息

到目前为止我所拥有的:

我使用 Bean 验证:

@Size(最小值 = 5,最大值 = 20)

我使用 JS/JQuery 管理着色,如下所示:

  • 我渲染了一个带有验证状态的隐藏字段:

styleClass="hidden #{facesContext.validationFailed?'failed-validation':'success-validation'}"

  • 在要验证的组件上,我设置了单独的验证状态:

#{component.valid?'input-valid-tobe':'input-error'}"

  • 在我的 Ajax 操作中,我注册了一个 onevent="xxx" 函数,该函数将 CSS 替换为正确有效的 CSS。即如果验证失败,我只想突出显示已验证的内容:
function xxx(data){
  if(data.status == "success"){
      if ($('.failed-validation')[0]){
          $('.input-valid-tobe').addClass('input-valid');
      }
  }
}

现在问题来了,渲染消息: 我想呈现一个显示组件标签和消息的列表。

消息

我想我可以像这里描述的那样使用 bean 验证 I18N 来获取消息:

How does it work with bean validation messages and i18n in JSF2? http://jcp.org/aboutJava/communityprocess/edr/jsr303/index.html

..但是,我希望 JSF 2.2 中可能有一些新东西!有吗?

标签:

<h:messages/> 不应该为输入字段呈现标签吗? (由于某种原因它没有)

过滤: 有没有办法通过severity 过滤消息?

(除了创建一个使用 CSS 隐藏我不想显示的消息的自定义 bean)

【问题讨论】:

    标签: jsf


    【解决方案1】:

    您可以通过ValidationMessages_xx_XX.properties 文件自定义和本地化它们。

    例如

    • ValidationMessages.properties - 默认语言环境(通常是美式英语,en_US
    • ValidationMessages_es.properties - 西班牙语
    • ValidationMessages_en_GB.properties - 英式英语

    如果在特定于语言环境的捆绑包中找不到条目,​​则会回退到默认捆绑包。


    至于标签,默认情况下确实不添加。您可以通过属性文件中由<message-bundle> of faces-config.xml 标识的以下条目轻松告诉JSF 为bean 验证消息添加JSF 标签前缀:

    javax.faces.validator.BeanValidator.MESSAGE = {1}: {0}
    

    {0} 是 bean 验证器的消息,{1} 是 JSF 组件的标签。因此,最终结果如下:

    组件标签:bean验证消息

    如果您想要更精细地控制标签的定位,您需要创建一个自定义 bean 验证消息插值器。 JSF utility library OmniFacessuch one


    至于过滤,<h:messages> 没有内置方法。您需要自己迭代消息。

    例如

    <ui:repeat value="#{facesContext.messageList}" var="message">
        <h:panelGroup rendered="#{message.severity.ordinal eq 2}">
            ERROR! #{message.summary}
        </h:panelGroup>
    </ui:repeat>
    

    【讨论】:

    • 有没有办法在 ValidationMessages.properties 中插入值?例如"EMAIL_invalid={value} : Not valid" 这类似于 "EMAIL_invalid={min}-{max} : Not valid" 但我想引用验证对象而不是静态 Annotation 参数
    • 查看编辑后的答案,其中现在包含指向 OmniFaces 示例的链接。
    • 感谢 BalusC。你的第一个建议对我有好处({1}: {0})。我一直在寻找的是在验证级别上进行插值。我创建了一个新问题,因为它的主题有点不同:stackoverflow.com/questions/20161837/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多