我正在构建一个允许用户输入数据库连接参数的表单。一旦输入了参数用户可以测试(btnTester)是否可以与其参数建立连接。
在所有情况下,都会为用户生成一条消息。下面是来自后台bean代码的连接尝试失败的示例:
(...)
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
(...)
这是表单代码。我希望消息显示在p:消息中。不幸的是,什么也没发生。按钮后没有显示任何消息(连接成功与否)即使将全局属性设置为false或true。
<h:form prependId="false">
(...)
<h:panelGrid>
<!-- Other form components here -->
<f:facet name="footer">
<p:commandButton
id="btnTester"
value="Tester"
actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
update="msgTester" />
<p:message id="msgTester" for="btnTester" />
</f:facet>
</h:panelGrid>
</h:form>
我错过了什么
您的<p:commandButton>
上缺少一个update
属性,该属性指定要更新的<p:message>
组件的ID。
您应该给出消息组件和ID,并在命令按钮的update
中指定它。
我想你的问题在这里:
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
我假设你正在呼叫FacesContext.addMessage()
。第一个参数是组件id字符串。如果将其设置为null,则强制该消息为全局消息。您已经定义的<p:message>
组件被设置为for="btnTester"
,因此它将只显示具有与btnTester组件id匹配的组件id的消息。
除了来自Javadoc for addMessage()
:
如果clientId不为空,将FacesMessage附加到与指定客户端标识符关联的消息集中。如果clientId为空,则假定此FacesMessage不与任何特定的组件实例相关联。
链接到FacesMessage Javadoc的addMessage()方法
我用咆哮代替消息来解决我的问题。
找到了一个解决方案,可以完美地处理Prime face中的消息。
与你分享思想,即使你用咆哮解决了它
解决方案
addMessage有2个参数,一个uiccomponent Client Id和FacesMessage。facesMessage显示或定义消息,Component子Id显示组件的位置。这里你错过了组件部分。为了使其工作,您应该将uiccomponent绑定到bean类。这样它就可以找到组件。
在bean类
中定义ui组件与相应的命令按钮绑定
并从bean类
中的组件获取Id
你的代码必须像这样修改
> private UIComponent component;
(...)
addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Connection failed.", t.getLocalizedMessage()));
(...)
必须在xhtml文件中绑定uiccomponent
<h:form prependId="false">
(...)
<h:panelGrid>
<!-- Other form components here -->
<f:facet name="footer">
<p:commandButton
id="btnTester"
value="Tester"
actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
update="msgTester"
binding="#{assistantCreationSourcesBean.component}"/>
<p:message id="msgTester" for="btnTester" />
</f:facet>
</h:panelGrid>
</h:form>
现在消息将工作…!!对我来说,它工作得很好:)
这里的"for"属性对p:message不起作用,请使用p:messages。
<p:messages id="txtname" showIcon="false"
showDetail="true" showSummary="false"
redisplay="false" for="someKey" display="text"/>
我的猜测是您尝试更新尚未呈现的组件。试试这个
使用Firefox Firebug并检查html源代码,查看组件id msgTester
是否存在。如果不是,那么它解释了为什么你的更新不能工作。你不能更新不存在的东西。如何解决这个问题,你可以为此创建一个包装器,并更新你的包装器。您的包装器应该是它一直存在的东西,比如h:form
。如果你不想更新整个表单,那么你可以尝试<p:outputPanel id="wrapper">
。所以你的代码看起来像这样
<h:form>
...
<p:outputPanel id="wrapper">
<p:commandButton ... update="wrapper"/>
<p:message />
</p:outputPanel>
</h:form>
我最近在使用PrimeFaces 6.0.19时遇到了这个问题。
事实证明,我必须在调用addMessage()方法之前调用FacesContext.getCurrentInstance().validationFailed()
,以便消息可以正确显示。
。
FacesContext.getCurrentInstance().validationFailed();
//if you set the client ID to be null, you should add globalOnly=true in <p:messages>
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));