从bean方法触发的自定义消息

时间:2013-10-08 13:34:08

标签: jsf

我的页面上有一个命令按钮。

<h:commandButton id="makeSearch" value="#{msg.makeWycena}">
     <f:ajax event="click" render="@all" listener="#{searchBean.makeSearch()}"/>
</h:commandButton>

makeSearch()方法首先检查数据库中的值,如果此值为null,则执行某些逻辑。但是当值不是null时,我想显示错误消息。

由于这个原因,我考虑制作<h:outputtext rendered = {not null XXX}/>并制作特殊变量XXX,但我非常确定可以使用普通<h:message />形式完成,但无法找到。

我的代码如下所示:

else {
            FacesContext fc = FacesContext.getCurrentInstance();
            fc.addMessage(null , new FacesMessage("XXXXXXXX"));
            return null;
        }

我希望消息XXXXXXXXX显示在:

 <h:message for="makeSearch" globalOnly="true" style="color:red;margin:8px;"/>

我之前发布的命令按钮旁边。现在它呈现在页面底部


经过几次更改后,我的代码现在看起来像这样:

<h:form id="detailsForm" prependId="false">
  <h:commandButton id="makeSearch" value="#{msg.makeWycena}">
  <f:ajax event="click" render="@all" listener="#{searchBean.makeSearch()}"/>
</h:commandButton>
<h:message for="makeSearch" id ="makeSearchError" style="color:red;margin:6px;left-margin:10px;"/>

和bean代码:

else {FacesContext.getCurrentInstance().addMessage("detailsForm:makeSearchError" ,
   new FacesMessage("XXXXXXXXXXXX")); }

但仍然。消息不会在h:message中呈现。我也尝试了detailForm:makeSeach,它也无济于事

1 个答案:

答案 0 :(得分:0)

facesContext.addMessage(null, message)最终位于<h:messages globalOnly="true">,而不是<h:message for="...">。请注意,globalOnly="true"上的<h:message>not supported

所以,替换

<h:message for="makeSearch" globalOnly="true" style="color:red;margin:8px;"/>

通过

<h:messages globalOnly="true" style="color:red;margin:8px;"/>

对于您根据评论尝试使用固定消息客户端ID,这也是无效的。您应该通过其for属性指定与消息关联的组件的客户端ID,而不是消息组件本身。所以,你不应该使用

facesContext.addMessage("detailsForm:makeSearchError", message);

但是

facesContext.addMessage("detailsForm:makeSearch", message);

毕竟,如果您只是将<h:message>修改为真<h:messages>,则不需要这样做。