jsf2使用FacesMessages突出显示组件(o:突出显示)

时间:2013-06-20 08:10:10

标签: jsf-2 omnifaces

我有一些输入组件只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

这种方式我不能使用普通的验证器,而是有一个commandButton来评估它的动作方法中的数据,并创建一些与特定clientIds相关的FacesMessages,如果缺少某些东西。

现在我正式使用OmniFaces o:highlight组件指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此突出显示组件不会将它们考虑在内。< / p>

现在我想知道是否有可能将此行为依赖于带有消息的ID列表。

这样的事情:

for (Iterator<String> it = FacesContext.getCurrentInstance()
                .getClientIdsWithMessages(); it.hasNext();) {
        String clientId = it.next();
        List<FacesMessage> messageList = FacesContext
                .getCurrentInstance().getMessageList(clientId);
        if (messageList != null) {
            for (FacesMessage msg : messageList) {
                ... // build json with clientIds (maybe check for UIInput
            }
        }
}

如果需要这样,可能会为信息,警告和错误消息引入新的Style类。也许它甚至更快一点,因为不是必须访问整个组件树,但这只是猜测。

那你的意见是什么?这是对当前行为的一个相当严格的改变,所以我不确定这个猜测是否会使它变成全方位或必须单独实施。

1 个答案:

答案 0 :(得分:0)

  

现在我想知道是否有可能将此行为依赖于带有消息的ID列表。

来自与linked完全相同的方法的javadoc:

  

请注意,也可以参考FacesContext#getClientIdsWithMessages(),但它并不表示与这些客户端ID关联的组件实际上是UIInput组件,而不是UIInput#isValid()

因此,您希望每个客户端ID仍然需要使用UIViewRoot#findComponent()来查找组件,确定其类型并验证其有效性。这比一次树访问要贵得多。

如果您确实需要在操作方法中执行验证,最好的办法是将上下文和输入标记为无效。

FacesContext context = FacesContext.getCurrentInstance();
context.validationFailed();
((UIInput) context.getViewRoot().findComponent(clientId)).setValid(false);

或者,为了满足具体的功能要求,

  

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

只需使用普通验证器,您可以检查调用的操作:

public void validate(FacesContext context, UIComponent component, Object value) {
    if (!context.getExternalContext().getRequestParameterMap().containsKey("formId:buttonId")) {
        return;
    }

    // ...
}

即。调用<h:form id="formId"><h:commandButton id="buttonId">时,将执行验证。这总比在错误的地方执行验证更好。