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!
