【问题标题】:custom message fired from bean method从 bean 方法触发的自定义消息
【发布时间】:2013-10-08 13:34:08
【问题描述】:

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

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

makeSearch() 方法首先检查数据库中的值,如果这个值是null,它会执行一些逻辑。但是当值不是null 时,我想显示一条错误消息。

出于这个原因,我考虑过制作 &lt;h:outputtext rendered = {not null XXX}/&gt; 并制作特殊变量 XXX,但我很确定它可以用普通的 &lt;h:message /&gt; 形式完成,但找不到方法。

我的代码如下所示:

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 也没有帮助

【问题讨论】:

  • 使用&lt;h:messages&gt; 生成来自服务器的消息,而不是当前的&lt;h:message&gt;
  • 在我的特定页面中,我只有一条消息来显示这种方法很好,我会使用这个提示 :) 但是,我仍然想知道如何做,以防我几乎没有错误将来要在单独的消息框中显示的消息。
  • From [FacesContext#addMessage](docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/2.0/…, javax.faces.application.FacesMessage)) javadoc,第一个参数必须是客户端id。由于您正在设置null,这意味着它没有找到任何组件,因此它将直接转到&lt;h:messages&gt;。有关更多信息,请参阅此 Q/A:stackoverflow.com/q/315804/1065197
  • FacesContext.getCurrentInstance().addMessage("detailsForm:makeSearchError" , new FacesMessage("XXXXXXXXXXXXX"));我试过了 - 消息仍然呈现在消息框之外,所以我将消息更改为消息

标签: jsf


【解决方案1】:

facesContext.addMessage(null, message)&lt;h:messages globalOnly="true"&gt; 结尾,而不是 &lt;h:message for="..."&gt;。请注意,globalOnly="true"&lt;h:message&gt; 上是not supported

所以,替换

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

通过

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

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

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

而是

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

毕竟,如果您只是将&lt;h:message&gt; 修复为真正的&lt;h:messages&gt;,那就没有必要了。

【讨论】:

  • 正如我之前写的 - 我尝试了这两个: detailsForm:makeSearch 和 makeSearchError - 它们都不起作用,所以我将 &lt;h:message&gt; 更改为 &lt;h:messages&gt; 并且它起作用了。但是我在这个页面上只需要一个错误,如果我需要多个呢?
  • 以同样的方式再添加一条addMessage() 的消息。 &lt;h:messages&gt; 支持显示多条消息,而 &lt;h:message&gt; 不支持复数 s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2019-11-13
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多