Campos dinâmicos em JavaEE usando JSF 2.2

Java

08/11/2013

Bom dia, estou tentando fazer campos dinâmicos usando JSF 2.2, estou com dificuldade, tenho que fazer uma class, que recebe os dados via ArrayList<String>,e dai criar os campos em xhtml dinamicamente, alguém tem alguma dica, qualquer ajuda é bem vinda.
Dhiego Silva

Dhiego Silva

Curtidas 0

Melhor post

Josivan Laskoski

Josivan Laskoski

12/11/2013

Bom dia,

Não sei se é exatamente isso que voce quer fazer, usando dinamicamente a criação de componentes de tela de acordo com o que voce definir na sua classe.

Mas se for, crie uma classe implementando ComponentSystemEventListener após isso vai pedir para criar os metodos da sua implementação, feito isso voce pode trabalhar dessa maneira:

    @Override
    public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
        HtmlPanelGrid panel = new HtmlPanelGrid();
        HtmlForm form = (HtmlForm) event.getComponent();
    
        Funcoes func = new Funcoes();

       //...seu sql
     
      while (rs.next()) {
                panel.getChildren().add(func.CriaLabel("Usuário:", "lusuario", true, false));
                panel.getChildren().add(func.CriaLabel(rs.getString("usuario"), "usuario", false, false));

             //..os tipos de componentes que voce desejar!
      }
    
     panel.setColumns(2);
      List<UIComponent> children = form.getChildren();
     children.add(panel);



Agora a minha Classe de funções onde voce vai criar os componentes (assim foi a forma que eu estruturei)

public UIComponent CriaLabel(String value, String nome, Boolean negrito, Boolean cor) {
        FacesContext fctx = FacesContext.getCurrentInstance();
        Application app = fctx.getApplication();
        HtmlOutputLabel label = (HtmlOutputLabel) app.createComponent(HtmlOutputLabel.COMPONENT_TYPE);


        //label.setId(nome);
        label.setValue(value);
        if (negrito) {
            label.setStyle("font-weight: bold;");
        }

        if (cor) {
            label.setStyle(label.getStyle() + "color: #B22222");
        }
        return label;
    }



E a chamada no seu xhtml

     <h:form prependId="true" id="tste">
                            <f:event type="javax.faces.event.PostAddToViewEvent"
                                     listener="#{visualizarPedidoHW.processEvent}" />
                        </h:form>



Dessa forma voce cria tudo por fora do seu xhtml, faz todo seu select e cria os componentes que quiser mostrar em sua tela na sua classe.

Mas acho que seria melhor voce usar no seu xhtml a tag <ui:repeat /> dentro de um <h:form /> e controlar tudo por dentro de seu xhtml, pois vai encontrar alguns problemas como renderização de tela, ajax entre outro se usar da forma dinamica pela classe.

Tenho esses dois exemplos no meu sistema, mas estou mudando aos poucos para trabalhar tudo diretamente com xhtml.

Espero ter ajudado!
GOSTEI 1

Mais Respostas

Eduardo Pessoa

Eduardo Pessoa

08/11/2013

ja iniciou algo, tem codigo?
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

Ainda não, já criei uma List<String> que recebe 3 string, com isso tenho que criar dinamicamente 3 HtmlOutputLabel e 3 HtmlOutputText e depois grava os dados digitado em outra List para inclusão em um Banco de Dados. mais não estou conseguindo criar o HtmlOutputLabel e o HtmlOutputText. Alguém poderia post um exemplo?
GOSTEI 0
Eduardo Pessoa

Eduardo Pessoa

08/11/2013

a sua IDE ja está tudo OK?
GOSTEI 0
Luciano Martins

Luciano Martins

08/11/2013

use EL do JSF nos componentes ex: "#{meuManagedBena.aluno.nome}"
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

sim esta tudo configurado é funcionando, to com dificuldade na logica no bean.
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

Então mais eu não posso fazer o código html, tem que ser gerado na Bean... exemplo vem um dado do bd do campo nome, ele vai entra na List, ai eu tenho que gerar um label e um inputText dinamicamente na Bean é isso que eu to precisando... ta difícil de achar um exemplo.
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

Valew isso vai ajuda e muito.
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

Consegui fazer o código funciona mais estou com uma duvida, JOSIVAN LASKOSKI como faz um evento no HtmlCommandButton, já criei ele dinamicamente usando como exemplo seu código, queria fazer um evento quando ele foce apertado vai para outra dela. tem como ajudar?
GOSTEI 0
Josivan Laskoski

Josivan Laskoski

08/11/2013

Mais uma vez vou lhe alertar, não é uma boa pratica o desenvolvimento em Bean de componentes de tela, como lhe falei, estou mudando o pouco que tenho para trabalhar dentro da view.
O botão é melhor que voce crie ele dentro da view, vai evitar muitos problemas e estará fazendo uma boa pratica de desenvolvimento.

Mas segue um exemplo:

botao.addActionListener(new ActionListener() {  
    @Override public void processAction(ActionEvent e) {  
        FacesContext fctx = FacesContext.getCurrentInstance();  
        ELContext elctx = fctx.getELContext();  
        ELResolver resolver = elctx.getELResolver();  
        MyBean mb = (MyBean) resolver.getValue(elctx, null, "");  
        mb.doSomething();  
    }  
});  
GOSTEI 0
Dhiego Silva

Dhiego Silva

08/11/2013

tentei mais não esta funcionado, no lugar do Mybean eu coloquei o nome da minha bean, dai criei um função com retorno com o nome da pagina que eu quero mais não ta dando, segue o código.

#Código
# Classe Funcoes

//Gerando campo Button
	public UIComponent CriaButton(String value, String nome) {
	
	FacesContext fctx = FacesContext.getCurrentInstance();
	Application app = fctx.getApplication();
	HtmlCommandButton button = (HtmlCommandButton) app.createComponent(HtmlCommandButton.COMPONENT_TYPE);		
	
	button.setValue(value);		
		
	button.addActionListener(new ActionListener() {  
	    @Override public void processAction(ActionEvent e) {  
	        FacesContext fctx = FacesContext.getCurrentInstance();  
	        ELContext elctx = fctx.getELContext();  
	        ELResolver resolver = elctx.getELResolver();  
	        VisualizarPedidoHW mb = (VisualizarPedidoHW) resolver.getValue(elctx, null, "{VisualizarPedidoHW.processar()}");  
	        mb.processar();  
	    }  
	});  
	
	return button;

	}




# Classe VisualizarPedidoHW

	public String processar(){
		return "novo";
	}
GOSTEI 0
Matheus Santos

Matheus Santos

08/11/2013

Gostaria de saber se alguém conseguiu resolver o problema e se possível mandar o código de exemplo
GOSTEI 0
POSTAR