Combos Aninhados usando JSF e JSP - Como Recuperar um Objeto?

74 respostas
P

Estou criando um sistema onde possuo 3 combos parecido com ( País, Estado, Cidade), e queria fazer isso sem usar AJAX.

Estou usando o listener valueChangeListener para chamar o método para recuperar os valores.

Para pegar o primeiro valor selecionado é tranquilo, eu uso o:

UISelectOne select = (UISelectOne)event.getSource();

recupero o valor selecionado e apartir dele consigo restringir o valor do 2º combo.

Agora meu problema. Como eu faço com o 3º combo? pois do jeito que estou fazendo só consigo pegar o valor do segundo combo. Como faço para recuperar dados da minha pagina?

Valew

74 Respostas

P

Ninguem pode me dar uma força?

K

Conseguiu resolver seu problema?

P

Nem… acabei usando o ajax mesmo

K

Blz. Tem como vc me passar um modelo ou exemplo para que eu desenrrole meu problema??

Feliz Ano Novo a todos!!!

P

Como vc está fazendo?

Me passa seu exemplo pra eu te ajudar com base nele.

K
pelikan:
Como vc está fazendo?

Me passa seu exemplo pra eu te ajudar com base nele.

Eae pelikan, blz??
Obrigado por ter respondido... segue o que eu estou "tentando" fazer abaixo:

public class UnidadeHandler implements Serializable {

	private static final long serialVersionUID = 1L;
	private Unidade unidade = new Unidade();
	private Long id;

	// select para programa
	private HtmlSelectOneMenu programaSelecionado;

	public HtmlSelectOneMenu getprogramaSelecionado() {
		return programaSelecionado;
	}

	public void setprogramaSelecionado(HtmlSelectOneMenu programaSelecionado) {
		this.programaSelecionado = programaSelecionado;
	}

	// select para servico
	private HtmlSelectOneMenu servicoSelecionado;

	public HtmlSelectOneMenu getservicoSelecionado() {
		return servicoSelecionado;
	}

	public void setservicoSelecionado(HtmlSelectOneMenu servicoSelecionado) {
		this.servicoSelecionado = servicoSelecionado;
	}

		// select para programaHandler
		private ProgramaHandler pegaProgramaHandler() {
			FacesContext facesContext = FacesContext.getCurrentInstance();
			ELContext elContext = facesContext.getELContext();
			ELResolver resolver = facesContext.getApplication().getELResolver();
			Object p = resolver.getValue(elContext, null, "programaHandler");
	
			return (ProgramaHandler) p;
		}
	
		public List<SelectItem> getProgramaParaComboBox() throws Exception {
			List<SelectItem> lista = new ArrayList<SelectItem>();
	
			// usaremos o id como valor e o nome como label para os SelectItem.
			ProgramaHandler handler = pegaProgramaHandler();
			for (Programa p : handler.getProgramas()) {
				lista.add(new SelectItem(p.getCod_programa(), p.getNome()));
			}
			return lista;
		}
	
		// select para servicoHandler
		private ServicoHandler pegaServicoHandler() {
			FacesContext facesContext = FacesContext.getCurrentInstance();
			ELContext elContext = facesContext.getELContext();
			ELResolver resolver = facesContext.getApplication().getELResolver();
			Object s = resolver.getValue(elContext, null, "servicoHandler");
	
			return (ServicoHandler) s;
		}
	
		public List<SelectItem> getServicoParaComboBox() throws Exception {
			List<SelectItem> lista = new ArrayList<SelectItem>();
			ServicoHandler handler = pegaServicoHandler();
			for (Servico s : handler.getServicos()) {
				String id = Long.toString(s.getCod_servico());
				lista.add(new SelectItem(id, s.getNome()));
			}
			return lista;
		}
	
		public void listarServicosByPrograma(ValueChangeEvent event) {
	//como eu devo proceder usando o ValueChangeEvent aqui????
       //eu sei q tenho q retornar uma lista de servicos que correspondam ao id do programa selecionado no combo anterior, mas não sei como instancia-los...
		}
public class ServicoDao extends Dao<Servico> {

	private Logger logger = Logger.getLogger(ServicoDao.class);

	public ServicoDao(Session session, Class<?> classe) {
		super(session, Servico.class);
	}

	public Servico pesquisaServicoById(Long cod_servico) {
		logger.info("pesquisaUnidadeById : " + cod_servico);
		return (Servico) session.load(Servico.class, cod_servico);
	}

	@SuppressWarnings("unchecked")
	public List<Servico> servicoByPrograma(Long cod_programa) {
		Query q = session.createQuery("select c from "
				+ Servico.class.getName()
				+ " as c where c.programa.cod_programa like :cod_programa");
		q.setParameter("cod_programa", cod_programa);

		return q.list();
	}

	@SuppressWarnings("unchecked")
	public List<Servico> pesquisaServicosNome(String nome) {
		Criteria c = session.createCriteria(Servico.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));

		return c.list();
	}

	@SuppressWarnings("unchecked")
	public List<Servico> pesquisaServicosId(Long id) {

		Criteria c = session.createCriteria(Servico.class);
		c.add(Restrictions.ilike("id", "%" + id + "%"));
		c.addOrder(Order.asc("id"));

		return c.list();
	}

}
Na JSP...
<h:outputLabel for="programa" value="Programa: " />
			<h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}" valueChangeListener="#{unidadeHandler.listarServicosByPrograma}" onchange="submit()">
				<f:selectItem itemValue="2" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.programaParaComboBox}" />
			</h:selectOneMenu>
		
		
		<h:outputLabel for="servico" value="Serviço: " />
			<h:selectOneMenu id="servico" binding="#{unidadeHandler.servicoSelecionado}" >
				<f:selectItem itemValue="3" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
			</h:selectOneMenu>

Agradeço a ajuda.

P

Cara, eu tentaria usar o ajax.

Faça algo do tipo

public void listarServicosByPrograma(ActionEvent event) {
        servicoSelecionado = null;
        FacesContext.getCurrentInstance().renderResponse();
    }

altere o tipo dos objetos
HtmlSelectOneMenu programaSelecionado
HtmlSelectOneMenu servicoSelecionado;

para o próprio objeto, parece que no seu caso ficaria

ProgramaHandler programaSelecionado;
ServicoHandler servicoSelecionado;

aí seu jsp ficaria algo desse tipo

<h:outputText value="Programa: " /> 
             <h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}">
                    <f:selectItems value="#{unidadeHandler.programaParaComboBox}" />  
	            <a4j:support event="onchange" 
                                     reRender="servico"
                                     actionListener="#{unidadeHandler.listarServicosByPrograma}"
                                     id="itemsDePrograma"/>
                </h:selectOneMenu>  
              
              
            <h:outputText value="Serviço: " />  
                <h:selectOneMenu id="servico" value="#{unidadeHandler.servicoSelecionado}" > 
                   <f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
               </h:selectOneMenu>

Espero que isso te ajude.

K
pelikan:
Cara, eu tentaria usar o ajax.

Faça algo do tipo

public void listarServicosByPrograma(ActionEvent event) {
        servicoSelecionado = null;
        FacesContext.getCurrentInstance().renderResponse();
    }

altere o tipo dos objetos
HtmlSelectOneMenu programaSelecionado
HtmlSelectOneMenu servicoSelecionado;

para o próprio objeto, parece que no seu caso ficaria

ProgramaHandler programaSelecionado;
ServicoHandler servicoSelecionado;

aí seu jsp ficaria algo desse tipo

<h:outputText value="Programa: " /> 
             <h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}">
                    <f:selectItems value="#{unidadeHandler.programaParaComboBox}" />  
	            <a4j:support event="onchange" 
                                     reRender="servico"
                                     actionListener="#{unidadeHandler.listarServicosByPrograma}"
                                     id="itemsDePrograma"/>
                </h:selectOneMenu>  
              
              
            <h:outputText value="Serviço: " />  
                <h:selectOneMenu id="servico" value="#{unidadeHandler.servicoSelecionado}" > 
                   <f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
               </h:selectOneMenu>

Espero que isso te ajude.

Valeu meu amigo, fiz conforme vc sugeriu, mas me apareceu um erro no console do eclipse dizendo assim:
04/01/2010 10:32:52 com.sun.faces.lifecycle.RenderResponsePhase execute
INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=Unidade:j_id_jsp_968518448_1pc8:unidade:j_id_jsp_1853232834_1pc9:servico[severity=(ERROR 2), summary=(Conversion Error setting value '3' for 'null Converter'. ), detail=(Conversion Error setting value '3' for 'null Converter'. )]
sourceId=Unidade:j_id_jsp_968518448_1pc8:unidade:j_id_jsp_1853232834_1pc9:programa[severity=(ERROR 2), summary=(Conversion Error setting value '1' for 'null Converter'. ), detail=(Conversion Error setting value '1' for 'null Converter'. )]

Eu criei uma classe converter e mapeei no faces-config, mesmo assim ele dá esse erro... olha só minha converter:

public class LongConverter implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor)
			throws ConverterException {
		Long resultado = null;
		try {
			resultado = new Long(Long.parseLong(valor));
		} catch (NumberFormatException nfe) {
			throw new ConverterException(valor + " não é um número válido!",
					nfe);
		}
		return resultado;
	}

	public String getAsString(FacesContext arg0, UIComponent arg1, Object obj)
			throws ConverterException {

		String resultado = "";
		if (obj != null) {
			resultado = obj.toString();
			return resultado;
		}

		if (obj instanceof Programa) {
			Programa aux = (Programa) obj;
			return aux.getCod_programa().toString();
		} else if (obj instanceof String
				&& ((String) obj).equalsIgnoreCase("-1")) {
			return "-1";
		} else
			throw new ConverterException("(" + obj.getClass()
					+ ") não é uma instância.");

	}
}

O que pode ser esse erro??
Deixa eu te falar: o banco é em postgresql, o existe uma tabela de programa, e uma de servico que é vinculada a tabela do programa, ou seja, cada servico é relacionado a um programa.
Valeu pela ajuda man!!!

K

Ei pelikan, eu mudei lá na jsp, onde tinha

<f:selectItem itemValue="3" itemLabel="Selecione"/>

para

<f:selectItem itemValue="" itemLabel="Selecione"/>

E agora ele me apresenta esse erro no console…

sourceId=Unidade:j_id_jsp_968518448_1pc8:unidade:j_id_jsp_1853232834_1pc9:programa[severity=(ERROR 2), summary=(/jsp/unidade/unidade.jsp(25,3) ‘#{unidadeHandler.programaSelecionado}’ java.lang.IllegalArgumentException: argument type mismatch), detail=(/jsp/unidade/unidade.jsp(25,3) ‘#{unidadeHandler.programaSelecionado}’ java.lang.IllegalArgumentException: argument type mismatch)

O que pode ser isso??

P

Tenta fazer o seguinte… tira essa parte do código e coloca uma linha antes de devolver a lista de selectItems com algo do tipo

lista.add(new SelectItem("", “Selecione”));

K
pelikan:
Tenta fazer o seguinte... tira essa parte do código e coloca uma linha antes de devolver a lista de selectItems com algo do tipo

lista.add(new SelectItem("", "Selecione"));

Essa alteração em:
public List<SelectItem> getProgramaParaComboBox() throws Exception {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ProgramaHandler handler = pegaProgramaHandler();
		for (Programa p : handler.getProgramas()) {
			//lista.add(new SelectItem(p.getCod_programa(), p.getNome()));
                       lista.add(new SelectItem("", "Selecione"));
		}
		return lista;
	}
ou em:
public List<SelectItem> getServicoParaComboBox() throws Exception {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		ServicoHandler handler = pegaServicoHandler();
		for (Servico s : handler.getServicos()) {
			//lista.add(new SelectItem(s.getCod_servico(), s.getNome()));
                       lista.add(new SelectItem("", "Selecione"));
		}
		return lista;
	}

Valeu!!

K

Quando eu faço essa alteração, os itens da minha combo ficam todas “Selecione”.

P

Faça assim

public List<SelectItem> getProgramaParaComboBox() throws Exception {  
        List<SelectItem> lista = new ArrayList<SelectItem>();  
      
       // usaremos o id como valor e o nome como label para os SelectItem.  
       ProgramaHandler handler = pegaProgramaHandler();  
       lista.add(new SelectItem("", "Selecione"));   
       for (Programa p : handler.getProgramas()) {  
           lista.add(new SelectItem(p.getCod_programa(), p.getNome()));  
       }  
       return lista;  
   }
K
pelikan:
Faça assim
public List<SelectItem> getProgramaParaComboBox() throws Exception {  
        List<SelectItem> lista = new ArrayList<SelectItem>();  
      
       // usaremos o id como valor e o nome como label para os SelectItem.  
       ProgramaHandler handler = pegaProgramaHandler();  
       lista.add(new SelectItem("", "Selecione"));   
       for (Programa p : handler.getProgramas()) {  
           lista.add(new SelectItem(p.getCod_programa(), p.getNome()));  
       }  
       return lista;  
   }

Amigão, se eu acrescentar essa linha, ele apenas me adciona uma opção "Selecione" no meu combo...
:(

P

então kleber, aí é estranho cara… dá uma debugada nesse for aí… esse seu lista era pra ter todos os programas e mais o selecione

K

pelikan:
então kleber, aí é estranho cara… dá uma debugada nesse for aí… esse seu lista era pra ter todos os programas e mais o selecione

Justamente. A minha lista retorna exatamente isso: os programas e mais o selecione. O problema que eu tenho , é que no combo seguinte, o de servicos, ele tem q me retornar apenas a lista dos servicos referentes ao programa selecionado no combo anterior…

:frowning:

P

Ok! mas então o primeiro combo está certo?

o segundo só irá popular a hora que vc selecionar alguma coisa…

vc está selecionando q não está populando nada?

está jogando algumas exceção?

K

pelikan:
Ok! mas então o primeiro combo está certo?

o segundo só irá popular a hora que vc selecionar alguma coisa…

vc está selecionando q não está populando nada?

está jogando algumas exceção?

Isso. O primeiro combo “programa” está correto. Ele popula os programas normalmente.
Só que quando eu seleciono um dos programas, o combo do serviço naum muda…
Não aparece nenhuma Exception na tela, mas no console aparece assim:

04/01/2010 11:43:38 com.sun.faces.lifecycle.RenderResponsePhase execute INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=Unidade:j_id_jsp_968518448_1pc8:unidade:j_id_jsp_1853232834_1pc9:programa[severity=(ERROR 2), summary=(/jsp/unidade/unidade.jsp(25,3) '#{unidadeHandler.programaSelecionado}' java.lang.IllegalArgumentException: argument type mismatch), detail=(/jsp/unidade/unidade.jsp(25,3) '#{unidadeHandler.programaSelecionado}' java.lang.IllegalArgumentException: argument type mismatch)]

Eu estou pesquisando essa exception, mas ainda não achei nada que possa explicar esse erro… :frowning:
ô trem complicado… rsrsrsrs

P

Esse problema é pq vc não deve ter nenhuma lugar pra renderizar mensagens de erro do ajax… mas alem disso agente deve tá tendo algum problema com o converter… você adicionou o converter no facesConfig?

tenta colocar isso no inicio ou fim do seu jsp

<a4j:outputPanel ajaxRendered=“true”><rich:messages /></a4j:outputPanel>

K
pelikan:
Esse problema é pq vc não deve ter nenhuma lugar pra renderizar mensagens de erro do ajax... mas alem disso agente deve tá tendo algum problema com o converter... você adicionou o converter no facesConfig?

tenta colocar isso no inicio ou fim do seu jsp

Adicionei o converter no faces-config sim. ficou assim:

<converter>
     <converter-id>LongConverter</converter-id>
     <converter-class>hibernateApp.converter.LongConverter</converter-class>
    </converter>
O Converter:
public class LongConverter implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor)
			throws ConverterException {
		Long resultado = null;
		try {
			resultado = new Long(Long.parseLong(valor));
		} catch (NumberFormatException nfe) {
			throw new ConverterException(valor + " não é um número válido!",
					nfe);
		}
		return resultado;
	}

	public String getAsString(FacesContext arg0, UIComponent arg1, Object obj)
			throws ConverterException {

		String resultado = "";
		if (obj != null) {
			resultado = obj.toString();
			return resultado;
		}

		if (obj instanceof Servico) {
			Servico aux = (Servico) obj;
			return aux.getPrograma_cod_programa().toString();
		} else if (obj instanceof String
				&& ((String) obj).equalsIgnoreCase("-1")) {
			return "-1";
		} else
			throw new ConverterException("(" + obj.getClass()
					+ ") não é uma instância.");

	}
}

Em que parte da jsp devo colocar o código q vc me passou??

K

Amigão, esse código <a4j:outputPanel ajaxRendered=“true”><rich:messages /></a4j:outputPanel> só me joga o erro do console na tela, né?
Aparece isso:
/jsp/unidade/unidade.jsp(26,3) ‘#{unidadeHandler.programaSelecionado}’ java.lang.IllegalArgumentException: argument type mismatch

P

isso… ele só serve pra jogar o output do console

aí no selectOneMenu vc adicionou o converter="#{longConverter}" ?

P

Eu não sei se isso faz diferença… mas no seu converter em vez de ele jogar exceção, retorna null se ele já vier com valor null.

K

pelikan:
Eu não sei se isso faz diferença… mas no seu converter em vez de ele jogar exceção, retorna null se ele já vier com valor null.

Eu estou usando o converter na jsp dessa forma:

<h:outputLabel for="programa" value="Programa: " /> <h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}" > <f:selectItem itemValue="" itemLabel="Selecione"/> <f:selectItems value="#{unidadeHandler.programaParaComboBox}" /> <a4j:support event="onchange" reRender="servico" actionListener="#{unidadeHandler.listarServicosByPrograma}" id="itemsDePrograma"/> <f:converter converterId="LongConverter"/> </h:selectOneMenu>

QUanto a mudança do retorno de exceção para null, acho q não resolve o problema.

P

coloco um breakpoint no converter e ve se ele está sendo chamado

K

Está chamando sim: se eu remover o converter, ele dá essa mensagem:
Conversion Error setting value ‘1’ for ‘null Converter’.

P

Seguinte… eu preciso entrar numa reunião agora…

o que eu faria é o seguinte…

na hora de adicionar a lista de selectItems eu adicionaria o objeto e o nome

tipo

lista.add(new SelectItem(programa, programa.getNome()));

aí eu criaria 2 converter

e nele eu faria algo tipo eu faço aqui no meu

public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
        if (object == null) {
            return null;
        }
        if (object instanceof Customer) {
            Customer o = (Customer) object;
            return o.getCustomerId() == null ? "" : o.getCustomerId().toString();
        } else {
            throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName());
        }
    }
K

oi pelikan, blz??

Fiz a alteração no meu converter como vc sugeriu, e agora ele me dá a exception na tela assim:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: objeto é do tipo java.lang.String
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

root cause

javax.servlet.ServletException: objeto é do tipo java.lang.String
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

root cause

java.lang.IllegalArgumentException: objeto é do tipo java.lang.String
	hibernateApp.converter.LongConverter.getAsString(LongConverter.java:56)
	com.sun.faces.taglib.jsf_core.ConverterTag$BindingConverter.getAsString(ConverterTag.java:103)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:469)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:502)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:757)
	com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:811)
	com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:335)
	javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:833)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:279)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:242)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:284)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.richfaces.renderkit.TabRendererBase.encodeChildren(TabRendererBase.java:113)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:266)
	org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:261)
	org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:121)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:271)
	com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:242)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:284)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.richfaces.renderkit.TabRendererBase.encodeChildren(TabRendererBase.java:113)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
	org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
	org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:266)
	org.richfaces.renderkit.html.TabPanelRenderer.doEncodeChildren(TabPanelRenderer.java:261)
	org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:121)
	javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
	javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
	com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:244)
	com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:175)
	org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
	org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:237)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
Apache Tomcat/6.0.14
P

Posta por favor como ficou o seu converter ,como está seu jsp, e como está o codigo que retorna a lista para o combo

K
pelikan:
Posta por favor como ficou o seu converter ,como está seu jsp, e como está o codigo que retorna a lista para o combo


Ok. Lá vai a bomba :D.

Antes de tudo, quero agradecer pela ajuda pelikan. Quem dera que pelo menos a minoria dos participantes do guj ajudassem os iniciantes em java como vc. Valeu.

public class LongConverter implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor)
			throws ConverterException {
		Long resultado = null;
		try {
			resultado = new Long(Long.parseLong(valor));
		} catch (NumberFormatException nfe) {
			throw new ConverterException(valor + " não é um número válido!",
					nfe);
		}
		return resultado;
	}


	public String getAsString(FacesContext facesContext, UIComponent component,
			Object object) throws IllegalArgumentException {
		if (object == null) {
			return null;
		}
		if (object instanceof Programa) {
			Programa o = (Programa) object;
			return o.getCod_programa() == null ? "" : o.getCod_programa()
					.toString();
		} else {
			throw new IllegalArgumentException("objeto " + object
					+ " é do tipo " + object.getClass().getName());
		}
	}

}

JSP

<h:outputLabel for="programa" value="Programa: " />
			<h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}" >
				<f:selectItem itemValue="" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.programaParaComboBox}" />
				<a4j:support event="onchange" reRender="servico" actionListener="#{unidadeHandler.listarServicosByPrograma}"
                                     id="itemsDePrograma"/>
                <f:converter converterId="LongConverter"/>
			</h:selectOneMenu>
		
		
		<h:outputLabel for="servico" value="Serviço: " />
			<h:selectOneMenu id="servico" value="#{unidadeHandler.servicoSelecionado}" >
				<f:selectItem itemValue="" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
			</h:selectOneMenu>
Código que retorna a lista para o combo:
private ProgramaHandler programaSelecionado;

	public ProgramaHandler getprogramaSelecionado() {
		return programaSelecionado;
	}

	public void setprogramaSelecionado(ProgramaHandler programaSelecionado) {
		this.programaSelecionado = programaSelecionado;
	}

	private ServicoHandler servicoSelecionado;

	public ServicoHandler getservicoSelecionado() {
		return servicoSelecionado;
	}

	public void setservicoSelecionado(ServicoHandler servicoSelecionado) {
		this.servicoSelecionado = servicoSelecionado;
	}
//...

private ProgramaHandler pegaProgramaHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object p = resolver.getValue(elContext, null, "programaHandler");

		return (ProgramaHandler) p;
	}

	public List<SelectItem> getProgramaParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ProgramaHandler handler = pegaProgramaHandler();
		for (Programa p : handler.getProgramas()) {
			// String id = Long.toString(p.getCod_programa());
			lista.add(new SelectItem(p.getCod_programa(), p.getNome()));

		}
		return lista;
	}

	// select para servicoHandler
	private ServicoHandler pegaServicoHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object s = resolver.getValue(elContext, null, "servicoHandler");

		return (ServicoHandler) s;
	}

	public List<SelectItem> getServicoParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		ServicoHandler handler = pegaServicoHandler();
		for (Servico s : handler.getServicos()) {
			// String id = Long.toString(s.getPrograma_cod_programa()); \\tentei converter para string por aqui, mas dá o mesmo erro...
			lista
					.add(new SelectItem(s.getPrograma_cod_programa(), s
							.getNome()));
		}
		return lista;
	}

	public void listarServicosByPrograma(ActionEvent event) {
		servicoSelecionado = null;
		FacesContext.getCurrentInstance().renderResponse();

	}
P

Kleber, seguinte…

imagina que seu LongConverter agora é na verdade um ProgramaConverter, então você tem que fazer que o retorno do getAsObject dele retorne um objeto Programa. faça algo do tipo

public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor)  
             throws ConverterException {  
         Programa resultado = null;  
         try {  
	     //Imagina que o valor que vem aqui vai ser a String que você está retornando no getAsString
             //Como você está retornando o getCod_Programa
             //então nesse ponto você vai ter que encontrar uma forma de transformar a string que veio 
             //do getCod_Programa() no objeto Programarelativo a ele.
             // Você pode fazer algo desse tipo que acho que dá certo

	     FacesContext facesContext = FacesContext.getCurrentInstance();  
             ELContext elContext = facesContext.getELContext();  
             ELResolver resolver = facesContext.getApplication().getELResolver();  
             ProgramaHandler p = (ProgramaHandler) resolver.getValue(elContext, null, "programaHandler");  

             Long valorSelecionado = new Long(Long.parseLong(valor));  

             for (Programa achaPrograma : p.getProgramas()) {  
		if(achaPrograma.getCod_programa() == valorSelecionado){
			resultado = achaPrograma;
			break;
		} 
	     }
             //Dessa forma você deveria estar retornando o objeto programa selecionado.
             //Coloca um breakpoint por aqui pra verificar se o programa retornado está correto.
	     return resultado;
		
         } catch (NumberFormatException nfe) {  
             throw new ConverterException(valor + " não é um número válido!",  
                     nfe);  
         }  
         return resultado;  
     }

Outra coisa. o seu getAsString deve receber um objeto Programa, assim na parte que você faz

lista.add(new SelectItem(p.getCod_programa(), p.getNome()));

deve ficar

lista.add(new SelectItem(p, p.getNome()));

Entendeu qual o esquema?

Qualquer coisa me avisa

K

pelikan meu amigo... vou te falar uma coisa...
ô trem complicado!!!
rsrsrs

mesmo com as alterações, está dando o mesmo erro... ele sempre bate em cima do illegalArgumentException...
exception

javax.servlet.ServletException: javax.servlet.ServletException: objeto  é do tipo java.lang.String
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

root cause

javax.servlet.ServletException: objeto  é do tipo java.lang.String
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

Pelo que eu entendi (muito pouco, estou comecei o ano gripado e meu raciocínio está uma #@$#%...) ele está encontrando problemas ao converter minha id em string. Esse código LongConverter eu encontrei na net só que de Integer para String... Fiz aquelas adaptaçoes básicas, mas acho q alguma coisa está errada... na minha classe programa, ela está implementando Serializable... será q isso está correto??
Eu já tentei outros métodos, inclusive usando o valuechangelistener, e ele dá o mesmo erro... estou começando a achar q é na minha classe que monta as tabelas do banco...

o q vc acha?

P

Você alterou o retorno da lista pro seu combo para
lista.add(new SelectItem(p, p.getNome()));?

Se sim, REMOVE essa linha do seu JSP
<f:selectItem itemValue="" itemLabel=“Selecione”/>

Se ainda assim não funcionar,
Coloca um breakpoint no getASString e me fala quantas vezes tá entrando nele e qual o valor

Bele?

K

pelikan:
Você alterou o retorno da lista pro seu combo para
lista.add(new SelectItem(p, p.getNome()));?

Se sim, REMOVE essa linha do seu JSP
<f:selectItem itemValue="" itemLabel=“Selecione”/>

Se ainda assim não funcionar,
Coloca um breakpoint no getASString e me fala quantas vezes tá entrando nele e qual o valor

Bele?

Alterei o retorno sim, ficou:

ProgramaHandler handler = pegaProgramaHandler(); for (Programa p : handler.getProgramas()) { lista.add(new SelectItem(p, p.getNome()));
Quando eu removo a linha <f:selectItem itemValue="" itemLabel=“Selecione”/>, ele abre legal, mostra a primeira opção do ComboBox que é PSB, mas até então ele ainda não altera o combo seguinte: quando eu tento mudar para a segunda opção do combo (que é PSM), ele me dá a mensagem na tela:

Unidade:j_id_jsp_968518448_1pc8:unidade:j_id_jsp_1853232834_1pc9:programa: Validation Error: Value is not valid

Pelo menos agora deu um erro diferente :stuck_out_tongue:

E agora?

P

Beleza, temos um avanço…

faz assim, só pra gente ter ctz se o erro é na seleção ou é na hora que ele tenta acessar o outro combo…

remove do jsp a parte do a4j:support, ele não vai tentar renderizar o proximo combo, ve se isso faz não dar problema quando vc seleciona.

valew

K

pelikan, dei uma conferida no Converter, e fiz uma correção pra ficar como o q vc me mandou…

se eu remover aquela linha q vc pediu só do programa, ele naum me dá erro nenhum, mas tb naum funciona (ou seja, ele naum me mostra os servicos daquele programa selecionado…)
Se eu remover aquela linha tanto de programa quanto de servico, ele me dá esse erro:
Conversion Error setting value ‘br.gov.rr.setrabes.estrutura.Servico@5c’ for ‘null Converter’.

P

Então kra… voce vai ter que fazer um converter quase igual esse que vc fez pra retornar programa, um novo pra retornar serviço.

Faz ele da mesma forma,

quando terminar me posta como ficou que agente faz esse negócio funcionar.

Valew

K
pelikan:
Então kra... voce vai ter que fazer um converter quase igual esse que vc fez pra retornar programa, um novo pra retornar serviço.

Faz ele da mesma forma,

quando terminar me posta como ficou que agente faz esse negócio funcionar.

Valew

mano, veja se é assim q tu quer:
public class LongConverterServico implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor)
			throws ConverterException {
		Servico resultado = null;
		try {

			FacesContext facesContext = FacesContext.getCurrentInstance();
			ELContext elContext = facesContext.getELContext();
			ELResolver resolver = facesContext.getApplication().getELResolver();
			ServicoHandler s = (ServicoHandler) resolver.getValue(elContext,
					null, "servicoHandler");

			Long valorSelecionado = new Long(Long.parseLong(valor));

			for (Servico achaServico : s.getServicos()) {
				if (achaServico.getPrograma_cod_programa() == valorSelecionado) { //achei correto chamar aqui o relacionamento do programa 
                                                                                                                                     //com o servico, ao invés do cod_servico...
					resultado = achaServico;
					break;
				}
			}

			return resultado;

		} catch (NumberFormatException nfe) {
			throw new ConverterException(valor + " não é um número válido!",
					nfe);
		}
		// return resultado;
	}

	public String getAsString(FacesContext facesContext, UIComponent component,
			Object object) throws IllegalArgumentException {
		if (object == null) {
			return null;
		}
		if (object instanceof Servico) {
			Servico o = (Servico) object;
			return o.getPrograma_cod_programa() == null ? "" : o
					.getPrograma_cod_programa().toString();
		} else {
			throw new IllegalArgumentException("objeto " + object
					+ " é do tipo " + object.getClass().getName());
		}
	}

}
P

bele,
aí tira o
<f:selectItem itemValue=“3” itemLabel=“Selecione”/> do jsp

e

altera

lista.add(new SelectItem(id, s.getNome()));

para

lista.add(new SelectItem(s, s.getNome()));

Ve se com isso ele para de dar pau…

ainda não vai renderizar o segundo combo com a seleção, mas não é pra dar exceção. Ve aí e me fala

K

pelikan:
bele,
aí tira o
<f:selectItem itemValue=“3” itemLabel=“Selecione”/> do jsp

e

altera

lista.add(new SelectItem(id, s.getNome()));

para

lista.add(new SelectItem(s, s.getNome()));

Ve se com isso ele para de dar pau…

ainda não vai renderizar o segundo combo com a seleção, mas não é pra dar exceção. Ve aí e me fala

Blz.
Ele realmente não está renderizando, mas não está dando pau!!!
E agora? :stuck_out_tongue_winking_eye: ô paciencia de Jó q tu tens ein!!! rsrsrs

P

agora agente precisa alterar esse cara

public List<SelectItem> getServicoParaComboBox() throws Exception {  
             List<SelectItem> lista = new ArrayList<SelectItem>();  
             ServicoHandler handler = pegaServicoHandler();  
             for (Servico s : handler.getServicos()) {  
                 String id = Long.toString(s.getCod_servico());  
                 lista.add(new SelectItem(id, s.getNome()));  
             }  
             return lista;  
         }

Eu não consigo ver seu código inteiro, você vai ter alterar esse método pra popular seu combo apartir do programa selecionado.
Imagina que a variavel programaSelecionado ou algo assim tem o programa que você selecionou. Nesse método, a primeira coisa que você faz é ver se a variavel programaSelecionado == null, se não for você vai ter que lista.add apenas nos serviços que forem relacionados ao programaSelecionado, como você vai fazer pra restringir? deve ter um id no serviços ou algo assim que vc compare com o programaSelecionado?

K

pelikan:
agora agente precisa alterar esse cara

public List<SelectItem> getServicoParaComboBox() throws Exception {  
             List<SelectItem> lista = new ArrayList<SelectItem>();  
             ServicoHandler handler = pegaServicoHandler();  
             for (Servico s : handler.getServicos()) {  
                 String id = Long.toString(s.getCod_servico());  
                 lista.add(new SelectItem(id, s.getNome()));  
             }  
             return lista;  
         }

Eu não consigo ver seu código inteiro, você vai ter alterar esse método pra popular seu combo apartir do programa selecionado.
Imagina que a variavel programaSelecionado ou algo assim tem o programa que você selecionou. Nesse método, a primeira coisa que você faz é ver se a variavel programaSelecionado == null, se não for você vai ter que lista.add apenas nos serviços que forem relacionados ao programaSelecionado, como você vai fazer pra restringir? deve ter um id no serviços ou algo assim que vc compare com o programaSelecionado?

Blz mano. Olha só:

Eu tenho uma tabela de Programa, que contem as colunas cod_programa e nome. A outra tabela é de servico, e tem as colunas cod_servico, nome e programa_cod_programa (relacionamento). No caso, se eu entendi, eu preciso que, na hora de listar os servicoParaComboBox, ele verifique se o programaSelecionado == null, caso contrario, me mostre apenas os servicos com o programa_cod_programa = ao do cod_programa selecionado, naum é?? :stuck_out_tongue_winking_eye: na teoria é facil, mas fazer no código pra mim é dificil… pelo menos no começo… hehehehe

Valeu man!!!

P

Perfeito! exatamente isso!

K

pelikan, amigão, veja pra mim se é mais ou menos isso que deve ficar…

public List<SelectItem> getServicoParaComboBox() { List<SelectItem> lista = new ArrayList<SelectItem>(); ServicoHandler handler = pegaServicoHandler(); for (Servico s : handler.getServicos()) { if (programaSelecionado != null && programaSelecionado.getPrograma().getNome() == "PSB") { //lembrando que PSB está dentro do primeiro combobox... String id = Long.toString(s.getPrograma_cod_programa()); lista.add(new SelectItem(id, s.getNome())); //como é que eu faço pra listar apenas os serviços que tenham o programa_cod_programa = ao do combo anterior?? - empaquei aqui... tenho q usar a criteria??? } return lista; } return null; }

Agradeço a ajuda!!

P

Algo desse tipo

public List<SelectItem> getServicoParaComboBox() {  
            List<SelectItem> lista = new ArrayList<SelectItem>();  
            ServicoHandler handler = pegaServicoHandler();  
            for (Servico s : handler.getServicos()) {  
                if (programaSelecionado != null) { //Não entendi essa comparação com PSB, vc não precisa disso
	            if(programaSelecionado.getCod_programa() == s.getPrograma_cod_programa()){
			lista.add(new SelectItem(s, s.getNome())); //lembrando que aqui você vai adicionar o objeto s e não o id
		    }
                }                  
           }  
           return lista;  
       }
K
pelikan:
Algo desse tipo
public List<SelectItem> getServicoParaComboBox() {  
            List<SelectItem> lista = new ArrayList<SelectItem>();  
            ServicoHandler handler = pegaServicoHandler();  
            for (Servico s : handler.getServicos()) {  
                if (programaSelecionado != null) { //Não entendi essa comparação com PSB, vc não precisa disso
	            if(programaSelecionado.getCod_programa() == s.getPrograma_cod_programa()){
			lista.add(new SelectItem(s, s.getNome())); //lembrando que aqui você vai adicionar o objeto s e não o id
		    }
                }                  
           }  
           return lista;  
       }

Blz. eu fiz essa alteração, mas ele continua naum me listando os serviços...

eu vou postar meu ProgramaHandler pra ver se tu acha o erro nele...

public class ProgramaHandler {

	private Programa programa = new Programa();
	private Long cod_programa;

	public Programa getPrograma() {
		return programa;
	}

	public List<Programa> getProgramas() {
		System.out.println("Carregando a lista de programas ...");
		Session session = HibernateUtil.currentSession();
		Dao<Programa> dao = new Dao<Programa>(session, Programa.class);
		return dao.list();
	}

	public String salva() {
		System.out.println("Adicionando: " + programa.getNome());
		Session session = HibernateUtil.currentSession();
		Dao<Programa> dao = new Dao<Programa>(session, Programa.class);
		dao.merge(this.programa);

		this.programa = new Programa();
		return "sucesso";
	}

	public String excluir(ActionEvent event) {
		System.out.println("Excluindo: " + programa.getCod_programa());
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("excluir");
		Long id = (Long) param.getValue();

		Session session = HibernateUtil.currentSession();
		Dao<Programa> programaDao = new Dao<Programa>(session, Programa.class);
		this.programa = programaDao.load(id);
		programaDao.delete(this.programa);
		this.programa = new Programa();
		return "excluido";

	}

	public void escolhePrograma(ActionEvent event) {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editCod");
		Long id = (Long) param.getValue();

		Session session = HibernateUtil.currentSession();
		Dao<Programa> dao = new Dao<Programa>(session, Programa.class);
		this.programa = dao.load(id);
	}

	public void validaCase(FacesContext fc, UIComponent component, Object value) {
		String valor = value.toString();
		if (!valor.matches("[A-Z].*")) {
			throw new ValidatorException(new FacesMessage(
					"Inicie o nome com letra maiúscula!"));
		}
	}

	public void setCod_programa(Long cod_programa) {
		this.cod_programa = cod_programa;
	}

	public Long getCod_programa() {
		return cod_programa;
	}

}

Ele não carrega nenhum item no combo de servico. Será que ele está achando o id do combo anterior?? ou é problema no método:

public void listarServicosByPrograma(ActionEvent event) {
		servicoSelecionado = null;
		FacesContext.getCurrentInstance().renderResponse();
P

coloca assim e me fala o que tá sendo impresso no console

public List<SelectItem> getServicoParaComboBox() {    
          List<SelectItem> lista = new ArrayList<SelectItem>();    
          ServicoHandler handler = pegaServicoHandler();    
         System.out.println("Populando Serviços");
          for (Servico s : handler.getServicos()) {    
              if (programaSelecionado != null) { //Não entendi essa comparação com PSB, vc não precisa disso  
                    System.out.println("Valor do Serviço -> " + s.getPrograma_cod_programa());
                    System.out.println("Valor do Programa -> " + programaSelecionado.getCod_programa());
           if(programaSelecionado.getCod_programa() == s.getPrograma_cod_programa()){  
 lista.add(new SelectItem(s, s.getNome())); //lembrando que aqui você vai adicionar o objeto s e não o id  
    }  
              }                    
         }    
         return lista;    
     }
K

pelikan:
coloca assim e me fala o que tá sendo impresso no console

public List<SelectItem> getServicoParaComboBox() { List<SelectItem> lista = new ArrayList<SelectItem>(); ServicoHandler handler = pegaServicoHandler(); System.out.println("Populando Serviços"); for (Servico s : handler.getServicos()) { if (programaSelecionado != null) { //Não entendi essa comparação com PSB, vc não precisa disso System.out.println("Valor do Serviço -> " + s.getPrograma_cod_programa()); System.out.println("Valor do Programa -> " + programaSelecionado.getCod_programa()); if(programaSelecionado.getCod_programa() == s.getPrograma_cod_programa()){ lista.add(new SelectItem(s, s.getNome())); //lembrando que aqui você vai adicionar o objeto s e não o id } } } return lista; }

Ele só printa até o “Populando Servicos”… eu coloquei tb um syso no for, e até aí ele printa tb…

for (Servico s : handler.getServicos()) { System.out.println("###########LENDO O FOR###########"); //até aqui ele lê... pra baixo, mais nada.... if (programaSelecionado != null && programaSelecionado.getCod_programa() == s .getPrograma_cod_programa()) { System.out.println("Valor do Serviço -> " + s.getPrograma_cod_programa()); System.out.println("Valor do Programa -> " + programaSelecionado.getCod_programa());

Eu to achando que o problema está na classe ProgramaHandler, pois quando vc me sujeriu colocar “programaSelecionado.getCod_programa()” me apareceu um erro me dizendo que esse método naum tinha sido definido em ProgramaHandler. Aí eu criei o método, mas acho q ele naum está vinculando ao Cod_programa da tabela programa… acho q é algum problema assim… eu postei antes a classe, dá uma olhadinha lá…

K

O que eu falei antes eu corrigi. ficou assim:

public List<SelectItem> getServicoParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		ServicoHandler handler = pegaServicoHandler();
		System.out.println("###########Populando Serviços###########");
		for (Servico s : handler.getServicos()) {
			System.out.println("###########LENDO O FOR###########");
			if (programaSelecionado != null
					&& programaSelecionado.getPrograma().getCod_programa() == s
							.getPrograma_cod_programa()) {
				System.out.println("Valor do Serviço -> "
						+ s.getPrograma_cod_programa());
				System.out.println("Valor do Programa -> "
						+ programaSelecionado.getPrograma().getCod_programa());

				lista.add(new SelectItem(s, s.getNome()));
				System.out
						.println("#######LISTANDO OS SERVICOS DO PROGRAMA SELECIONADO#########");
			}

		}
		return lista;
	}

Mas continua não carregando os serviços... será q eu não teria q usar uma criteria para receber o valor do combo anterior e me retornar uma lista de servicos referentes ao programa desse combo??

P

Kra… vc tem um setProgramaSelecionado certo?

coloca um breakpoint ou um system.out.println pra pegar o valor que ele tá recebendo pra ver o q tá vindo pra ele

outra coisa… altera a seleção no combo programa e ve se ele chama esse setProgramaSelecionado

K

pelikan:
Kra… vc tem um setProgramaSelecionado certo?

coloca um breakpoint ou um system.out.println pra pegar o valor que ele tá recebendo pra ver o q tá vindo pra ele


se eu colocar um system.out.println assim:

public void setProgramaSelecionado(ProgramaHandler programaSelecionado) { this.programaSelecionado = programaSelecionado; System.out.println("Valor do Programa -> " + programaSelecionado.getPrograma().getCod_programa()); }
…ele me retorna esse erro na tela: /jsp/unidade/unidade.jsp(26,3) ‘#{unidadeHandler.programaSelecionado}’ Error writing ‘programaSelecionado’ on type xxx.handler.UnidadeHandler

Dá o erro acima descrito… ;(

Mas estamos quase lá :smiley: Valeu!!!

K

Olha amigão, coloquei assim:

public void setProgramaSelecionado(ProgramaHandler programaSelecionado) { this.programaSelecionado = programaSelecionado; System.out.println("Valor do Programa -> " + this.programaSelecionado); }

e está me retornando:

Hibernate: select this_.cod_programa as cod1_15_0_, this_.nome as nome15_0_ from programa this_ Valor do Programa -> null

Ajuda em alguma coisa?

P

Ajuda sim kra…

Você tá alterando a seleção das combo do programa e ele não imprimi mais nenhuma linha?

me manda denovo seu jsp… mas parece q ele não tá atualizando a seleção do combo.

Vc adicionou a tag do ajax no começo do arquivo?

K
pelikan:
Ajuda sim kra...

Você tá alterando a seleção das combo do programa e ele não imprimi mais nenhuma linha?

me manda denovo seu jsp... mas parece q ele não tá atualizando a seleção do combo.

Vc adicionou a tag do ajax no começo do arquivo?

Bom dia mano. Segue minha JSP.

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j" %>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich" %>
 
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cadastro de Unidades</title>
</head>
<body>

	<f:subview id="unidade">
		<h:form>
			<h:panelGrid>
<a4j:outputPanel ajaxRendered="true"><rich:messages /></a4j:outputPanel>   
		
		<h:outputText value="Órgão Gestor: " />
			<h:selectOneMenu binding="#{unidadeHandler.orgaogestorSelecionado}">
				<f:selectItem itemValue="" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.orgaoGestorParaComboBox}" />
			</h:selectOneMenu>
		
		
		<h:outputLabel for="programa" value="Programa: " />
			<h:selectOneMenu id="programa" value="#{unidadeHandler.programaSelecionado}" >
				<f:selectItem itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.programaParaComboBox}" />
				<a4j:support event="onchange" reRender="servico" actionListener="#{unidadeHandler.listarServicosByPrograma}"
                                     id="itemsDePrograma"/>
                <f:converter converterId="LongConverterPrograma"/>
			</h:selectOneMenu>
		
		
		<h:outputLabel for="servico" value="Serviço: " />
			<h:selectOneMenu id="servico" value="#{unidadeHandler.servicoSelecionado}" >
				<f:selectItem itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.servicoParaComboBox}" />
				
			</h:selectOneMenu>
			
			
		<h:outputText value="Modalidade Institucional: " />
			<h:selectOneMenu binding="#{unidadeHandler.modalidadeSelecionado}">
				<f:selectItem itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.modalidadeParaComboBox}" />
			</h:selectOneMenu>	
		
		
		<h:outputText value="Abrangência: "/>
			<h:outputText value="Município: "/><h:selectBooleanCheckbox value="#{unidadeHandler.unidade.abrangencia_municipio}"/>
			<h:outputText value="Estado: "/><h:selectBooleanCheckbox value="#{unidadeHandler.unidade.abrangencia_estado}"/>
			<h:outputText value="Território: "/><h:selectBooleanCheckbox value="#{unidadeHandler.unidade.abrangencia_territorio}"/>
			<h:outputText value="Área Rural: "/><h:selectBooleanCheckbox value="#{unidadeHandler.unidade.abrangencia_arearural}"/>
		<br/>
		
		
		<h:outputText value="Denominação Institucional: " />
		<h:inputText value="#{unidadeHandler.unidade.nome}" validator="#{unidadeHandler.validaCase}">
			<f:validateLength minimum="5" />
		</h:inputText>
		<br/>

		<h:outputText value="Responsável pela Unidade: " />
			<h:selectOneMenu binding="#{unidadeHandler.usuarioSelecionado}">
				<f:selectItem itemValue="" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.usuarioParaComboBox}" />
			</h:selectOneMenu>
		
		
		<h:outputText value="Endereço: " />	
		<h:inputText value="#{unidadeHandler.unidade.endereco}" validator="#{unidadeHandler.validaCase}">
			<f:validateLength minimum="5" />
		</h:inputText>
		<br/>

		<h:outputText value="Complemento: " />
		<h:inputText value="#{unidadeHandler.unidade.endereco_complemento}" validator="#{unidadeHandler.validaCase}">
		</h:inputText>
		<br/>
		
		<h:outputText value="Bairro: " />
		<h:inputText value="#{unidadeHandler.unidade.bairro}" validator="#{unidadeHandler.validaCase}">
		</h:inputText>
		<br/>
		
		<h:outputText value="Município: " />
		<h:selectOneMenu binding="#{unidadeHandler.municipiosrrSelecionado}">
				<f:selectItem itemValue="" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.municipiosRRParaComboBox}" />
		</h:selectOneMenu>
		
		<h:outputText value="Fone: " />
		<h:inputText value="#{unidadeHandler.unidade.fone}" >
			<f:validateLength minimum="5" />
		</h:inputText>
		<br/>
		
		<h:outputText value="Fax: " />
		<h:inputText value="#{unidadeHandler.unidade.fax}"  ></h:inputText>
		<br/>

		<h:outputText value="E-mail: " />
		<h:inputText value="#{unidadeHandler.unidade.email}"  >	</h:inputText>
		<br/>
		
		<h:outputText value="ESTRUTURA FÍSICA" />
		<br/>
		<h:outputText value="Em Funcionamento? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.funcionamento}">
			</h:selectBooleanCheckbox>
		<br/>
		
		<h:outputText value="Prédio Exclusivo? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.predioexclusivo}">
			</h:selectBooleanCheckbox>
		<br/>
		
		<h:outputText value="Compartilhado? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.compartilhado}">
			</h:selectBooleanCheckbox>
		<br/>
		
		<h:outputText value="Complemento: "/>
		<h:inputText value="#{unidadeHandler.unidade.compartilhado_complemento}" required="false" >

		</h:inputText>
		<br/>

	
		<h:outputText value="Possui condições de acessibilidade para pessoas com deficiência? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.condicoesacessibilidade}">
			</h:selectBooleanCheckbox>
		<br/>	
		<h:outputText value="EQUIPAMENTOS" />
		<br/>
		
		<h:outputText value="Possui telefone? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.telefone}">
			</h:selectBooleanCheckbox>
		
		<h:outputText value="Observações sobre o Telefone: "/>
		<h:inputText value="#{unidadeHandler.unidade.telefone_complemento}" required="false" ></h:inputText>
		<br/>

		<h:outputText value="Possui computador? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.computador}">
			</h:selectBooleanCheckbox>
				
		<h:outputText value="Quantidade: "/>
		<h:inputText value="#{unidadeHandler.unidade.computador_qtde}" required="false" ></h:inputText>
		<br/>		
			
		<h:outputText value="Possui impressora? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.impressora}">
			</h:selectBooleanCheckbox>
				
		<h:outputText value="Quantidade: "/>
		<h:inputText value="#{unidadeHandler.unidade.impressora_qtde}" required="false" ></h:inputText>
		<br/>	
				
		<h:outputText value="Mobiliário Adequado? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.mobiliario_adequado}">
			</h:selectBooleanCheckbox>		
		<br/>	
		
		<h:outputText value="Possui alguma forma de acesso à Internet? "/>
		<h:selectOneMenu binding="#{unidadeHandler.internetSelecionado}">
				<f:selectItem itemValue="6" itemLabel="Selecione"/>
				<f:selectItems value="#{unidadeHandler.internetParaComboBox}" />
		</h:selectOneMenu>
		<br/>
				
		<h:outputText value="Possui transporte próprio? "/>
			<h:selectBooleanCheckbox value="#{unidadeHandler.unidade.transporte_proprio}">
			</h:selectBooleanCheckbox>		
		<br/>	
			
			
		<h:commandButton value="Salvar" action="#{unidadeHandler.salva}" />
		
	</h:panelGrid>
	</h:form>
	
	<rich:spacer height="10"/>
	<rich:separator height="1" lineType="dotted"/>
	<rich:spacer height="10"/>
	

	
	

	
	</f:subview>

</body>
</html>
K

pelikan, eu estive olhando as outras opçoes do meu sistema, onde tem o selectOneMenu... todos os valores selecionados nas combos são nulos, mas quando manda salvar no banco, o banco recebe o valor normalmente...

o q pode ser isso??

Eu tirei pra testar a condiçao:
programaSelecionado != null
Só pra ver o q dava, e deu pau:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: /jsp/unidade/unidade.jsp(38,4) '#{unidadeHandler.servicoParaComboBox}' Error reading 'servicoParaComboBox' on type br.gov.rr.setrabes.handler.UnidadeHandler
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

root cause

javax.servlet.ServletException: /jsp/unidade/unidade.jsp(38,4) '#{unidadeHandler.servicoParaComboBox}' Error reading 'servicoParaComboBox' on type br.gov.rr.setrabes.handler.UnidadeHandler
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

...

q coisa... ;D

P

Então cara. aparentemente tá certinho o seu jsp, o que deve tá errado é seu converter no getasobject que deve estar retornando null em vez do objeto programa… coloca um system.out.println antes do return no metodo getAsObject pra ver o que ele retorna depois que vc seleciona algum programa no combo.

Bele?

K

pelikan:
Então cara. aparentemente tá certinho o seu jsp, o que deve tá errado é seu converter no getasobject que deve estar retornando null em vez do objeto programa… coloca um system.out.println antes do return no metodo getAsObject pra ver o que ele retorna depois que vc seleciona algum programa no combo.

Bele?

Bom dia amigo, seria mais ou menos isso??
O que eu acho estranho q todas as outras jsp que usam o HtmlSelectOneMenu retornam o valor como null, mas mesmo assim, gravam tudo certinho no banco…

public String getAsString(FacesContext facesContext, UIComponent component, Object object) throws IllegalArgumentException { if (object == null) { System.out.println("Valor do objeto no converter: " + object); return null; } if (object instanceof Programa) { Programa o = (Programa) object; return o.getCod_programa() == null ? "" : o.getCod_programa() .toString(); } else { throw new IllegalArgumentException("objeto " + object + " é do tipo " + object.getClass().getName()); }

K

Mano, o valor do object continua null. E na jsp ele me mostra esse erro:

/jsp/unidade/unidade.jsp(26,3) ‘#{unidadeHandler.programaSelecionado}’ Error writing ‘programaSelecionado’ on type xxx.handler.UnidadeHandler

P

Coloca esse
System.out.println("Valor do objeto no converter: " + object);
no segundo return tbm

O esquema dos valores Null é que enquanto não faz o submit ele não joga o valor nos objetos, agora como agente tá usando ajax, ele faz tipo um submit por traz dos pano, e esse valor é carregado.

K

pelikan:
Coloca esse
System.out.println("Valor do objeto no converter: " + object);
no segundo return tbm

O esquema dos valores Null é que enquanto não faz o submit ele não joga o valor nos objetos, agora como agente tá usando ajax, ele faz tipo um submit por traz dos pano, e esse valor é carregado.

Ei mano, saca só:

public String getAsString(FacesContext facesContext, UIComponent component, Object object) throws IllegalArgumentException { if (object == null) { System.out.println("Valor do object no converter no 1 retorno: " + object); return null; } if (object instanceof Programa) { Programa o = (Programa) object; System.out.println("Valor do o.getCod_programa no converter: " + o.getCod_programa()); System.out.println("Valor do object no converter no 2 retorno: " + object); return o.getCod_programa() == null ? "" : o.getCod_programa() .toString(); } else { throw new IllegalArgumentException("objeto " + object + " é do tipo " + object.getClass().getName()); } }

olha o print:

Valor do object no converter no 1 retorno: null Valor do o.getCod_programa no converter: 1 Valor do object no converter no 2 retorno: br.gov.rr.setrabes.estrutura.Programa@0 //aqui não me retorna null Valor do o.getCod_programa no converter: 2 Valor do object no converter no 2 retorno: br.gov.rr.setrabes.estrutura.Programa@0

P

Ah kra… achei onde tá o problema po

olha

private ProgramaHandler programaSelecionado;  

 public ProgramaHandler getprogramaSelecionado() {  
     return programaSelecionado;  
 }  

Agente fala pra listar objetos do tipo Programa, mas no bean o objeto é do tipo ProgramaHandler. Aí vai dar pau mesmo... o converter retorna um programa, não um ProgramaHandler, tenta alterar esse tipo pra Programa só, ve onde essa alteração vai quebrar seu código.

Não esquece de alterar o ServiçoHandler tbm
K

pelikan:
Ah kra… achei onde tá o problema po

olha

private ProgramaHandler programaSelecionado;  

 public ProgramaHandler getprogramaSelecionado() {  
     return programaSelecionado;  
 }  

Agente fala pra listar objetos do tipo Programa, mas no bean o objeto é do tipo ProgramaHandler. Aí vai dar pau mesmo... o converter retorna um programa, não um ProgramaHandler, tenta alterar esse tipo pra Programa só, ve onde essa alteração vai quebrar seu código.

Não esquece de alterar o ServiçoHandler tbm </blockquote>

Deixa eu ver se entendi…
Ao invés de usar Programa no Converter, devo usar o ProgramaHandler assim?

public String getAsString(FacesContext facesContext, UIComponent component, Object object) throws IllegalArgumentException { if (object == null) { System.out.println("Valor do object no converter no 1 retorno: " + object); return null; } if (object instanceof ProgramaHandler) { ProgramaHandler o = (ProgramaHandler) object; System.out.println("Valor do o.getCod_programa no converter: " + o.getPrograma().getCod_programa()); System.out.println("Valor do object no converter no 2 retorno: " + object); return o.getPrograma().getCod_programa() != null ? "" : o .getPrograma().getCod_programa().toString(); } else { throw new IllegalArgumentException("objeto " + object + " é do tipo " + object.getClass().getName()); } }

Assim???

P

Então, veja o que é melhor, mas acho apenas alterar

private ProgramaHandler programaSelecionado;

para

private Programa programaSelecionado;

K
pelikan:
Então, veja o que é melhor, mas acho apenas alterar

private ProgramaHandler programaSelecionado;

para

private Programa programaSelecionado;

Eu tentei fazer isso:

private Programa programaSelecionado;

	public Programa getProgramaSelecionado() {
		return programaSelecionado;

	}

	public void setProgramaSelecionado(Programa programaSelecionado) {
		this.programaSelecionado = programaSelecionado;
		System.out.println("Valor do programaSelecionado -> "
				+ this.programaSelecionado);
		System.out.println("Valor do programaSelecionado.codprograma -> "
				+ programaSelecionado.getCod_programa());

	}

	private ProgramaHandler pegaProgramaHandler() {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		ELContext elContext = facesContext.getELContext();
		ELResolver resolver = facesContext.getApplication().getELResolver();
		Object p = resolver.getValue(elContext, null, "programaHandler");

		return (ProgramaHandler) p;
	}

	public List<SelectItem> getProgramaParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();

		// usaremos o id como valor e o nome como label para os SelectItem.
		ProgramaHandler handler = pegaProgramaHandler();
		for (Programa p : handler.getProgramas()) {
			// String id = Long.toString(p.getCod_programa());
			lista.add(new SelectItem(p, p.getNome()));

		}
		return lista;
	}
	public List<SelectItem> getServicoParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		ServicoHandler handler = pegaServicoHandler();
		for (Servico s : handler.getServicos()) {
			System.out.println("###########LENDO O FOR###########");
			if (programaSelecionado != null
					&& programaSelecionado.getCod_programa() == s
							.getPrograma_cod_programa()) {
				System.out.println("Valor do Serviço -> "
						+ s.getPrograma_cod_programa());
				System.out.println("Valor do Programa -> "
						+ programaSelecionado.getCod_programa());

				lista.add(new SelectItem(s, s.getNome()));
				System.out
						.println("#######LISTANDO OS SERVICOS DO PROGRAMA SELECIONADO#########");
			}

		}
		return lista;
	}

e me retornou isso:

/jsp/unidade/unidade.jsp(26,3) '#{unidadeHandler.programaSelecionado}' Error writing 'programaSelecionado' on type xxx.handler.UnidadeHandler.

Eu estou tendo dificuldades em mudar a lógica no converter...

K

E tanto faz eu usar;

private ProgramaHandler programaSelecionado;

ou

private Programa programaSelecionado;

O erro que ele mostra é o mesmo…

:frowning: :smiley:

K

eae amigo pelikan, alguma luz??

:smiley:
Abs.

P

Então kleber… a variável tem que ser do tipo programa mesmo. Tem tando código aqui que eu não sei mais qual é o atual… não tá facil hein!

K
pelikan:
Então kleber... a variável tem que ser do tipo programa mesmo. Tem tando código aqui que eu não sei mais qual é o atual... não tá facil hein!

Hehehe, realmente, eu preciso pegar o valor do programaSelecionado... o problema que ele é sempre null...

Tentei várias coisas aqui e nada... to pra ficar doido com esse negocio... Tu acha q pode ser problema no Converter ou no método :
public List<SelectItem> getServicoParaComboBox() {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		ServicoHandler handler = pegaServicoHandler();
		// programaSelecionado = getProgramaSelecionado();
		for (Servico s : handler.getServicos()) {
			// verificar o cod_programa apos abaixo
			if (programaSelecionado != null
					&& programaSelecionado.getCod_programa() == s
							.getPrograma_cod_programa()) {

				lista.add(new SelectItem(s, s.getNome()));
				
			}

		}
		return lista;

Valeu mano..

P

Não parece estar errado não, parece que tem algum lugar que estamos fazendo confusão com os tipos Programa e ProgramaHandler, tem que checar qual o tipo deve aparecer na lista, e esse tipo deve ser igual pro converter, pra variavel programaSelecionado e etc.

K

pelikan meu amigo, acho q estou quase lá...

Me lembrei que o objeto do selectonemenu tem que ser convertido antes de ser salvo, conforme está abaixo:
public String salva() {
		System.out.println("Adicionando: " + unidade.getNome());
		Session session = HibernateUtil.currentSession();
		Dao<Unidade> ueDao = new Dao<Unidade>(session, Unidade.class);
		Dao<OrgaoGestor> ogDao = new Dao<OrgaoGestor>(session,
				OrgaoGestor.class);
                Long id_orgaogestor = Long.valueOf(orgaogestorSelecionado.getValue()
				.toString());
		OrgaoGestor og = ogDao.load(id_orgaogestor);
		unidade.setOrgaogestor_cod_orgaogestor(id_orgaogestor);
                
                ueDao.merge(this.unidade);

		this.unidade = new Unidade();
		return "sucesso";
	}
Então, tentei fazer essa adaptação no meu método e ficou assim:
public List<SelectItem> getServicoParaComboBox() throws Exception {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		Session session = HibernateUtil.currentSession();
		Dao<Programa> pDao = new Dao<Programa>(session, Programa.class);
		Long id = Long.valueOf(programaSelecionado.getValue().toString());
		Programa p = pDao.load(id);
		ServicoHandler handler = pegaServicoHandler();
		for (Servico s : handler.getServicos()) {
			System.out.println("Value of p: " + p);
			// verificar o cod_programa apos abaixo
			if (p != null
					&& p.getCod_programa() == s.getPrograma_cod_programa()) {
				// // String id = Long.toString(s.getCod_servico());
				lista.add(new SelectItem(s, s.getNome()));
				System.out
						.println("#######LISTANDO OS SERVICOS DO PROGRAMA SELECIONADO#########");
			}

		}
		return lista;
	}

mas está me retornando essa exception:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: /jsp/unidade/unidade.jsp(37,4) '#{unidadeHandler.servicoParaComboBox}' Error reading 'servicoParaComboBox' on type br.gov.rr.setrabes.handler.UnidadeHandler
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

root cause

javax.servlet.ServletException: /jsp/unidade/unidade.jsp(37,4) '#{unidadeHandler.servicoParaComboBox}' Error reading 'servicoParaComboBox' on type br.gov.rr.setrabes.handler.UnidadeHandler
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
	br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

O que vc acha q pode ser?? A minha idéia está certa??

Valeu meu amigo!!!

K

Eae??

K

Pessoal, problema resolvido.

Acabei reformulando os métodos que estava utilizando e fiz um negocio mais simples e prático.

Solução completa está aqui.

http://www.guj.com.br/posts/list/15/149468.java#812134

Valeu.

P

Boa!

M

Se puder contribuir, agradeço.

http://www.guj.com.br/posts/list/0/136015.java#1056402

obrigado!

Criado 7 de julho de 2009
Ultima resposta 25 de mai. de 2010
Respostas 74
Participantes 3