Problemas para montar interface dinamicamente JSF + Facelets [RESOLVIDO]

29 respostas
V

Olá galera!

Meu aprendizado com JSF está parecendo uma estrada cheia de buracos: quando eu saio de um e começo a andar, eu caio em outro.

Meu problema é o seguinte: eu quero gerar a interface dinamicamente de acordo com os dados que estão vindo do banco. Se vier uma lista de Strings, eu quero dispor como um SelectOneMenu. Se vier apenas um String, quero dispor como um inputText. Sei que parece estranho, mas é este meu contexto.
O problema é que não estou conseguindo gerar esta interface dinamicamente. O meu intuito era que, quando a página estivesse sendo montada, eu pudesse chamar o método que monta a página no construtor e colocar estes dois widgets dentro de um panelGrid pré-existente na página. Já mudei o escopo do backing bean de session para request para ver se dava certo mas não deu. Quando eu estava tentando utilizar getChildren(), estava dando NullPointerException. Aqui está o código:

Página XHTML:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:t="http://myfaces.apache.org/tomahawk"
      xmlns:c="http://java.sun.com/jstl/core">
  

	
    <ui:composition template="./template2.xhtml">
 
       <h:messages globalOnly="false" />       
        <ui:define name="menuAtributo">
        	<ul>
        		<li>Cadastro de País</li>
        	</ul>
        
        </ui:define>
        
        <ui:define name="conteudoAtributo">
        
	        
        <div style="overflow:auto; height:300px;">
                
        <!--  Utilizar tabela de dados do JSF para dar aparência para a tela -->
        
        
        <!-- Coloca SCROLL aqui. -->
        <h:form id="formPais">
        
        <h:panelGrid id="painelPais" binding="#{pais.painel}" columns="2" border="1" cellspacing="0">
        </h:panelGrid>
        	
		<h:commandButton type="submit" id="botao" value="OK" actionListener="pais.montaPagina"/>
		
		</h:form>      
        
        </div>
                
        </ui:define>
        
        <ui:define name="botoes">
        <center>
        <h:form>
        	  <h:outputText value="Uepa"/>   
        	   
        </h:form>
        </center>
        </ui:define>
      
      	
    </ui:composition>

</html>

Bean:

package beans;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;

import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.model.SelectItem;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectItems;
import javax.faces.component.UIViewRoot;
import javax.faces.component.html.*;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import metadados.Metadados;
import metadados.atributos.AtributoSimplesEnumerado;
import metadados.tipos.TipoAtributo;
import idiomas.*;


public class Pais 
{
	private int codigo;
	private String nomePais;
	private HtmlPanelGrid painel;
	private InterfaceAplicacaoCadastroWeb iacw;
	
	
	public Pais()
	{
		//ActionEvent e = new ActionEvent(painel);
		//this.montaPagina(e);
	}


	private void montaPagina(ActionEvent e)
	{
			
		
		List<SelectItem> valores = new Vector<SelectItem>();
	    
	    //obtem dados do Banco
                   List<String> dados = obterDados();
	    
	    for(int i = 0; i < dados.size(); i++)
	    {
	    	if(dados.size() == 1)
	    	{
	    		//deveria acrescentar um inputField referenciando código no panelGrid
	    	}
	    	else if(dados.size() > 1)
	    	{
	    		
	    		SelectItem item;
	    		
	    		for(int k = 0; k < dados.size(); k++)
	    		{
	    		
	    			item  = new SelectItem(dados.get(k), dados.get(k));
	    			valores.add(item);    		
	    			System.out.println("Adicionou");
	    		
	    		}
	    		
	    		Application application = FacesContext.getCurrentInstance().getApplication();
	    		List children = painel.getChildren();
	    		
	    		for(int n = 0; n < dados.size(); n++)
	    		{
	    			HtmlOutputText o = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
	    			o.setValue(dados.get(n));
	    			children.add(o);
	    		}
	    		
	    		//HtmlSelectOneMenu selectOneMenu = new HtmlSelectOneMenu();
	    		//UISelectItems items = new UISelectItems();
	    		
	    		//selectOneMenu.getChildren().add(items);
	    		//this.painel.getChildren().add(selectOneMenu);
	    		
	    	}
	    	
	    }
	    
	    System.out.println("Numero atributos: " +  dados.size());
	 	
				
	}


	public int getCodigo() {
		return codigo;
	}


	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}


	public String getNomePais() {
		return nomePais;
	}


	public void setNomePais(String nomePais) {
		this.nomePais = nomePais;
	}
	
	public List<SelectItem> getListaPaises()     
    {     
        LinkedList<SelectItem> lista = new LinkedList<SelectItem>();     
             
        lista.add(new SelectItem("Brasil", "Brasil"));     
        lista.add(new SelectItem("Alemanha", "Alemanha")); 
        lista.add(new SelectItem("Argentina", "Argentina"));     
        lista.add(new SelectItem("Paraguai", "Paraguai"));     
        
             
        return lista;     
    }


	public HtmlPanelGrid getPainel() {
		return painel;
	}


	public void setPainel(HtmlPanelGrid painel) {
		this.painel = painel;
	}
	
	
	


}

O faces-config.xml está certinho! Se alguém puder dar uma força, agradeço muito!

Até mais!

29 Respostas

J

Para inicializar o seu componente tem fazer um método que inicialize o mesmo e ensima dele coloca a anotação
@Begin.
Isto é quando o tem MB for chamado apos o construtor finalizar este metodo ja é executado.

V

Olá João Rafael!

Obrigado pela disponibilidade! Mas existe alguma outra forma?! Para utilizar Annotations eu tenho de acrescentar um JAR ao meu projeto, correto?! Porque quando eu coloquei esse @Begin lá, ele pediu para criar a interface Begin e criou uma interface lá! Ou seja, não está automatizado, usando a Annotation pronta! Ou é assim mesmo?!

Porque do jeito que está, ao clicar no botão para tentar montar a interface, não funcionou ainda!

Flws!

J

Valdemar,
Desculpa lhe passei a informação errada.
Tinha que ter lhe perguntado se você esta trabalhando com o JBoss Seam.
Esta anotação só funcionar você tem que estar trabalhando com o JBoss Seam. “Desculpa por ter lhe passado a informação trocada”
Se você não estiver trabalhando com o Seam, a solução que eu vejo é que vc tem que criar a sua pagina com este componente de com a
opção rendered para nao mostrar.
A sua tela vai ser criada com todos os outros campos, entao apos uma requisição ajax vc pede para mostra este componente, então ai vc ja vai saber no seu MB se ele vai ser uma combo ou não.
Na opção se dispara o ajax vc chama no seu MB o metodo para montar o componente e dai vc dá um reRender este componente na sua JSP que esta com co rendered para nao ser mostrado alterando para ser mostrado.

Desculpa pela informação errada.

V

Hehehhee! Como ainda sou iniciante, algumas das coisas que você falou soaram-me estranhas! Tipo, para usar AJAX com JSF, eu teria de usar a4j, correto?!

Você teria um pequeno exemplo de código-fonte para me mostrar ou um bom link de onde eu possa aprender um pouco mais sobre isso?!

Desde já, obrigado!

J

Sim vc tem que usar o a4j;
Segue um exemplo basico para usar a

//Tua JSP

<ui:define name="body">
	
		<h:form id="tuaJSP">
		
		   <h:selectBooleanCheckbox value="#{tuaClasseMB.xyz}" id="nossotest" >
				<a4j:support event="onclick" actionListener="#{tuaClasseMB.verificaCampo}" 
					reRender="test" ><!--Nesta linha são os campos que serão renderizados novamento. -->
				</a4j:support>
											</h:selectBooleanCheckbox> 
		
			
			<h:outputText id="test" value="#{tuaClasseMB.campoParaMostrar}" 
			rendered="#{tuaClasseMB.mostrarCampo}"/>

		</h:form>
	</ui:define>

// Teu MenageBeam

 public class TuaClasse   
{  
    //Teus atributos do MB 
    private boolean mostrarCampo;  
	private String campoParaMostrar;
      
      
    public TuaClasse()  
    {  
        //Inicializa o que tiver que inicializar 
        this.monstrarCampo = Boolean.FALSE;  
    }  
  
  
    private void verificaCampo()  
    {  
      //Faz as suas validações para ver se vai montar uma combo ou o TextField
       this.monstrarCampo = Boolean.TRUE;          
    }  
  
  
   // Teus get e set
	public boolean isMostrarCampo() {
		return mostrarCampo;
	}
	public void setMostrarCampo(boolean mostrarCampo) {
		this.mostrarCampo = mostrarCampo;
	}
	
	public String getCampoParaMostrar() {
		return campoParaMostrar;
	}
	public void setMostrarCampo(String campoParaMostrar) {
		this.campoParaMostrar = campoParaMostrar;
	}
}

Uma sugestao para montar a tua tela use os compenentes que ja estão prontos como comboBox e outros.
segue as url para alguns sites.
http://www.horstmann.com/corejsf/jsf-tags.html
http://livedemo.exadel.com/richfaces-demo/index.jsp
este ultimo e para vc usaro richfaces.

V

Quanto ao escopo do bean, ele deveria ser request ou session? Isso influencia?!

Deu o seguinte erro:

/pais.xhtml: Error getting property 'verificaCampo' from bean of type beans.Pais
+- Stack Trace
javax.el.ELException: /pais.xhtml: Error getting property 'verificaCampo' from bean of type beans.Pais
	at com.sun.facelets.compiler.UIText.encodeBegin(UIText.java:51)
	at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:555)
	at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:562)
	at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:562)
	at com.sun.facelets.FaceletViewHandler.encodeRecursive(FaceletViewHandler.java:562)
	at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:457)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
J

tente isto:

actionListener="#{tuaClasseMB.verificaCampo()}"
V

Colocando assim:

<!-- Coloca SCROLL aqui. -->
        <h:form id="formPais">
        
        <h:commandButton type="submit" id="botao" value="OK">
        	<a4j:support event="onclick" actionListener="#{pais.verificaCampo()}" reRender="painelPais" />
        </h:commandButton>
		
        <h:panelGrid id="painelPais" binding="#{pais.painel}" columns="2" border="1" cellspacing="0" rendered="#{pais.mostra}">
        </h:panelGrid>
        	
		
		</h:form>

Dá esse erro:

javax.el.ELException: /pais.xhtml: Error Parsing: #{pais.verificaCampo()}
	at com.sun.facelets.compiler.UITextHandler.apply(UITextHandler.java:57)
	at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:164)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:164)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.tag.ui.DefineHandler.apply(DefineHandler.java:58)
	at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:128)
	at com.sun.facelets.impl.DefaultFaceletContext$1.apply(DefaultFaceletContext.java:253)
	at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:263)
	at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:63)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
	at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:136)
	at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
	at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
	at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
	at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:408)
	at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:442)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:87)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:200)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:198)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: com.sun.el.parser.ParseException: Encountered "(" at line 1, column 21.
Was expecting one of:
    "}" ...
    "." ...
    "[" ...
    ">" ...
    "gt" ...
    "<" ...
    "lt" ...
    ">=" ...
    "ge" ...
    "<=" ...
    "le" ...
    "==" ...
    "eq" ...
    "!=" ...
    "ne" ...
    "&&" ...
    "and" ...
    "||" ...
    "or" ...
    "*" ...
    "+" ...
    "-" ...
    "?" ...
    "/" ...
    "div" ...
    "%" ...
    "mod" ...
    
	at com.sun.el.parser.ELParser.generateParseException(Unknown Source)
	at com.sun.el.parser.ELParser.jj_consume_token(Unknown Source)
	at com.sun.el.parser.ELParser.DeferredExpression(Unknown Source)
	at com.sun.el.parser.ELParser.CompositeExpression(Unknown Source)
	at com.sun.el.lang.ExpressionBuilder.createNodeInternal(Unknown Source)
	at com.sun.el.lang.ExpressionBuilder.build(Unknown Source)
	at com.sun.el.lang.ExpressionBuilder.createValueExpression(Unknown Source)
	at com.sun.el.ExpressionFactoryImpl.createValueExpression(Unknown Source)
	at com.sun.facelets.el.ELText$ELTextVariable.apply(ELText.java:136)
	at com.sun.facelets.el.ELText$ELTextComposite.apply(ELText.java:117)
	at com.sun.facelets.compiler.UITextHandler.apply(UITextHandler.java:54)
	... 37 more
J

Pelo que eu verifiquei o erro é quando ele tenta montar o componente.
esta dando o erro na linha 1, coluna 21.
Este componente vc está criando programaticamente?

Pois este erro ocorre quando ele esta tentando montar o componente.

tente usar um componente pronto.

V

Na verdade eu não estou tentando “montar” um componente. Eu estou tentando utilizar as classes da API de Faces.Context, componentes derivados de UIComponent para colocar um selectOneMenu e um inputText no panelGrid existente na página xhtml mas que está vazio!
Isso estou tentando fazer programaticamente, digamos assim!

Com relação à sintaxe do a4j, no actionListener chama o método com os parênteses na frente mesmo?! Porque eu ainda não tinha visto tecnologia nenhuma associada ao JSF que fizesse isso! O padrão era apenas referenciar sem os parênteses! É assim mesmo?!

Flws!

J

Teorica mente nao precisa dos parentes mas quando acontece este erro eu coloco e para de ocorre o erro.

Valdemar sobre o UIComponent eu nao sei como ele funciona neste caso.

Mas tente usar um cara pronto, cri os doi na sua tela o combox e o textField mas os dois nao aparecendo no inicio e quando ocorre a sua ação ajax
que ele monta a sua busca para verificar se é um ou mais objetos se for um vc mostra o textField se for mais vc mostra a combo.

Pois do outro geito eu não sei.

V

Tudo bem João rafael, muito obrigado pela atenção dedicada até agora!

O problema é que tenho de gerar tais componentes “programaticamente” porque a ideia é gerar a interface mediante alguns parâmetros vindos do banco! Logo, tenho de fazer esse negócio funcionar de alguma forma! Mesmo assim, muito obrigado!

J

Mas se vim do banco uma lista vc tem que mostra combo, e se vim um tem que mostrar o textFiel correto ?

Da para vc trabalhar com os dois componentes mostrando um e escondendo o outro.

Ou me mande o seu codigo e para eu lhe dar uma solução melhor.
e qual os parametros para mostrar um ou outro componente na tela.

V

Hehehe! Tipo, eu não posso te passar o código porque ele não é meu: é da empresa, entende?!
Mas o esquema é o que eu postei lá em cima: eu tenho uma página XHTML. Os campos que vão constar dentro do formulário da página são “ditados” pelo bean respectivo. Se os dados que vem do banco são por exemplo de um atributo multivalorado, é mostrado como uma lista (combo). Se é um dado apenas, então é mostrado como um inputText.

É isso!

E

esse erro citado acima não seria devido ao seu actionListener="#{pais.verificaCampo()}" ?
acho que teria que ficar assim actionListener="#{pais.verificaCampo}"
sem o ().

V

hauhauhuahuauahu! Fiz download do AjaxForJSF, coloquei o JAR no projeto e deu isso aqui:

HTTP Status 404

Puts! Parece que estes frameworks são tudo incompatíveis! É só mudar um que estraga tudo!

Flws!

V

Fala elugo! Então eu tentei desse jeito também, mas continuou dando problema!

V

Olha que engraçado, eu pressionei o botão, gerou isso aqui:

http://localhost:8080/EstudoJSF/pais.jsf;jsessionid=FB8855EDEA475B16F5E1A2B6ED8491B9

Vejam como a tela está:


J

Este erro é de pagina não encontrada.

Na imagem aparece um erro no projeto pode ser do erro que esta acontecendo no codigo.

L

Cara, tenta isso aqui, o codigo ta meio tosco, fiz ai meio correndo, mas aqui funciona.

package br.com.sansoftware.managebean;


import java.util.List;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectOne;
import javax.faces.component.html.HtmlPanelGrid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import br.com.sansoftware.model.Employee;
import br.com.sansoftware.service.EmployeeService;


@Scope(value = "session")
@Controller("backingBean")
public class BackingBean {

	     private HtmlPanelGrid containerComponent;
            @Autowired
	     private EmployeeService employeeService;
	     
             public void addComponent() {
	        containerComponent.getChildren().clear();
	        List<Employee> nodes=employeeService.listAll();
	        if(nodes.size()>1){
	        	UISelectOne box =new UISelectOne();
	        	for (Employee node : nodes) {
	        	    UISelectItem item = new UISelectItem();
	                    item.setItemLabel(node.getNome());
	                    item.setItemValue(node.getId());
	                    box.getChildren().add(item); 
	                }
	                containerComponent.getChildren().add(box);
	        }else{
	        	UIInput input=new UIInput();
	        	input.setValue(nodes.get(0));
	        	containerComponent.getChildren().add(input);
	        }
	    }

	    public HtmlPanelGrid getContainerComponent() {
	        return containerComponent;
	    }

	    public void setContainerComponent(HtmlPanelGrid containerComponent) {
	        this.containerComponent = containerComponent;
	    }

	
}

la na sua JSP:

<h:form id="frmTeste">
      <h:panelGrid id="grid" binding="#{backingBean.containerComponent}">
      </h:panelGrid>
      <h:commandButton value="Add UI Components" action="#{backingBean.addComponent}"/>
</h:form>
V

Olá Luciano!

Eu não cheguei a testar seu código ainda, mas percebi que nos imports você está utilizando Spring, correto?! No caso, para que funcione no meu aqui, eu devo utilizar também correto?!
A verdade é que eu já ouvi falar muito sobre o Spring, mas não sei exatamente que tipo de framework ele é, se é livre ou não, quem é a entidade mantenedora dele, etc.
Tenho de saber estas coisas porque na empresa onde trabalho existe uma preocupação muito grande em termos de utilizar tecnologias proprietárias e/ou de código sob licença GNU (que implica que o sistema inteiro não poderá ser proprietário). Há outra preocupação muito grande em relação à vida útil do framework, isto é, se de uma outra para a outra a entidade mantenedora resolve parar de liberar releases e os sistemas que dependem desta tecnologia ficarem ao Deus dará.

É possível fornecer-me tais informações?!

Desde já muito obrigado!

L

Nao cara, vc nao tem que usar o spring, eu so dei o exemplo pois uso no meu projeto, so fiz o codigo para a sua resposta, vc pode usar da sua forma mesmo, eu so estou injetando minhas dependencias com o spring, mas vc pode instanciar seus objetos na mao mesmo.

L

La no meu codigo eu estou gerenciando meu backbean com o spring, sem precisar declara-lo no faces-config, @Scope(value = "session") @Controller("backingBean") , e estou instanciando meu service, @Autowired , vc pode fazer isso de qualquer forma.

V

Então, mas se eu tiver de instanciar à mão, como eu faria?! Eu faria isso no construtor ou faria em outro bean?! Como eu faria?!

L

Vc nao precisa instanciar nada, la no seu codigo vc vai preencher o combo com uma lista qualquer, no meu caso eu estou pegando um List de objetoList<Employee> nodes=employeeService.listaTudo();, vc pode carregar esta lista de qualquer forma, pode ate usar aquela sua estrutura la, oque eu passei de diferente foi como injetar os novos componentes no container, containerComponent.getChildren().add(box);

if(dados.size() == 1){  

	        UIInput input=new UIInput();
        	input.setValue(dados.get(0));
        	containerComponent.getChildren().add(input);


}else if(dados.size() > 1){

	UISelectOne box =new UISelectOne();
	for(int k = 0; k < dados.size(); k++){
		UISelectItem item = new UISelectItem();
		item.setItemLabel(dados.get(k));
		item.setItemValue(k);
		box.getChildren().add(item); 
        }  
	containerComponent.getChildren().add(box);
}
V

Então, o que eu fiz foi chamar o método que monta o painel grid no construtor. Estava tudo funcionando até que rolou um “NullPointerException” que foi acusado na chamada do método:

painel.getChildren().clear();

Aliás, este problema já havia acontecido antes. E aí?! Eu não faço ideia do que fazer agora! hauhauhauahuahua! Obrigado a todos que já tentaram me ajudar até agora!

L

Cara, chama o seu backBean assim, faz da forma que eu passei, nao adianta copiar a metade da estrutura que eu passei, cria um metodo novo la no seu BackBean da forma que eu passei, ai vc chama ele desta forma:

<h:form id="frmTeste"> <h:panelGrid id="grid" binding="#{backingBean.containerComponent}"> </h:panelGrid> <h:commandButton value="Add UI Components" action="#{backingBean.addComponent}"/> </h:form>

V

Aleluuuuuuuuuuuuuuuuia! Funcionou! hauhauhuauhauahua!

Mas eu já tinha tentado tanta coisa que agora nem sei direito o que foi exatamente que estava fazendo a coisa não funcionar antes e que a fez funcionar agora! Consegui, enfim, adicionar o SelectOneMenu dentro do grid em tempo de execução.

De uma forma ou de outra, pelo menos eu tenho algo funcionando agora. Parece que aquela onda que eu estava fazendo de usar FacesContext só é usada quando é para adicionar um novo elemento à página e não um elemento que já teu seu binding feito para a página. Sei lá. Terei de estudar mais isto.

De qualquer forma, eu fico muito feliz pela ajuda.

Chamar no construtor não é uma boa porque aparentemente o painel ainda não tinha filho nenhum. Ao chamar através do botão mesmo, a coisa começou a funcionar. O restante são detalhes que vou arrumando. Eu não sei como colocar resolvido nisso aqui, alguém sabe?!

Valeu galera!

Até mais!

L

Clica la em editar, vai no titulo da msg e altera–>>>[RESOLVIDO]

Criado 28 de maio de 2009
Ultima resposta 30 de mai. de 2009
Respostas 29
Participantes 4