Ao editar os dados popular SelectOneMenu

8 respostas
F

Boa tarde pessoal,

Eu tenho uma tela de cadastro de empresa…
Eu fiz uma forma de quando eu selecionar a UF, ele lista as cidades daquela UF.
Blz está funcionando certinho…

EU tenho a tela de consulta de Empresa… Essa tela lista todas as empresas cadastradas.
E tem o botão editar, quando eu clicar nesse botão eu quero que ele vá para a tela de cadastro de empresa e populo todos os campos…
Até ai blz… ele populava quando a UF e a cidade eram texts… agora que são combos e são dados na base…com uma tabela estado e uma tabela cidade… eu não consigo popula-los… ele traz todos os objetos preenchidos(empresa, endereco, estado e cidade); mas eu não sei como eu faço para popular o combo… eu achei alguma coisa sobre configurar o faces-config.xml, mas não achei uma forma de como configura-lo…se eh realmente isso que é necessário para fazer.

Quem pude me ajudar eu agradeço muito…segue abaixo o código…

Empresa.xhtml

<h:panelGroup>
						<h:selectOneMenu id="estado" value="#{empresaBean.estado.codigo}">
							<f:selectItem itemValue="" itemLabel="Selecione..." />
							<f:selectItems value="#{empresaBean.estados}" />
							<f:ajax execute="estado" render="cidade" event="change" listener="#{empresaBean.actionCarregaCidades}"></f:ajax>
						</h:selectOneMenu>
					</h:panelGroup>
					<h:panelGroup>
						<h:selectOneMenu id="cidade" value="#{empresaBean.cidade.codigo}">
							<f:selectItem itemValue="" itemLabel="Selecione..." />
							<f:selectItems value="#{empresaBean.cidades}"></f:selectItems>
						</h:selectOneMenu>
					</h:panelGroup>

EmpresaBean.java

public class EmpresaBean {

	private Empresa empresa = new Empresa();
	private Endereco endereco = new Endereco();
	private List<Empresa> lista;
	private String destinoSalvar = "/restrito/empresa";
	private List<SelectItem> cidades = new ArrayList<SelectItem>();
	private Estado estado = new Estado();
	private Cidade cidade = new Cidade();

	public String novo() {
		this.empresa = new Empresa();
		this.endereco = new Endereco();
		this.estado = new Estado();
		this.cidade = new Cidade();
		return "/restrito/Empresa";
	}

	public void salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		EmpresaRN empresaRN = new EmpresaRN();
		EnderecoRN enderecoRN = new EnderecoRN();
		CidadeRN cidadeRN = new CidadeRN();
		EstadoRN estadoRN = new EstadoRN();

		Cidade cid = cidadeRN.buscarPorId(this.cidade.getCodigo());
		Estado est = estadoRN.buscarPorId(this.estado.getCodigo());

		this.endereco.setEstado(est);
		this.endereco.setCidade(cid);

		enderecoRN.salvar(this.endereco);

		this.empresa.setEndereco(this.endereco);

		if (!empresaRN.salvar(this.empresa)) {
			return;
		}

		FacesMessage facesMessage = new FacesMessage(
				"Fornecedor salvo com sucesso");
		context.addMessage(null, facesMessage);
		this.novo();
	}

	public String editar() {
		this.setEndereco(this.empresa.getEndereco());
		this.endereco.setEstado(this.endereco.getEstado());
		return "/restrito/empresa";
	}

	public String excluir() {
		EmpresaRN empresaRN = new EmpresaRN();
		empresaRN.excluir(this.empresa);
		this.lista = null;
		return null;
	}

	/**
	 * @return the listaEstado
	 */
	public List<SelectItem> getEstados() {
		EstadoRN estadoRN = new EstadoRN();

		List<Estado> listaEstado = estadoRN.listar();

		List<SelectItem> itens = new ArrayList<SelectItem>(listaEstado.size());

		for (Estado s : listaEstado) {
			itens.add(new SelectItem(s.getCodigo(), s.getSigla(), s.getNome()));
		}

		return itens;
	}

	public void actionCarregaCidades() {
		this.cidades = this.getCidadesByEstado();
	}

	public List<SelectItem> getCidadesByEstado() {
		CidadeRN cidadeRN = new CidadeRN();

		List<Cidade> cidades = cidadeRN.listar(this.estado.getCodigo());

		List<SelectItem> items = new ArrayList<SelectItem>(cidades.size());

		for (Cidade c : cidades) {
			items.add(new SelectItem(c.getCodigo(), c.getNome()));
		}

		return items;
	}

Se alguém tiver alguma sugestão de melhorar o código eu aceito tbm… porque sou novato…

vlww!!

8 Respostas

F

Eu acabei de descobrir uma coisa… não sei se ajuda na minha dúvida…

Eu estava usando o scopo request no faces-config.xml…
porém quando eu clicava em salvar…ele perdia as informações do combo e não salvava…

então coloquei view… agora ele salva…mas quando eu consulto e clico em editar ele não popula…
mas se eu deixo request… ele popula…

o session ele não perde as informações… sempre ficam la…

=´[

alandiniz

não sou muito bom em java + tenta fazer o seguinte

1° dexa request

2° retire todos os Objeto objeto = new Objeto();
3° coloque no construtor padrão da classe!

axo q só isso vai funcionar!

pelo que to vendo, vc ta passando certo, mais quando vc da um " = new " vc perde as informações…

qualquer coisa debuga seu método salvar e você vai ver as variáveis no console.

satangoss

Você precisa de um converter para mandar um objeto para um selectOnMenu.

public class EstadoConverter implements Converter {  
  
    public Object getAsObject(FacesContext context, UIComponent component, String value) {  
        return EstadoBC.buscar(value);  
    }  
  
    public String getAsString(FacesContext context, UIComponent component, Object value) {  
        return ((Estado) value).toString();  
    }  
  
}
<h:selectOneMenu id="estado" value="#{empresaBean.estado.codigo}"  converter="ufConverter" >  
        <f:selectItem itemValue="" itemLabel="Selecione..." />  
        <f:selectItems value="#{empresaBean.estados}" />  
        <f:ajax execute="estado" render="cidade" event="change" listener="#{empresaBean.actionCarregaCidades}"></f:ajax>  
    </h:selectOneMenu>

e adicionar o converter no faces-config:

<converter>
        <description>Um converter</description>
        <converter-id>ufConverter</converter-id>
        <converter-class>
        javabeat.jsf.CustomConverter
        </converter-class>

:)

F

Opa… vlw pela ajuda pessoal…

Umas dúvidas…

Mas o que seria esse EstadoBC.buscar(value)??

Eu continuo com o request mesmo?

E quando ele vai usar essa classe EstadoConverter??

Eu tenho um combo Cidade tbm… eu crio um para cidade??

Vlw!!!

F

Só uma informação…

Quando eu clico em salvar… ele nem entra no método salvar()…
Ele vai la no getEstados()…

E fala que a cidade não possui um valor válido…

satangoss

vais usar o ufConverter quando chamar seu h:selectOneMenu, e sim é ideal usar um converter para cada item mostrado em um combo, pois o compo não é um tipo primitivo e o JSF não sabe qual atributo do objeto retornar no menu.

F

Desculpa minha ignorância, mas o que é esse

EstadoBC.buscar(value)??

F

Eu tentei descobrir mais ou menos o que era…
agora está dando erro quando ele tenta dar o cast nessa linha
“((Estado) value).toString();”

public class EstadoConverter implements Converter {

	private EstadoRN estadoRN = new EstadoRN();

	public Object getAsObject(FacesContext context, UIComponent component,
			String value) {
		return estadoRN.buscarPorId(Integer.valueOf(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		return ((Estado) value).toString();
	}

}

Faces-config.xml

<converter>  
     <description>Converter Estado</description>  
     <converter-id>ufConverter</converter-id>  
     <converter-class>br.com.estudos.sgi.estado.EstadoConverter</converter-class>
</converter>
Criado 15 de dezembro de 2011
Ultima resposta 16 de dez. de 2011
Respostas 8
Participantes 3