【发布时间】: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