Jsf 验证和丰富:popupPanel don';行不通

Jsf 验证和丰富:popupPanel don';行不通,jsf,richfaces,popuppanel,Jsf,Richfaces,Popuppanel,我的意图是在BD中插入一条记录后,在rich:popupPanel中向用户显示一条消息 <h:outputLabel value="Nome:" for="nome1" /> <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/> <h:outputLabel value="Logradouro:" for

我的意图是在BD中插入一条记录后,在rich:popupPanel中向用户显示一条消息

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>
使用下面的代码,我可以做我想做的事情,但有一个问题。仅当我正确键入所有页面字段时才起作用。如果其中一个字段未通过验证,则验证消息将显示在h:messages中,并且页面不会更改,即使我更改了字段的内容并再次单击按钮也是如此

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>
有什么不对劲吗

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>
  • 页面

    <h:outputLabel value="Nome:" for="nome1" />
    <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>
    
    <h:outputLabel value="Logradouro:" for="logradouro" />
    <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>
    
    <h:outputLabel value="Bairro:" for="bairro" />
    <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />
    
    <h:outputLabel value="CEP:" for="cep" />
    <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
        <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
    </h:inputText>
    
    <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>
    
    <a4j:outputPanel id="outPnlOk" ajaxRendered="true">
    <rich:popupPanel id="pnlOk" modal="true" height="150">
            <h:graphicImage value="/images/info.jpg" />
            <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
            <h:commandButton value="OK" action="dizimista?faces-redirect=true"
                onclick="#{rich:component('pnlOk')}.hide(); return false;" >
                <a4j:ajax execute="formPnlOk" />
            </h:commandButton>
        </rich:popupPanel>
    </a4j:outputPanel>
    

    <h:outputLabel value="Nome:" for="nome1" />
    <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>
    
    <h:outputLabel value="Logradouro:" for="logradouro" />
    <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>
    
    <h:outputLabel value="Bairro:" for="bairro" />
    <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />
    
    <h:outputLabel value="CEP:" for="cep" />
    <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
        <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
    </h:inputText>
    
    <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>
    
    <a4j:outputPanel id="outPnlOk" ajaxRendered="true">
    <rich:popupPanel id="pnlOk" modal="true" height="150">
            <h:graphicImage value="/images/info.jpg" />
            <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
            <h:commandButton value="OK" action="dizimista?faces-redirect=true"
                onclick="#{rich:component('pnlOk')}.hide(); return false;" >
                <a4j:ajax execute="formPnlOk" />
            </h:commandButton>
        </rich:popupPanel>
    </a4j:outputPanel>
    
    
    

  • <h:outputLabel value="Nome:" for="nome1" />
    <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>
    
    <h:outputLabel value="Logradouro:" for="logradouro" />
    <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>
    
    <h:outputLabel value="Bairro:" for="bairro" />
    <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />
    
    <h:outputLabel value="CEP:" for="cep" />
    <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
        <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
    </h:inputText>
    
    <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>
    
    <a4j:outputPanel id="outPnlOk" ajaxRendered="true">
    <rich:popupPanel id="pnlOk" modal="true" height="150">
            <h:graphicImage value="/images/info.jpg" />
            <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
            <h:commandButton value="OK" action="dizimista?faces-redirect=true"
                onclick="#{rich:component('pnlOk')}.hide(); return false;" >
                <a4j:ajax execute="formPnlOk" />
            </h:commandButton>
        </rich:popupPanel>
    </a4j:outputPanel>
    
  • 豆角

    <h:outputLabel value="Nome:" for="nome1" />
    <h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>
    
    <h:outputLabel value="Logradouro:" for="logradouro" />
    <h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>
    
    <h:outputLabel value="Bairro:" for="bairro" />
    <h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />
    
    <h:outputLabel value="CEP:" for="cep" />
    <h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
        <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
    </h:inputText>
    
    <a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>
    
    <a4j:outputPanel id="outPnlOk" ajaxRendered="true">
    <rich:popupPanel id="pnlOk" modal="true" height="150">
            <h:graphicImage value="/images/info.jpg" />
            <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
            <h:commandButton value="OK" action="dizimista?faces-redirect=true"
                onclick="#{rich:component('pnlOk')}.hide(); return false;" >
                <a4j:ajax execute="formPnlOk" />
            </h:commandButton>
        </rich:popupPanel>
    </a4j:outputPanel>
    
    public void inserirDizimista(){
        try{
            defineDizimista("formNovoDizimista");
            dizimistaFacade.criar(dizimista);
            setTextoModal("Dizimista inserido com sucesso");
            System.out.println("Dizimista '" + dizimista.getNome1() + "' inserido com sucesso");
            dizimista = null;
        } catch (DAOException e) {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), null);
            JSFHelper.getFacesContext().addMessage("ATENÇÃO!", msg);
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void defineDizimista(String nomeForm){
        Map<String, String> dados = getDadosFormulario(nomeForm);
        dizimista.setNome1(dados.get("nome1"));
        dizimista.setLogradouro(dados.get("logradouro"));
        dizimista.setBairro(dados.get("bairro"));
        dizimista.setCep(Integer.parseInt(dados.get("cep")));
    }
    
    private Map<String, String> getDadosFormulario(String form){
        Map<String, String> dados = new HashMap<String, String>();
        dados.put("nome1", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "nome1"));
        dados.put("logradouro", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "logradouro"));
        dados.put("bairro", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "bairro"));
        dados.put("cep", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cep"));
        dados.put("cidade", JSFHelper.getRequestParameter(form +
            UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext()) + "cidade"));
        return dados;
    }
    
    public void inserirdizimita(){
    试一试{
    定义新齐米斯塔(“新齐米斯塔”);
    dizimista.criar(dizimista);
    setTextoModal(“Dizimista inserido com Successo”);
    System.out.println(“Dizimista'”+Dizimista.getNome1()+“'inserido com successo”);
    dizimista=null;
    }捕获(DAOE){
    FacesMessage msg=新的FacesMessage(FacesMessage.SEVERITY_错误,例如getMessage(),null);
    JSFHelper.getFacesContext().addMessage(“ATENÃO!”,msg);
    e、 printStackTrace();
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    专用void defineDzimista(字符串形式){
    Map dados=getDadosFormulario(nomeForm);
    dizimista.setNome1(护墙板.get(“nome1”);
    dizimista.setLogradouro(dados.get(“logradouro”);
    dizimista.setBairro(dados.get(“bairro”);
    setCep(Integer.parseInt(dados.get(“cep”));
    }
    私有映射getDadosFormulario(字符串形式){
    Map dados=新的HashMap();
    put(“nome1”,JSFHelper.getRequestParameter(表单+
    UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext())+“nome1”);
    put(“logradouro”,JSFHelper.getRequestParameter(表单+
    UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext())+“logradouro”);
    put(“bairro”,JSFHelper.getRequestParameter(表单+
    UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext())+“bairro”);
    put(“cep”,JSFHelper.getRequestParameter(表单+
    UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext())+“cep”);
    put(“cidade”,JSFHelper.getRequestParameter(表单+
    UINamingContainer.getSeparatorChar(JSFHelper.getFacesContext())+“cidade”);
    返回护墙板;
    }
    

当您通过AJAX(从
a4j:commandButton
呈现)呈现
rich:popupanel
的内容时,最好选择有条件地显示它,而不是调用Javascript代码(oncomplete)

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>
因此,我建议您添加一个条件来显示
popupanel
。假设
textoModal
在初始化时为null,并且您的bean是一个请求作用域,您可以使用如下内容:

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>
<rich:popupPanel id="pnlOk" modal="true"
       show="#{dizimistaMB.textoModal != null}" ...>
。。。并从方法中删除
ActionEvent
参数
inserirdizimita
,使其成为一个

<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>

这应该会让你的工作顺利进行。

你不应该使用。你也不应该对例外情况保持沉默。验证失败时控制台上是否打印任何内容?感谢您的回复和此链接。老实说,我仍然不知道action和actionlistener之间的区别。关于例外情况,我很抱歉,只是想简化代码。谢谢你的评论,不客气。那么,你的问题解决了吗?即使你关于行动的建议不起作用,如果你能帮助我,谢谢。我改为“操作”,但单击验证消息会显示在h:messages中,但弹出面板显示时没有任何文本。我想要的是只有在成功的情况下才会展示出来。按原样,即使正确输入字段,也不会调用insert方法。您可以按现在的方式发布MB代码的完整代码吗?
<h:outputLabel value="Nome:" for="nome1" />
<h:inputText id="nome1" maxlength="50" required="true" requiredMessage="Informe um nome" immediate="true"/>

<h:outputLabel value="Logradouro:" for="logradouro" />
<h:inputText id="logradouro" maxlength="50" required="true" requiredMessage="Informe o logradouro" immediate="true"/>

<h:outputLabel value="Bairro:" for="bairro" />
<h:inputText id="bairro" maxlength="45" required="true" requiredMessage="Informe o bairro" immediate="true" />

<h:outputLabel value="CEP:" for="cep" />
<h:inputText id="cep" maxlength="8" required="true" requiredMessage="Informe o CEP" immediate="true">
    <f:convertNumber integerOnly="true" groupingUsed="false" maxIntegerDigits="8" />
</h:inputText>

<a4j:commandButton id="btnInserirDizimista" value="Inserir" oncomplete="#{rich:component('pnlOk')}.show()" render="pnlMessages outPnlOk" actionListener="#{dizimistaMB.inserirDizimista}"/>

<a4j:outputPanel id="outPnlOk" ajaxRendered="true">
<rich:popupPanel id="pnlOk" modal="true" height="150">
        <h:graphicImage value="/images/info.jpg" />
        <h:outputText id="textoModalOk" value="#{dizimistaMB.textoModal}" />
        <h:commandButton value="OK" action="dizimista?faces-redirect=true"
            onclick="#{rich:component('pnlOk')}.hide(); return false;" >
            <a4j:ajax execute="formPnlOk" />
        </h:commandButton>
    </rich:popupPanel>
</a4j:outputPanel>