Reputation: 6328
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
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