【问题标题】:validation and rich: popupPanel don't work验证和丰富:popupPanel 不起作用
【发布时间】:2012-08-03 01:49:34
【问题描述】:

我的意图是在 BD 中插入一条记录后,以丰富的方式向用户显示一条消息:popupPanel。

使用下面的代码,我可以做我想做的事,但有一个问题。仅当我正确键入所有页面字段时才有效。如果其中一个字段没有通过验证,则在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>
    

  • 托管豆

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

【问题讨论】:

  • 你不应该使用actionListener to do an action method's job。你也不应该沉默你的例外。验证失败时控制台上是否会打印任何内容?
  • 感谢您的回复和此链接。老实说,我仍然不知道 action 和 actionlistener 之间的区别。至于异常,我很抱歉,只是想简化代码。感谢您的评论。
  • 不客气。那你的问题解决了吗?
  • 即使您对操作的建议不起作用,如果您能帮助我,谢谢。我更改为操作,但单击验证消息会显示在 h:messages 中,但 popupPanel 出现时没有任何文本。我希望只有在成功的情况下才会显示相同的内容。而且,即使正确输入字段,也不会调用 insert 方法。
  • 您可以像现在一样发布您的 MB 代码的完整代码吗?

标签: jsf richfaces popuppanel


【解决方案1】:

当您通过 AJAX 渲染 rich:popupPanel 的内容(从 a4j:commandButton 渲染)时,最好选择使用 its show attribute 有条件地显示它,而不是调用 Javascript 代码(未完成)。

所以,我建议你只添加一个条件来显示popupPanel。假设 textoModal 在初始化时为空,并且你的 bean 是一个请求范围,你可以使用这样的东西:

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

您可能希望在支持 bean 中创建一个类似 public boolean isShowTextoModal() 的方法,它可以实现比简单地检查字段是否不为空更好的规则。

然后,您可以将按钮更改为:

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

...并从您的方法inserirDizimista 中删除ActionEvent 参数,使其成为action method instead of a actionListener

这应该会让你的事情顺利进行。

【讨论】:

    猜你喜欢
    • 2013-04-30
    • 2011-06-16
    • 1970-01-01
    • 2012-11-17
    • 2016-06-05
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多