p:commandButton与h:commandButton的区别

5

当我使用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>

6
主要区别是p:commandButton默认为AJAX,而h:commandButton默认为非AJAX。请发布整个表单的代码。也许您只是没有使用PrimeFaces按钮更新验证消息字段。 - partlov
update="@form" 添加到 p:commandButton 中,看看是否显示错误消息。 - partlov
感谢partlov,这正是我需要的提示!update="@form"就可以了。但是也要加上ajax="false"。如果我使用ajax="false",那么<h:messages />也会被正确更新。祝好,caron。 - Caron
是的,在这种情况下,如果不使用AJAX请求,按钮将作为h:commandButton - partlov
@parlov:你想要创作一个包含所有这些信息的答案吗?得到点赞数最多的那个回答没有很好地解释事情。否则我想写一个包含所有细节的答案。 - Kukeltje
1个回答

7

正如@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 > 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:ajaxp:ajax可能会导致奇怪的未定义行为。

另请参阅


它将提交整个表单,只是不会更新整个表单。 - partlov
你的意思是说这个问题会在没有更新的情况下发生吗?如果是这样,我会编辑我的回答。 - bjedrzejewski
1
通过更新,您可以控制哪些部分被更新,通过处理,您可以控制提交的内容。使用此更新,您可以更新表单(包括消息,因此消息将可见)。如果没有更新,您将无法看到消息。 - partlov
谢谢,以前我在primefaces中混合使用update和process!我会编辑这个答案。 - bjedrzejewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接