ravi
ravi

Reputation: 6328

Primefaces growl is not working in all the pages

My web has a common template i.e. xhtml file while contains growl

<p:growl id="message" showDetail="true" life="3000" />

This template is used further in all pages. I noticed that growl is working for page index.xhtml but not working in rest of the pages. Below is the snippet of faces-config.xml file-

<navigation-rule>
    <display-name>index.xhtml</display-name>
    <from-view-id>/index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>NORMAL_USER</from-outcome>
        <to-view-id>/home.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

But whenever I am accessing the page home.xhtml via link http://localhost:8080/portal/home.xhtml, growl starts working. In all the pages I am using update=":message" to update growl. Which is the culprit?

Below is index.xhtml

<ui:composition template="/template/common/base.xhtml"
    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:p="http://primefaces.org/ui">

    <ui:define name="center">

        <h:form>
            <div align="center" style="margin-top: 10%; margin-bottom: 10%;">
                <p:panelGrid columns="2">
                    <f:facet name="header">  
                     #{msg.HEADER}
                    </f:facet>

                    <h:outputLabel for="username" value="#{msg.USERNAME}" />
                    <p:inputText id="username" value="#{client.user.username}"
                        required="true" requiredMessage="#{msg.USERNAME_REQUIRED_MSG}" />

                    <h:outputLabel for="password" value="#{msg.PASSWORD} " />
                    <p:password id="password" value="#{client.user.password}"
                        required="true" requiredMessage="#{msg.PASSWORD_REQUIRED_MSG}" />

                    <f:facet name="footer">
                        <div align="right">
                            <p:commandButton value="#{msg.LOGIN_BUTTON}" icon="ui-icon-check"
                                update=":message" action="#{client.login}" />
                        </div>
                    </f:facet>
                </p:panelGrid>
            </div>
        </h:form>

    </ui:define>
</ui:composition>

Below is base.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>My Web Portal</title>
    <h:outputStylesheet library="css" name="default.css" />
</h:head>

<h:body>

    <p:growl id="message" showDetail="true" life="3000" />

    <h:link outcome="index" style="text-decoration: none;">
        <div id="header" style="margin: 2px; width: 100%; text-align: center;">
            <p:panel>
                <h:outputText value="My Web Portal"
                    style="font-size: 20px; " />
            </p:panel>
        </div>
    </h:link>

    <div id="middle" style="margin: auto; width: 80%;">
        <ui:insert name="center"></ui:insert>
    </div>

    <div id="footer"
        style="clear: both; text-align: center; margin: 2px; width: 100%;">
        <p:panel header="2013 All rights reserved. Designed by Ravi Joshi">
            <h:link value="Home" outcome="index" />
            <p:spacer width="10px;" />
            <h:link value="About Us" outcome="index" />
            <p:spacer width="10px;" />
        </p:panel>
    </div>

</h:body>
</html>

The next page home.xhtml is also using base.xhtml in the same way as index.xhtml is using it... Below is the snippet of it-

<ui:composition template="/template/common/base.xhtml"
    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:p="http://primefaces.org/ui">

    <ui:define name="center">

    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->
    <!--  -->


    </ui:define>
</ui:composition>

Upvotes: 4

Views: 15868

Answers (1)

&#214;mer Faruk Almalı
&#214;mer Faruk Almalı

Reputation: 3822

If a parent of the with the UICommand button is been rendered/updated by an ajax request beforehand, then the first action will always fail. The second and subsequent actions will work. This is caused by a bug in view state handling which is reported as JSF spec issue 790 and fixed in JSF 2.2. For JSF 2.0 and 2.1 you need to explicitly specify the ID of the in the render of the <f:ajax>

Says BalusC here. So in your case you are doing navigation to another page and stucks into that view state bug, ajax=false indicates submit the button without AJAX that's why it works.

Also BalusC suggests to use a script which fixes this bug here.

Upvotes: 5

Related Questions