java - 用户第二次打开对话框时,JSF 2.0 字段不会被清除

标签 java jsf jsf-2 refresh field

我不知道这是否是一个常见问题,但是这个奇怪的问题让我有些头疼...... 我有一种奇怪的行为,我的应用程序有很多对话框,当用户打开一个对话框时,该对话框应该显示默认内容。问题是我在显示对话框之前清除了所有 bean 的属性,但有时似乎表单未清除! 例如,这是存在此问题的对话框之一:

how it should be 此图显示了我第一次打开对话框时的显示方式,所有字段均被清除,并选择了第二个单选按钮。如果我更改单选选项并在输入字段中输入内容,数据表会立即显示与搜索相应的数据。因此,如果我单击“Cancelar”(葡萄牙语中的“取消”),该对话框将像预期的那样关闭。

然后我再次打开此对话框:

how it is shown after oppened after cancel action 这些字段存储用户制作的最后一个版本。我以为我没有清除 bean,但如果我只是按 F5(刷新),对话框就会像第一张图片中那样显示。我不知道为什么,但有些字段没有更新!!

我的对话框是使用此模板创建的:

<ui:component>
<hrgi:popup id="#{idPopup}" titulo="#{titulo}" renderizar="#{popup.visivel}"
            bordaConteudo="#{bordaConteudo eq null?true:bordaConteudo}">
    <f:facet name="cabecalho">
        <ui:insert name="cabecalho"></ui:insert>
    </f:facet>
    <f:facet name="conteudo">
        <h:panelGroup id="#{idPopup}Conteudo" layout="block" style="width:100%">
            <p:focus/>
            <ui:insert name="conteudo">Nenhum conteúdo definido!</ui:insert>
        </h:panelGroup>
    </f:facet>
    <f:facet name="botoes">
        <h:panelGroup style="width:100%">
            <h:panelGrid id="#{idPopup}PainelMensagens" style="width:100%">
                <p:messages/>
            </h:panelGrid>
            <ui:insert name="barraDeBotoes">
                <h:panelGroup layout="block" style="width:100%">
                    <p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
                                     immediate="true" update="@form"
                                     action="#{controladorPopup.fechar}"/>
                    <p:commandButton value="OK" styleClass="hrgi-botao-popup"
                                     action="#{controladorPopup.submit}" update="@form alerta #{atualizar}">
                        <f:param name="REQUIRED" value="true"/>
                    </p:commandButton>
                </h:panelGroup>
            </ui:insert>
        </h:panelGroup>
    </f:facet>
</hrgi:popup>
</ui:component>

打印中显示的对话框是这样创建的:

<ui:composition template="../templates/popupSubmit.xhtml">
<ui:param name="titulo" value="#{cadastroMsg['popup.cadastro.listagem_empresa.titulo']}" />
<ui:param name="popup" value="#{modeloPopupBuscaEmpresa}" />
<ui:param name="controladorPopup" value="#{controladorPopupBuscaEmpresa}" />
<ui:define name="conteudo">
    <h:panelGroup layout="block" styleClass="hrgi-div-form clearfix">
        <hrgi:listagem listenerBusca="#{controladorListagemEmpresa}"
                       valorBusca="#{modeloListagemEmpresa.valorBusca}">
            <f:facet name="filtrosAdicionais">
                <h:panelGroup layout="block">
                    <h:outputText value="#{msgGerais['gerais.listagem.filtro']}"/>
                    <h:selectOneRadio value="#{modeloListagemEmpresa.tipoFiltro}" immediate="true">
                        <f:selectItem itemLabel="CNPJ" itemValue="0"/>
                        <f:selectItem itemLabel="Apelido" itemValue="1"/>
                        <f:ajax event="change" immediate="true"
                                render="tabelaListagem"
                                listener="#{controladorListagemEmpresa.atualizarTipoFiltro}"/>
                    </h:selectOneRadio>
                </h:panelGroup>
            </f:facet>
            <f:facet name="tabela">
                <h:panelGroup layout="block" style="height: 219px; width: 103%">
                    <p:dataTable value="#{modeloListagemEmpresa.itens}"
                                 scrollable="true" height="194" var="empresa"
                                 emptyMessage="#{msgGerais['gerais.sem_dados']}"
                                 selectionMode="single" onRowUnselectUpdate="painelInformacoes"
                                 selection="#{modeloListagemEmpresa.itemSelecionado}"
                                 onRowSelectUpdate="painelInformacoes">
                        <p:column style="width:20%"
                                  headerText="Documento">
                            <h:outputText value="#{empresa.cnpj}"/>
                        </p:column>
                        <p:column style="width:80%"
                                  headerText="Apelido">
                            <h:outputText value="#{empresa.nomeEmpresa}"/>
                        </p:column>
                    </p:dataTable>
                </h:panelGroup>
            </f:facet>
            <f:facet name="informacoes">
                <ui:include src="../../outros/painelInformacoesBasicasEmpresa.xhtml">
                    <ui:param name="modeloPopup" value="#{modeloListagemEmpresa}"/>
                    <ui:param name="pessoaSelecionada" value="#{controladorListagemEmpresa.pessoaSelecionada}"/>
                </ui:include>
            </f:facet>
        </hrgi:listagem>
        <p:messages/>
    </h:panelGroup>
</ui:define>
</ui:composition>

如果我更改“取消”按钮的模板代码,只需删除immediate=true即可正常工作:

<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
                                     update="@form"
                                     action="#{controladorPopup.fechar}"/>

但在其他对话框中我有必填字段并且需要验证... 有人能解释一下为什么会发生吗?

最佳答案

我已经用第一种方法解决了这个问题 here

所以我创建了一个方法取消:

 public void cancelar(){
    fechar();
    //Limpa todos os campos do formulário
    FacesContext context = FacesContext.getCurrentInstance();
    Application application = context.getApplication();
    ViewHandler viewHandler = application.getViewHandler();
    UIViewRoot viewRoot = viewHandler.createView(context, context
            .getViewRoot().getViewId());
    context.setViewRoot(viewRoot);
    context.renderResponse();
}

现在按钮取消的工作方式如下:

<p:commandButton value="CANCELAR" styleClass="hrgi-botao-popup"
    update="@form" immediate="true" action="#{controladorPopup.cancelar}"/>

关于java - 用户第二次打开对话框时,JSF 2.0 字段不会被清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9470617/

相关文章:

jsf - 如果没有更改输入值,则避免提交表单

eclipse - 尽管存在依赖关系,PrimeFaces 组件不会在浏览器中呈现

java - 在 Facelets 页面中显示异常堆栈跟踪

java - https : Authorization 401

jsf - 使用 j_security_check 在 Java EE/JSF 中执行用户身份验证

java - 单击按钮创建新窗口 - Vaadin 14

jsf - p :commandLink fails to open page in new window/tab

jsf - 如何为复合组件内的输入组件指定验证器?

java - 当我尝试在另一个类中访问静态变量时,为什么它为空?

java - 尝试创建简单的java菜单,但它不起作用