Form Dinamico em JSF

11 respostas
M

Estou com uma dúvida relacionado a JSF e não tenho nem idéia de como resolver baseado no pouco conhecimento que tenho com JSF.
Eu preciso criar um form dinamico, ou seja, antes de abrir a tela, ele ira ler um banco de dados que terá o nome do campo e se o campo é texto, checkbox ou radiobutton e irá criar o formulário.
Isso é possível fazer no JSF, já que eu preciso criar um mapeamento desses campos na minha classe java?

11 Respostas

G

cara da pra vc usar o rendered=“true ou false”, para saber se a tag vai ou nao ser usada em determinada tela.

M

E ai gustavorozolin, beleza?
Acho que me expressei mau e você não entendeu. O formulário será montado dinamicamente ou seja eu não terei nenhum componente na tela, eles serão criados dinamicamente conforme está no banco de dados. Dessa forma o usuário poderá no futuro adicionar ou remover os campos desse formulário e a tela será criada automaticamente. Quando digo campos, entenda como campos text, radio buttons, checkbox, etc.

G

MauNunes:
E ai gustavorozolin, beleza?
Acho que me expressei mau e você não entendeu. O formulário será montado dinamicamente ou seja eu não terei nenhum componente na tela, eles serão criados dinamicamente conforme está no banco de dados. Dessa forma o usuário poderá no futuro adicionar ou remover os campos desse formulário e a tela será criada automaticamente. Quando digo campos, entenda como campos text, radio buttons, checkbox, etc.

hmm entendi :S ±
mas blz se eu lembrar de algo q possa te ajudar eu enviu aqui
Abraço

L

Cara, tenta assim…

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>
M

E ai lucianotome, beleza?
Deixa eu ver se eu entendi. Quando eu clicar no botão “Add UI Components”, ele irá rederizar o componentes criados atraves pelo método addComponent, certo? Agora eu não entendi uma coisa. Como eu irei mapear esses campos criados dinamicamente com meu Backing bean, entende? Ou seja no meu backing bean eu não terei que ter metodos getters e setter associados ao meu jsp, para que eu possa recuperar o valor desses campos?

T

e ai Nunão, beleza? ja te falei, volta a trabalhar aqui que eu te ensino JSF… rsrs

quanto à sua duvida, nao da para usar velocity?
http://velocity.apache.org/

J

lucianotome:
Cara, tenta assim…

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;

</blockquote>

lucianotome, apesar de muito tempo depois de ter postado essa resposta, gostaria de saber se tens que ter alguma biblioteca em especifico para funcionar esses imports, pois a grande maioria nao está funcionando.
Estou tentando fazr um exemplo de formulario dinamico tbm, e a unica coisa que achei interessante foi esse teu post, e gostaria de tentar fazer rodar para ver como que funciona realmente.

se puderes me passar algum exemplo mais atualizado, ou alguma outra dica.
Estou usando Eclipse Helios, TomCast 7 e banco de dados postgres.

Grato

M

Opa Josivanl;
Esses imports org.springframework não são obrigatorios. Eles apenas colocou devido a aplicação utilizando o Spring. Mas para fazer o formulario dinâmico basta adicionar as libs do JSF.

J

Bom dia MauNunes!
então cara, eu estou tentando fazer uma coisa que nunca fiz e confesso que estou bem perdido…pela falta de exemplos praticos e bem explicados.

o que pretendo fazer, é basicamente o teu problema acima, que é fazer com que a tela seja criada conforme os campos postos em uma classe decalarados como:

private Integer codigo;
private String descricao;
....

ou que eu consiga fazer isso pegando de um banco de dados. como já falei estou usando Eclipse Helios, TomCast 7 e banco de dados postgres.

se tens algum exemplo, ou algumas dicas que possam me ajudar, lembrand que nunca fiz nada parecido, somente criei as telas setando a classe e seu metado, mas campo a campo, nao dinamicamente.

e sobre as libs, veja se sao essas:


jsf-api.jar
jsf-impl.jar
jstl-api-1.2.jar
jstl-impl-1.2.jar

abraço!

M

Fala josivanl;
Olha o exemplo que o lucianotome já é suficiente. O que você precisa entender é a API do JSF, que ao meu ver não é muito complicada.
Eu posso tentar fazer um exemplo para você quando chegar em casa. Mas você tentou fazer alguma coisa, deu algum erro.
Sobre as libs são essas, mas mesmo assim preciso verificar.

J

MauNunes:
Fala josivanl;
Olha o exemplo que o lucianotome já é suficiente. O que você precisa entender é a API do JSF, que ao meu ver não é muito complicada.
Eu posso tentar fazer um exemplo para você quando chegar em casa. Mas você tentou fazer alguma coisa, deu algum erro.
Sobre as libs são essas, mas mesmo assim preciso verificar.

Entao MauNunes, olha só, eu tentei fazer rodar esse exemplo acima, mas impossivel funcionar, nao sei o que estou fazendo de errado, mas penso eu que se eu adiconar as libs, teria que funcionar certo.
vou te passar quais as linhas que estao com erro

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;
[b]@Scope(value[/b] = "session")  
[b]@Controller[/b]("backingBean")
@Autowired  
private [b]EmployeeService[/b] employeeService;
List<[b]Employee[/b]> nodes=[b]employeeService[/b].listAll();
for ([b]Employee[/b] node : nodes) {

nessas linhas que te passei sao onde acontecem os erros, nos imports, se eu der o ctrl+shift+O, ele elimina automatico esses imports, mas o resto eu nao sei pq está dando fica com erro, como se nao entende as declaraçoes. Onde está em negrito sao os erros.

cara, se puder me dar uma ajuda, to sendo pressionado pra desenvolver algo, mas to perdido, nao sei por onde começar.
Abraço!

Criado 11 de fevereiro de 2010
Ultima resposta 13 de ago. de 2010
Respostas 11
Participantes 5