2010-02-26 156 views
1

我的頁面:自定義消息(JSF)

... 
    <div id="header"> 
     <!-- content header --> 
    </div> 
    <div id="content"> 
     <h:messages /> 
     <h:ouputText value="#{example.text}" /> 
    </div> 
... 

我managedBean:

public class ExampleManagedBean(){ 
     private String text; 


     public String getText(){ 
      FacesContext.getCurrentInstance(). 
        addMessage(null, 
         new FacesMessage(FacesMessage.SEVERITY_WARN, 
             "Warning message...", null)); 
      return text; 
     } 

     public void setText(String text){ 
      this.text = text; 
     } 
    } 

我的問題是,不是就是警告消息呈現在頁面中。爲什麼?

+0

有沒有''?頁面是否刷新? – Bozho 2010-02-26 11:23:35

+0

是的,有一個。 頁面未被刷新,因爲它是第一頁。 – bblanco 2010-03-02 08:57:27

+0

@Bozho:是否需要''來彈出顯示消息? – Rachel 2012-04-11 18:07:12

回答

1

FacesMessage發送到< h:messages/>在JSF生命週期的驗證階段。在你的情況下,getter用於派生bean屬性值,並且不會進行驗證,所以消息是空的。

理論上你可以使用setter驗證,但這是一個well known antipattern

你可以做「手」驗證,但以不同的方式

<div id="content"> 
    <h:messages /> 
    <h:form> 
     <h:outputText value="#{example.text}" /> 
     <h:commandButton value="Click" action="#{example.action}"/> 
    </h:form> 
</div> 

和操作方法是

public String action(){ 
    FacesContext.getCurrentInstance(). 
     addMessage(null, 
      new FacesMessage(FacesMessage.SEVERITY_WARN, 
             "Warning message...", null)); 
      return null; 
} 

更清潔的方法將使用內置或自定義的驗證。

+0

對不起,但你是完全錯誤的。 OP發佈的代碼是有效的,應該可以工作。 FacesMessages在renderresponse期間派生,無論它們被設置在哪裏。問題在於別的地方,OP還沒有根據Bozho的評論來澄清它。在那之前它只能在黑暗中拍攝。 – BalusC 2010-03-01 11:52:07

+0

是的,有一個。頁面沒有被刷新,因爲它是第一頁。 – bblanco 2010-03-02 11:09:08

3

我有兩個想法。

首先,將消息添加到getText()getter中。如果h:messages在h:outputText之前被渲染,那麼當h:messages被渲染時,消息可能還沒有在那裏。

其次,消息在重定向中消失。