2011-09-21 83 views
2

我遇到問題。我需要知道我的頁面是否有全局錯誤。這是因爲我有2個不同的h:messages(錯誤容器)從FacesContext獲取當前全局消息

<h:messages id="errorMsgsContainer" 
layout="table" 
rendered="true" 
styleClass="message-container error-message" 
infoClass="info" 
errorClass=" error" warnClass="warn-message warn" globalOnly="true"/> 

<h:messages id="errorMsgsContainerValidation" 
layout="table" 
styleClass="message-container error-message-validation" 
infoClass="info" 
errorClass="error" globalOnly="false"/> 

一個將顯示業務相關的消息和其他將只顯示驗證消息。由於業務需求,有兩個messages

當生成驗證錯誤消息時,facelet工作正常,因爲messages標記之一具有globalOnly="true"屬性值對。

問題出在我有全球唯一的錯誤。它會出現在兩個框中。

我想知道是否有任何錯誤是全局的,所以我不顯示驗證容器,直到用戶在我的表單上修復了全局錯誤。

我試着

FacesContext.getCurrentInstance().getMessageList().get(i).getSeverity() 

和其他一些命令來得到它通過FacesContext但它似乎並沒有工作。

請幫我解決這個問題。如何獲取當前的全局消息列表,以便我知道是否有全局錯誤?

回答

3

當生成驗證錯誤消息時,facelet正常工作,因爲其中一個消息標記具有globalOnly =「true」屬性值對。

這是不正確的。您將看到有關驗證錯誤的消息,其他h:messages標記使用globalOnly="false"屬性值對。驗證消息始終有一個客戶端Id,它恰好是未通過驗證的表單元素的Id,因此將顯示在允許顯示非全局消息的messages標記中,或者具有for屬性集的值到適用的Id。

問題出在我有全球唯一的錯誤。它會出現在兩個框中。

這是預期的行爲。我相信你已經混淆了globalOnly屬性的含義。當globalOnly屬性的值爲true時,將只顯示全局消息(即沒有客戶端ID的消息);當值爲false時,除了已排隊的其他消息外,還會顯示全局消息。這可以解釋爲什麼全局消息顯示兩次 - 第一個h:messages標記將顯示全局消息,因爲它應該只顯示全局消息,而第二個會顯示它,因爲它可以顯示它。

請幫我解決這個問題。如何獲取當前的全局消息列表,以便我知道是否有全局錯誤?

如果你想繼續在你的facelet裏2個h:messages標籤,那麼你可以排隊時顯示你的FacesMessage S,而不是指定的null的標識使用「僞全球」 ID;僞全球Id的在下面的示例中的值是inputForm它是(形式)有效的客戶端的ID就不會在這種情況下產生的任何驗證消息:

FacesContext.getCurrentInstance().addMessage("inputForm", new FacesMessage(FacesMessage.SEVERITY_INFO, "Added a global message", null)); 

可以再加入一個EL表達以使messages標籤負責輸入驗證消息的顯示:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
... 
    <h:form id="inputForm"> 
    ... 
    </h:form> 
    <h:messages id="psuedoGlobalMessages" for="inputForm" globalOnly="true" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" /> 
    <h:messages id="clientMessages" rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}" globalOnly="false" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" /> 
... 

注意,在只有一個messages標籤使用globalOnly屬性。如果通過在rendered屬性中指定的EL表達式將僞全局消息排隊等待顯示,則也不會顯示相同的messages標記。您還可以使用專門創建的隱藏表單元素的客戶端ID來引導所有僞全局消息,而不是表單的客戶端ID。在維尼特雷諾的回答

rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}" 

0

試試這個:而不是

rendered="#{not empty facesContext.getMessageList('inputForm')}