我正在构建一个允许用户输入数据库连接参数的表单。一旦输入参数,用户就可以测试(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>
我错过了什么?
我认为你的问题在这里:
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
我假设你正在打电话给FacesContext.addMessage()
。第一个参数是组件id字符串。如果将其设置为null,则强制将消息作为全局消息。您定义的<p:message>
组件设置为for="btnTester"
,因此它只显示组件ID与btnTester组件的id匹配的消息。
除了addMessage()
的Javadoc:
如果clientId不为null,则将FacesMessage附加到与指定客户端标识符关联的消息集。如果clientId为null,则假定此FacesMessage不与任何特定组件实例关联。
您缺少update
上的<p:commandButton>
属性,该属性指定要更新的<p:message>
组件的ID。
您应该给出消息组件和ID,并在commandButton的update
中指定它。
我使用咆哮而不是消息来解决我的问题。
找到一个完美的解决方案,与Prime脸上的消息完美配合。
想与你分享,即使你用咆哮来解决问题
这是解决方案
add addMessage有2个参数,一个UIComponent Client Id和FacesMessage。 facesMessage显示或定义消息,Component Child Id显示组件的位置。在这里你错过了组件部分。为了使其工作,您应该将UIComponent与bean类绑定。这样它就可以找到Component。
现在做如下,
在bean类中定义UIComponent
使用相应的命令Button绑定它
并从bean类中的组件中获取Id
您的代码必须像这样更改
> private UIComponent component;
(...)
addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Connection failed.", t.getLocalizedMessage()));
(...)
在xhtml文件中,您必须绑定UIComponent
<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()));