0

私の意図は、BDにレコードを挿入した後、リッチ:popupPanelでユーザーにメッセージを表示することです。

以下のコードで、私はやりたいことをすることができますが、問題があります。すべてのページフィールドを正しく入力した場合にのみ機能します。フィールドの1つが検証に合格しなかった場合、検証メッセージが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>
    

  • マネージドBean

    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;
    }
    
4

1 に答える 1

1

rich:popupPanelスルーAJAX(からのレンダリング)のコンテンツをレンダリングする場合、Javascriptコード(未完了)を呼び出すのではなく、その属性a4j:commandButtonを使用して条件付きで表示することを選択するのが最適な場合があります。show

したがって、を表示するための条件を追加することをお勧めしますpopupPanel。初期化時にそれがnullであり、Beanがリクエストスコープであると仮定するとtextoModal、次のようなものを使用できます。

<rich:popupPanel id="pnlOk" modal="true"
       show="#{dizimistaMB.textoModal != null}" ...>

public boolean isShowTextoModal()フィールドがnullでないかどうかを単にチェックするよりも、より適切なルールを実装できるようなメソッドをバッキングBeanに作成することをお勧めします。

次に、ボタンを次のように変更できます。

<h:commandButton id="btnInserirDizimista" value="Inserir"
       render="pnlMessages outPnlOk"
       action="#{dizimistaMB.inserirDizimista}" />

...そして、ActionEventメソッドから引数を削除しinserirDizimista、actionListenerではなくactionメソッドにします

これでうまくいくはずです。

于 2012-08-04T03:16:17.893 に答える