当我使用PrimeFaces p:commandButton
<p:commandButton action=#{bean.action} />
我没有看到输入的验证消息(默认的h:
或PrimeFaces p:
)。例如
<f:validateRequired />
当我使用默认的命令按钮,如
<h:commandButton action=#{bean.action} />
我确实看到了验证。造成这种差异的原因是什么?
我使用Prime Faces 3.5与Mojarra 2.1.18
<h:form id="reliefhourheadcopy-form">
<h:panelGrid columns="1">
<h:outputText value="Kopiere Entlastungsstunden von" />
<h:outputText value="Semester: #{reliefHourHeadManagedBean.reliefHourHead.semester}" />
<h:outputText value="Jahr: #{reliefHourHeadManagedBean.reliefHourHead.year}" />
<h:outputText value="nach" />
</h:panelGrid>
<h:panelGrid columns="3">
<h:outputText value="Semester:" />
<p:selectOneMenu id="semester" value="#{reliefHourHeadManagedBean.semester}">
<f:selectItems value="#{reliefHourHeadManagedBean.semesterTypes}" />
</p:selectOneMenu>
<h:message for="semester" />
<h:outputText for="yearSpinner" value="Jahr:" />
<p:spinner id="yearSpinner" value="#{reliefHourHeadManagedBean.year}" maxlength="4" min="2000" max="2030" size="4">
<f:validateRequired />
<f:validateLongRange minimum="2000" maximum="2030" />
</p:spinner>
<h:message for="yearSpinner" />
</h:panelGrid>
<h:panelGrid columns="1" style="margin-top:25px">
<p:commandButton action="#{reliefHourHeadManagedBean.copyReliefHourHead}" value="Kopieren" icon="ui-icon-copy" >
<f:param name="reliefhourhead_id" value="#{reliefHourHeadManagedBean.reliefHourHeadId}" />
</p:commandButton>
</h:panelGrid>
</h:form>
就像@Partlov在问题下面写的那样,
主要区别在于p:commandButton默认为AJAX,而h:commandButton默认为非AJAX。
<p:commandButton ... />
更像
<h:commandButton ...>
<f:ajax/>
</h:commandButton>
,
<p:commandButton ...>
<p:ajax/>
</p:commandButton>
是错误的,导致未定义的行为
或者
<h:commandButton ... />
<p:commandButton ajax="false" ... />
默认情况下,p:commandButton
将提交表单。但是,默认情况下,在ajax调用完成后,它不会更新表单中的任何内容,因此不会显示消息(在开发模式下,会在日志文件中显示消息已进入队列,但未显示)。非ajax h:commandButton
会刷新整个页面,显示消息。为了在使用p:commandButton
时更新表单(包含消息组件),您需要添加update
属性:
<p:commandButton action="#{reliefHourHeadManagedBean.copyReliefHourHead}" value="Kopieren" icon="ui-icon-copy" update="@form">
<f:param name="reliefhourhead_id" value="#{reliefHourHeadManagedBean.reliefHourHeadId}" />
</p:commandButton>
在p:commandXXX
中添加(多余的)f:ajax
或p:ajax
可能会导致奇怪的未定义行为
参见
- 了解PrimeFaces process/update和JSF f:ajax execute/render属性