Campos dinâmicos no JSF 2.0

15 respostas
B

Bom dia galera

Estou com uma dúvida

Como eu posso conseguir campos dinâmicos no JSF 2.0.

No caso seria por exemplo um campo email, que eu clico em um botão e é adicionado outro campo.

Qual é a maneira mais utilizada pra se fazer isso?

Atenciosamente

15 Respostas

A

isso pode ser feito ate com JavaScript.

t+

B

Humm

Como ficaria o bind dos campos no ManagedBean?

Valeww

F

brunorota:
Bom dia galera

Estou com uma dúvida

Como eu posso conseguir campos dinâmicos no JSF 2.0.

No caso seria por exemplo um campo email, que eu clico em um botão e é adicionado outro campo.

Qual é a maneira mais utilizada pra se fazer isso?

Atenciosamente

Todos os componentes JSF tem a propriedade rendered que vc pode usar para colocar um expressão EL booleana. Com o uso de AJAX vc consegue renderizar a area encapsuladora da região desse componente, dinamicamente colocando-o na GUI. EU uso direto…

B

humm

Seria então você ter os campos fixos, porém escondidos?

E a medida que você quer adicionar vc vai mostrando eles na página?

Valew

F

brunorota:
humm

Seria então você ter os campos fixos, porém escondidos?

E a medida que você quer adicionar vc vai mostrando eles na página?

Valew


Não…
campos rendered=false não são renderizados no DOM do navegador. No caso eles não existem mesmo. Mas com o uso de AJAX, vc consegue adicionar nos campos, desde que eles estejem aninhados com áreas maiores.
Eu uso essa abordagem com sucesso.

B

Humm saquei

Porém vc consegue ter uma quantidade dinâmica? ou você define um tamanho fixo de campos. Tipo eu posso adicionar até 5 emails.

E outra dúvida, vc cria um Objeto pra cada campo no MB, ou vc consegue criar um ArrayList e fazer o bind de cada posição pra cada campo?

Obrigado pelas respostas.

F

brunorota:
Humm saquei

Porém vc consegue ter uma quantidade dinâmica? ou você define um tamanho fixo de campos. Tipo eu posso adicionar até 5 emails.

E outra dúvida, vc cria um Objeto pra cada campo no MB, ou vc consegue criar um ArrayList e fazer o bind de cada posição pra cada campo?

Obrigado pelas respostas.


Sim é possível sim, JSF é 100% OO!

P

Olá.
Oque voce pode fazer é ir adicionando em uma lista, ai vai mostrando emails nessa lista, pode ser um h:dataTable, ai voce terá só um input na sua tela.

E
B

valeww pelas respostas galera

Hj a noite assim q chegar em casa vou tentar fazer isso funfar hehehe.

Valeww

B

Humm

Consegui adicionar os campos com o rendered

A dúvida fica como bindar o ArrayList nos campos, tentei algo mais não obtive sucesso, na net tbm não achei nada do tipo

Segue abaixo o meu código

<!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:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
     	xmlns:p="http://primefaces.prime.com.tr/ui">

	<ui:composition template="/pages/mainTemplate.xhtml">
		<ui:define name="conteudo"> 
			<p:panel id="panel">
				<h:form>
					<h:panelGrid columns="2">
						<h:outputLabel value="E-mail: "/>
    					<h:inputText value="#{testeRenderedMB.emails.get(0)}" />
    			
    					<h:outputLabel value="E-mail: " rendered="#{testeRenderedMB.show}"/>
    					<h:inputText rendered="#{testeRenderedMB.show}" />
    			
    					<p:commandButton action="#{testeRenderedMB.mostrar}" value="OK" update="panel"/>
					</h:panelGrid>
				</h:form>
			</p:panel>
		</ui:define>
	</ui:composition>
</html>
@ManagedBean
@ViewScoped
public class TesteRenderedMB {

	private List<String> emails;
	
	@PostConstruct
	public void init(){
		
		emails = new ArrayList<String>();
		emails.add("email1");
		emails.add("email2");
		emails.add("email3");
	}
	
	private boolean show = false;
	
	private boolean show1 = false;

	public boolean isShow1() {
		return show1;
	}

	public void setShow1(boolean show1) {
		this.show1 = show1;
	}

	public void mostrar(){
		
		setShow(true);
	}
	
	//Getters and Setters
}

Meu código acima não funciona, alguém pode me ajudar a bindar o arrayList nos campos?

Obrigado pela atenção de todos no tópico.

Att.

F

Assim não da…da para “bindar” os objeto de collection desde que vc tenha um estrutura em coleção como, dataTable, ui:repeat etc…
Desse jeito que vc fez não faz sentido e não da certo…
Crie um objeto no managedBean e aponte o ponteiro do elemento da coleção.

B

Obrigado pelas respostas Fernando

Vamos lá

No caso ficaria assim?

<!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:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
     	xmlns:p="http://primefaces.prime.com.tr/ui">

	<ui:composition template="/pages/mainTemplate.xhtml">
		<ui:define name="conteudo"> 
			<p:panel id="panel">
				<h:form>
					<h:panelGrid columns="2">
						<h:outputLabel value="E-mail: "/>
    					<h:inputText value="#{testeRenderedMB.email1.conta)}" />
    			
    					<h:outputLabel value="E-mail: " rendered="#{testeRenderedMB.show}"/>
    					<h:inputText rendered="#{testeRenderedMB.show}"  value="#{testeRenderedMB.email2.conta}"/>
    			
    					<p:commandButton action="#{testeRenderedMB.mostrar}" value="OK" update="panel"/>
					</h:panelGrid>
				</h:form>
			</p:panel>
		</ui:define>
	</ui:composition>
</html>
@ManagedBean
@ViewScoped
public class TesteRenderedMB {

	private List<String> emails;
        private Email email1;
        private Email email2;	

	@PostConstruct
	public void init(){
		
		emails = new ArrayList<String>();
		emails.add("email1");
		emails.add("email2");
		emails.add("email3");
	}
	
	private boolean show = false;
	
	private boolean show1 = false;

	public boolean isShow1() {
		return show1;
	}

	public void setShow1(boolean show1) {
		this.show1 = show1;
	}

	public void mostrar(){
		
		setShow(true);
	}
	
	//Getters and Setters
}

E assim por diante?

Me corrija por favor se eu estiver enganado

A lógica é eu vou declarar por exemplo 5 campos emails, e vou mostrando eles conforme eu preciso.

E no ManagedBean eu preciso ter 5 objetos Email, cada um apontando para um índice do meu List de Email?

Obrigado pela atenção dada ao tópico

Att.

F
E no ManagedBean eu preciso ter 5 objetos Email, cada um apontando para um índice do meu List de Email?
Conceitualmente sim.... Mas existe meios de fazer alguma coisa para deixar mais flexivel isso.

Por exemplo:
Vc pode fazer um getEmail1() no managedBean retornando um determinado elemento da coleção tipo:

public Email getEmail1() {
    return colecao.get(1);
}

public Email getEmail2() {
    return colecao.get(2);
}

usando no input

<h:inputText value="#{testeRenderedMB.email1}" /> 
<h:inputText value="#{testeRenderedMB.email2}" />

Eu acho que da para acessar elementos da coleção na EL sim...mas teria ver a doc da EL JSF agora...to sem tempo....

De qualquer forma vc tera que fazer paginas JSF que apontem estaticamente para cada objeto....então como eu falei...não fara diferença nenhuma...

B

Opa Fernando muito bacana

Eu estava pensando em algo para fazer isso hehehe

Me ajudou d+.

Quando eu testar a noite eu fecho o tópico.

Muito obrigado.

Criado 27 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 15
Participantes 5