2010-05-27 46 views
11

在我的屏幕上,我有一個下拉菜單(選擇框),在選擇該下拉列表中的任何選項時,我使用javascript/css顯示一個或多個文本框 - display:none和display:塊。所有這些輸入控件都採用相同的jsf格式。每個輸入控件都有自己的驗證器。問題是假設用戶選擇選項1從選擇框和不輸入值或inputbox1輸入一個錯誤的值, i。在驗證添加自定義的FacesMessage並且適當地示出並假設用戶選擇了選項2 第二次輸入錯誤值inputbox2然後在驗證器中添加另一個FacesMessage。但是現在這兩個消息都顯示 - 手段 - inputbox1和inputbox2的消息 - 這是錯誤的我的假設是,這是因爲它們存在相同的形式,它們的實例並沒有在FacesContext和UIView中被銷燬。我決定刪除郵件這種方式如何從FacesContext中移除FacesMessages?

Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages(); 
    while(msgIterator.hasNext()) 
    { 
     msgIterator.next(); 
     msgIterator.remove(); 
    } 

但是這有時會java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next

所以2個問題:

1)這樣刪除FacesMessages有什麼問題?我正在使用myfaces-api-1.2.3.jar和myfaces-impl-1.2.3.jar

2)是否有更好的方法來處理我的情況?我只希望每一個JSF請求被處理

感謝

回答

3

問題不在於我無法從FacesContext中刪除消息。問題在於,每次提交表單時都會有很少的輸入控件(它們沒有使用display:none顯示)保留了一些values(),因此Validators和Backing Bean代碼爲這些不可見的輸入控件添加了FacesMessages FacesContext的。現在,每次選擇選項已更改,我清除了其他不必要的表單字段,因此不會添加消息。

0

我不使用MyFaces的,所以我不能在這個具體的時間去展示培訓相關的消息,但在太陽RI(鑽嘴魚科)的大約1.5年前版本1.2_07修復了無法解決的面部信息問題。

因此,要實現您想要的功能,請嘗試將MyFaces升級到最新版本(它們可能已修復相同的錯誤),或者用Mojarra進行替換。

+0

感謝您的回答,問題不在於我無法從FacesContext中刪除郵件,問題是每次提交表單時都會有很少的輸入控件(這些輸入控件沒有使用display:none),它保留了一些values(),所以Validators和Backing Bean代碼爲FacesContext中的那些不可見的輸入控件添加了FacesMessages。現在,每次選擇選項已更改,我清除了其他不必要的表單字段,因此不會添加消息。我對嗎? – gekrish 2010-05-27 15:19:49

4

據我所知,這是不夠的,因爲在

org.apache.myfaces.context.servlet.FacesContextImpl 

(版本:2.0.15,版本:1364593),有消息(_orderedMessages_messages)和你的方法2個清單隻清除_orderedMessages

要清除_messages做到這一點:

Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages(); 
while (itIds.hasNext()) { 
    List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next()); 
    if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException... 
     messageList.clear(); 
    } 
} 

也請注意,這是非常脆弱的,因爲它依賴於實施細節,但我找不到更好的辦法:(

+0

在JSF2.0(Mojarra)中,它也會拋出一個UnsupportedOperationException異常,即使列表不是空的。 – Jaumzera 2016-08-24 18:09:14

0
FacesContext context = FacesContext.getCurrentInstance(); 
Iterator<FacesMessage> it = context.getMessages(); 
while (it.hasNext()) { 
    it.next(); 
    it.remove(); 
} 
0
if (FacesContext.getCurrentInstance().getMessages() != null) { 
     FacesContext.getCurrentInstance().getMessages().remove(); 
    }