22

バッキングBeanの@PostConstructメソッドで、EJBを呼び出します。これにより、p:messagesを介してページに表示したいメッセージが返される場合があります。ただし、FacesMessages(FacesContext.getCurrentInstance()。addMessage(...)など)を追加しても、p:messagesはFacesMessagesで更新されません。

代わりに、ページからのアクションでEJBの呼び出しを呼び出すと(たとえば、ユーザーがページ上のボタンをクリックして、EJBを呼び出し、FacesMessageを追加するメソッドを呼び出す)、メッセージはpを使用して表示されます。 :期待どおりのメッセージ。

@PostConstruct中にFacesメッセージを追加し、ページが最初にレンダリングされたときにそれらを表示するにはどうすればよいですか?

コード:

Page1Controller.java:

@ManagedBean
public class Page1Controller
{
    @PostConstruct
    public void init()
    {
        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage("Test Message from @PostConstruct"));
    }

    public String getValue()
    {
            return "Some Value";
    }

    public void triggerMessage(ActionEvent event)
    {
            FacesContext.getCurrentInstance().addMessage(null, 
                    new FacesMessage("Test Message from Trigger Button"));      
    }

}

page1.xhtml

   <h:form>
        <p:messages showDetail="true" showSummary="true" autoUpdate="true"/>
        <h:outputText value="#{page1Controller.value}"/>
        <br/>
        <p:commandButton value="Trigger Message" 
                         actionListener="#{page1Controller.triggerMessage}"/>  
   </h:form>
4

3 に答える 3

21

これは、メッセージが追加される前にメッセージ コンポーネントがレンダリングされるときに発生する可能性があります。

特定の例では、Bean はコンポーネントによって初めて参照されるため、<h:outputText>その時点で初めて構築されます。ただし、コンポーネントはコンポーネントの<h:outputText>特定の例に表示されるため、コンポーネントは既にレンダリングされているため、メッセージを表示するには遅すぎます。<p:messages><p:messages>

メッセージ コンポーネントがレンダリングされる前に、メッセージが追加されていることを何らかの形で確認する必要があります。1 つの方法は、 を使用すること<f:viewAction>です。INVOKE_APPLICATIONフェーズ前のフェーズ中に実行されRENDER_RESPONSEます。したがって、コンポーネントがレンダリングされる前に実行れます。したがって、絶好の機会です。

<f:metadata>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>

public void onload() {
    // Add message here instead of in @PostConstruct.
}

以下も参照してください。

于 2012-04-17T19:59:28.367 に答える
0

私にとって preRenderView イベントを使用してフォームの初期化にメッセージを表示することは、メッセージ地獄でした。そこで、静的メッセージを保持するための非常に単純な「コンポーネント」を作成しました。この例では、1 つのエラー メッセージのみがサポートされています。

staticMessage.xhtml:

<ui:fragment xmlns="http://www.w3.org/1999/xhtml"
             xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
             rendered="#{rendered}">
    <div id="staticMessage" class="ui-messages ui-widget" aria-live="polite">
        <div class="ui-messages-error ui-corner-all"><span class="ui-messages-error-icon"/>
            <ul>
                <li>
                    <span class="ui-messages-error-summary">#{value}</span>
                </li>
            </ul>
        </div>
    </div>
</ui:fragment>

メッセージを含む:

 <ui:include src="/template/components/staticMessage.xhtml">
     <ui:param name="rendered"value="#{beanMB.staticMessagesRendered}"/>
     <ui:param name="value" value="Place your message here."/>
 </ui:include>
于 2018-04-24T09:18:25.583 に答える