Olá a todos!
Estou estudando JSF+RichFaces e estou com uma duvida.
Fiz um formulário com um <h:selectOneMenu …/> onde o usuário seleciona um país. Se o país selecionado possui “Estados” cadastrados no banco gostaria que aparecesse um outro <h:selectOneMenu …/> com os estados. Caso o país não tenha estados cadastrados nos banco, gostaria que é aparecesse um <h:inputText …/> para o usuário digitar o estado.
Fiz desta maneira
[code]
<h:outputLabel value="#{msg.pais}" for=“pais”/>
<h:selectOneMenu id=“pais” value="#{usuarioMB.usuario.pais.id}" immediate=“true”>
<f:selectItems value="#{usuarioMB.paises}"/>
<a4j:support event=“onblur” ajaxSingle=“true” action="#{usuarioMB.showEstados}" reRender=“status,status1,panel1,panel2”/>
</h:selectOneMenu>
<h:outputLabel value="#{msg.estado}" for=“estado”/>
<h:panelGroup>
<a4j:outputPanel id=“panel1”>
<h:inputText id=“estado” value="#{usuarioMB.usuario.estado}" maxlength=“30” rendered="#{!usuarioMB.exibeEstados}"/>
</a4j:outputPanel>
<a4j:outputPanel id=“panel2”>
<h:selectOneMenu id=“estado_combo” value="#{usuarioMB.usuario.estado}" rendered="#{usuarioMB.exibeEstados}">
<f:selectItems value="#{usuarioMB.estados}"/>
</h:selectOneMenu>
</a4j:outputPanel>
</h:panelGroup>
[/code]
Esta funcionando perfeitamente (ou quase).
O único problema é quando o usuario faz o “submit” e dá erros de validações dos outros campos (que nao estão no codigo acima).
A variável “exibeEstados” fica null, entao só renderiza o <h:inputText …/> ao invés do <h:selectOneMenu …/>.
O método “showEstados” é onde ele verifica a existência de “estados” e seta o valor da variável “exibeEstados” (true/false)
Os outros campos estão também no mesmo Managed Bean (usuarioMB).
Acho que estou comentendo algum erro de conceito (ciclo de vida). Alguém pode me ajudar?
Desde já agradeço a ajuda
Clériston Martinelo
Você pode postar seu Managed Bean?
sim.
Obs.: Por enquanto nao estou buscando os estados no banco, apenas verifico se o pais é 30 (Brasil) e adiciono 3 estados
package br.keko.mb;
import br.keko.modelo.Gmt;
import br.keko.modelo.Pais;
import br.keko.modelo.Usuario;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class UsuarioMB{
private Usuario usuario;
private String mensagem = new String();
private String senha;
private String senhaconf;
private Map paises = new HashMap();
private Map gmt = new HashMap();
private Map estados = new HashMap();
private Boolean exibeEstados;
public UsuarioMB()
{
System.out.println("Construtor-*********************");
usuario = new Usuario();
usuario.setPais(new Pais());
usuario.setGmt(new Gmt());
}
public
/** Creates a new instance of UsuarioMB */
Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
public String salvar(){
if (usuario.getLogin().equals("")) {
return "validar";
}
else {
EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");
EntityManager eManager = emFactory.createEntityManager();
EntityTransaction tx = eManager.getTransaction();
try{
tx.begin();
usuario.setId(0);
eManager.persist(usuario);
tx.commit();
return "sucesso";
}catch(Exception e){
if (tx.isActive()) tx.rollback();
return "erro";
}finally{
eManager.close();
emFactory.close();
}
}
}
public String getMensagem() {
return mensagem;
}
public void setMensagem(String mensagem) {
this.mensagem = mensagem;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public String getSenhaconf() {
return senhaconf;
}
public void setSenhaconf(String senhaconf) {
this.senhaconf = senhaconf;
}
public Map getPaises() {
paises.clear();
EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");
EntityManager eManager = emFactory.createEntityManager();
try {
String selectPais = "select p from Pais p order by p.ingles";
Query query = eManager.createQuery(selectPais);
List<Pais> resultados = query.getResultList();
for (Pais p : resultados){
paises.put(p.getIngles(), p.getId());
}
}
finally {
eManager.close();
emFactory.close();
}
TreeMap tPaises = new TreeMap(paises);
tPaises.put("", 0);
return tPaises;
}
public void setPaises(Map paises) {
this.paises = paises;
}
public Map getGmt() {
gmt.clear();
EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");
EntityManager eManager = emFactory.createEntityManager();
try {
String selectGmt = "select g from Gmt g";
Query query = eManager.createQuery(selectGmt);
List<Gmt> resultados = query.getResultList();
for (Gmt g : resultados){
String sGmt = Float.toString(g.getGmt()) ;
gmt.put(sGmt, g.getId());
}
}
finally {
eManager.close();
emFactory.close();
}
TreeMap tGmt = new TreeMap(gmt);
tGmt.put("", 0);
return tGmt;
}
public void setGmt(Map gmt) {
this.gmt = gmt;
}
public Map getEstados() {
estados.put("São Paulo", 1);
estados.put("Rio de Janeiro", 2);
estados.put("Minas Gerais", 3);
return estados;
}
public void showEstados(){
System.out.println(usuario.getPais().getId());
if ((usuario.getPais().getId() != null) &&
(usuario.getPais().getId() == 30)){
System.out.println("t");
setExibeEstados((Boolean) true);
}
else {
System.out.println("f");
setExibeEstados((Boolean) false);
}
}
public void setEstados(Map estados) {
this.estados = estados;
}
public Boolean getExibeEstados() {
return exibeEstados;
}
public void setExibeEstados(Boolean exibeEstados) {
this.exibeEstados = exibeEstados;
}
}
Olá cleriston, estou enfrentando o mesmo problema. Você conseguiu achar alguma solução?
Obrigado!
Raphael.
Na realidade isso era apenas um estudo… q nao dei continuidade… tb nao fiquei sabendo :S