我的目的是在BD中插入记录后在rich:popupPanel中向用户显示一条消息。
使用下面的代码,我可以做我想要的,但有问题。仅在我正确键入所有页面字段时才有效。如果其中一个字段未通过验证,则验证消息将显示在h:消息中,即使我更改了字段的内容并再次单击该按钮,页面也不会更改。
可能出现什么问题?
页
<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;
}
答案 0 :(得分:1)
当您通过AJAX呈现rich:popupPanel
的内容(从a4j:commandButton
呈现)时,最好选择使用its show
attribute有条件地显示内容,而不是调用Javascript代码(oncomplete) )。
所以,我建议您添加显示popupPanel
的条件。假设textoModal
在初始化时为null,并且您的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}" />
...并从方法ActionEvent
中移除inserirDizimista
参数,使其成为action method instead of a actionListener。
这应该让事情顺利进行。