p:commandButton vs. h:commandButton

Car*_*ron 3 jsf primefaces commandbutton

当我使用PrimeFaces时 p:commandButton

<p:commandButton action=#{bean.action} />
Run Code Online (Sandbox Code Playgroud)

我没有看到输入的验证消息(默认消息h:或PrimeFaces 消息p:).例如

<f:validateRequired />
Run Code Online (Sandbox Code Playgroud)

当我使用默认命令按钮时

<h:commandButton action=#{bean.action} />
Run Code Online (Sandbox Code Playgroud)

我确实看到了验证.造成这种差异的原因是什么?

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

bje*_*ski 5

就像@Partlov在下面的评论中写道的那样,

主要区别在于p:commandButton默认为AJAX,h:commandButton默认为非AJAX.

所以

<p:commandButton ... />
Run Code Online (Sandbox Code Playgroud)

更像是

<h:commandButton ...>
    <f:ajax/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)

或者相反

<h:commandButton ... />
Run Code Online (Sandbox Code Playgroud)

就好像

<p:commandButton ajax="false" ... />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

添加(多余的)f:ajaxp:ajax内部p:commandXXX可能会导致奇怪的未定义行为

也可以看看