h:messages does not display messages when p:commandButton is pressed

喜欢而已 提交于 2019-11-26 11:16:25

问题


I have a problem with the h:messages tag in JSF that simply does not show any messages. In the Glassfish log are no errors when I click the button. The setup is as follows:

test.xhtml:

<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\" 
    xmlns:j=\"http://primefaces.org/ui\"
xmlns:f=\"http://java.sun.com/jsf/core\">
<h:head>
    <title>test</title>
    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />
</h:head>
<h:body>
    <h:messages globalOnly=\"true\"/>
    <h:form id=\"loginform\">         
        <p:commandButton id=\"testButton\" value=\"Test\"
          action=\"#{loginSessionBean.test()}\" />
    </h:form>
</h:body>
</html>

With The SessionScopedBean:

@ManagedBean
@SessionScoped
public class LoginSessionBean implements Serializable {

private static final long serialVersionUID = 1L;
...
public String test(){
     FacesContext fc = FacesContext.getCurrentInstance();
     fc.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, \"Test!\", null)); 
    return \"\";
}

回答1:


You're sending an ajax request with PrimeFaces <p:commandButton>. Ajax requests have by default no form of feedback (unless PrimeFaces' autoUpdate="true" is been used somewhere). You should be explicitly specifying parts of the view which you'd like to update on ajax response.

One way is specifying the update attribute on <p:commandButton> to point to the client ID of the <h:messages> component.

<h:messages id="messages" ... />
<h:form>         
    <p:commandButton ... update=":messages" />
</h:form>

Another way is to replace it by PrimeFaces <p:messages> which has an autoUpdate attribute for the purpose of automatic update on ajax response.

<p:messages ... autoUpdate="true" />
<h:form>         
    <p:commandButton ... />
</h:form>

A completely different alternative is to turn off ajax by adding ajax="false" attribute to the button, this way a synchronous postback will be performed which effectively results in a full page update, exactly like as how the standard JSF <h:commandButton> behaves when used without <f:ajax>.

<h:messages ... />
<h:form>         
    <p:commandButton ... ajax="false" />
</h:form>

See also:

  • Understanding PrimeFaces process/update and JSF f:ajax execute/render attributes


来源:https://stackoverflow.com/questions/16175178/hmessages-does-not-display-messages-when-pcommandbutton-is-pressed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!