在失效JSF之后清除表单字段

时间:2012-09-11 19:22:44

标签: jsf-2 primefaces

好吧我有以下问题:在我的网络应用程序中,我通过Primefaces的对话框控件获得CRUD所有页面。在新对话框中,我有一些验证器。例如:当用户没有填写表单提交的必要字段时,表单显然不会提交。但当我关闭de New对话框并再次打开它时,验证消息仍然存在!我怎么能摆脱这个?每次打开对话框时,我都想要一个全新的页面(没有累积的验证错误)!怎么做?

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:p="http://primefaces.org/ui"
            template="./../../resources/templates/baseTemplate.xhtml">

<ui:define name="content">
    <f:view id="vRoot">
        <p:fieldset legend="Gerenciar público">
            <h:form id="frmPublicos">
                <!-- Exibição de mensagens gerais -->
                <p:growl id="gMessages" sticky="false" globalOnly="true" />

                <!-- Exibição da lista de públicos -->
                <p:dataTable id="dtPublicos" 
                             value="#{publicoBean.lstDataTablePublico}"
                             paginator="true" rows="5" 
                             rowsPerPageTemplate="5,10"
                             paginatorPosition="bottom"
                             paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                             var="atual">
                    <!-- Every time dialog opens validation messages should be cleaned -->
                    <f:facet name="header">
                        <p:commandButton id="cbViewNovo" 
                                         value="Novo" type="button" 
                                         styleClass="cbViewNovo" 
                                         onclick="dlgNovo.show();"
                                         update=":dlgNovoPublico"
                                         process="@this">
                            <p:resetInput target=":dlgNovoPublico"/>
                        </p:commandButton>
                    </f:facet>
                    <!-- Colunas de edição e exclusão -->
                    <p:column>
                        <f:facet name="header">
                            <h:outputLabel value="Editar"/>
                        </f:facet>
                        <p:commandButton id="cbViewEditar"  
                                         image="ui-icon-pencil" 
                                         title="Editar"
                                         update=":frmEditar:pEditarPublico"
                                         oncomplete="dlgEditar.show();">
                            <f:setPropertyActionListener value="#{atual}" target="#{publicoBean.publicoSelecionado}" />
                        </p:commandButton>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            <h:outputLabel value="Excluir"/>
                        </f:facet>
                        <p:commandButton id="cbViewExcluir" onclick="dlgExcluir.show();" 
                                         icon="ui-icon-close" title="Excluir">
                            <f:setPropertyActionListener value="#{atual}" target="#{publicoBean.publicoSelecionado}" />
                        </p:commandButton> 
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Nome
                        </f:facet>
                        <h:outputLabel id="olViewNomePublico" value="#{atual.nmePublico}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Tipo de público
                        </f:facet>
                        <h:outputLabel id="olViewTipoPublico" value="#{atual.tdTipoPublico}"/>
                    </p:column>
                </p:dataTable>
            </h:form>

            <!-- Caixa de diálogo de inclusão -->
            <p:dialog id="dlgNovoPublico" 
                      widgetVar="dlgNovo" 
                      modal="true" 
                      header="Novo público"
                      resizable="false">
                <h:form id="frmNovo">
                    <p:panel id="pNovoPublico">
                        <p:messages id="mNovoMessages" redisplay="false" />
                        <p:panelGrid columns="2">
                            <p:outputLabel id="olNovoNomePublico" value="Nome:" for="itNovoNomePublico"/>
                            <p:inputText id="itNovoNomePublico" value="#{publicoBean.nome}" required="true"
                                         requiredMessage="Digite o nome do público."/>

                            <p:outputLabel id="olNovoTipoPublico" for="somNovoTipoPublico" value="Tipo de público:"/>
                            <p:selectOneMenu id="somNovoTipoPublico" 
                                             value="#{publicoBean.tipoPublicoSelecionado}" 
                                             effect="fade" 
                                             converter="#{publicoBean.conversor}" 
                                             required="true" 
                                             requiredMessage="Selecione um tipo de público."
                                             > 
                                <f:selectItem itemLabel="Selecione um item..." itemValue=""/>
                                <f:selectItems value="#{publicoBean.lstMenuTipoPublico}" var="atual" itemLabel="#{atual.label}" itemValue="#{atual}"></f:selectItems>
                            </p:selectOneMenu>
                            <p:commandButton value="Cancelar" immediate="true" onclick="dlgNovo.hide()"/>
                            <p:commandButton id="cbNovoSalvar" value="Salvar" 
                                             actionListener="#{publicoBean.cadastrarPublico}"
                                             oncomplete="handleSalvo(xhr, status, args);" 
                                             update=":frmPublicos:dtPublicos :frmNovo :frmPublicos:gMessages"
                                             ajax="true"/>
                        </p:panelGrid>
                    </p:panel>
                </h:form>
            </p:dialog>

            <!-- Caixa de diálogo de exclusão -->
            <p:confirmDialog id="dialogoExcluir" message="Deseja realmente excluir?"
                             header="Excluir público" severity="alert" 
                             widgetVar="dlgExcluir">
                <h:form id="frmExcluir">
                    <p:commandButton id="cbExcluirCancelar" value="Cancelar" onclick="dlgExcluir.hide()" type="button" /> 
                    <p:commandButton id="cbExcluirContinuar" value="Continuar"
                                     update=":frmPublicos:dtPublicos :frmPublicos:gMessages" 
                                     oncomplete="dlgExcluir.hide()"
                                     actionListener="#{publicoBean.excluirPublico}"/>
                </h:form>
            </p:confirmDialog>
            <!-- Caixa de diálogo de edição -->
            <p:dialog id="dialogoEditar" widgetVar="dlgEditar" header="Editar público"
                      resizable="false" modal="true">
                <h:form id="frmEditar">
                    <p:panel id="pEditarPublico">
                        <p:messages id="mEditarMessages" redisplay="false" />
                        <p:panelGrid columns="2">
                            <p:outputLabel id="olEditarNomePublico" value="Nome:" for="itEditarNomePublico"/>
                            <p:inputText id="itEditarNomePublico" value="#{publicoBean.publicoSelecionado.nmePublico}" required="true"
                                         requiredMessage="Digite o nome do público."/>

                            <p:outputLabel id="olEditarTipoPublico" for="somEditarTipoPublico" value="Tipo de público:"/>
                            <p:selectOneMenu id="somEditarTipoPublico" 
                                             value="#{publicoBean.publicoSelecionado.tdTipoPublico}" 
                                             effect="fade" 
                                             converter="#{publicoBean.conversor}" 
                                             required="true"
                                             requiredMessage="Selecione um tipo de público."
                                             > 
                                <f:selectItem itemLabel="Selecione um item..." itemValue=""/>
                                <f:selectItems value="#{publicoBean.lstMenuTipoPublico}" 
                                               var="atual" 
                                               itemLabel="#{atual.label}" 
                                               itemValue="#{atual}"></f:selectItems>
                            </p:selectOneMenu>
                            <p:commandButton value="Cancelar" immediate="true" onclick="dlgEditar.hide()"/>
                            <p:commandButton id="cbEditarSalvar" value="Salvar" 
                                             actionListener="#{publicoBean.alterarPublico}"
                                             oncomplete="dlgEditar.hide();" 
                                             update=":frmPublicos:dtPublicos :frmEditar :frmPublicos:gMessages"/>
                        </p:panelGrid>
                    </p:panel>
                </h:form>
            </p:dialog>
        </p:fieldset>
    </f:view>
    <!-- Javascript responsável por fechar a caixa de diálogo ao cadastrar-->
    <script type="text/javascript">
        function handleSalvo(xhr, status, args){
            if(args.salvo){
                dlgNovo.hide();
            }
        }
        function handleEditar(xhr, status, args){
            if(args.salvo){
                dlgEditar.hide();
            }
        }
    </script>
</ui:define>

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

尝试使用Primefaces Extensions中的 pe:resetInput http://fractalsoft.net/primeext-showcase-mojarra/sections/resetInput/formElements.jsf

<p:commandButton id="cbViewNovo" 
                                         value="Novo" type="button" 
                                         styleClass="cbViewNovo" 
                                         onclick="dlgNovo.show();"
                                         update=":dlgNovoPublico"
                                         process="@this">
                            <pe:resetInput target=":dlgNovoPublico"/>
                        </p:commandButton>