Campos dinâmicos no JSF 2.0

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

isso pode ser feito ate com JavaScript.

t+

Humm

Como ficaria o bind dos campos no ManagedBean?

Valeww

[quote=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[/quote]

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…

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

[quote=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[/quote]
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.

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.

[quote=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.

[/quote]
Sim é possível sim, JSF é 100% OO!

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.

valeww pelas respostas galera

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

Valeww

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.

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.

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.

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:

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

public Email getEmail2() {
return colecao.get(2);
}[/code]

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…

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.