Olá Pessoal,
Estou com o seguinte problema:
[list]Tenho uma interface HTML onde o usuário pode adicionar um número infinito de caixas de texto, desejo que esses valores sejam submetidos a um backbean, mais especificamente a um atributo do tipo ArrayList.[/list]
[list]As caixas de texto são adicionadas através de código Javascript (jQuery). Como eu posso fazer isso? Ou seja, enviar N valores para um único atributo ArrayList?[/list]
Obrigado pela ajuda! Até mais.
Tentou mapear todos para o atributo no backing bean do arrayList ?
Obrigado pela ajuda!
Eu pensei nisso. Mas não há como fazer no meu caso (nem sei se daria certo).
Veja, o formulário se inicia com uma única caixa de texto e o usuário adicionará mais caixas através de um botão.
Sendo assim, toda a configuração das novas caixas será feita através de javascript. O que fará com que a configuração do atributo value não seja feito com código Java. Dessa forma, colocando o valor ${meuBean.atributo} no input não será feito o mapeamento, mas sim será exibido como texto para o usuário.
Porque você não coloca o input como o do jsf ?
O que acontece ?
Pode tentar colocar no name também o seu atributo, apesar de nunca ter tentado.
Além disso pode tentar colocar só o nome, sem o ${meuBean.atributo}, e deixar somente name=“meuBean.atributo” ou value=“meuBean.atributo”
Não sei se te ajuda, mas segue um exemplo
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.el.ValueExpression;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
@ManagedBean
@ViewScoped
public class Binding implements Serializable{
private List<String> arr = new ArrayList<String>();
private HtmlPanelGrid htmlPanelGrid = new HtmlPanelGrid();
public List<String> getArr() {
return arr;
}
public void setArr(List<String> arr) {
this.arr = arr;
}
public HtmlPanelGrid getHtmlPanelGrid() {
return htmlPanelGrid;
}
public void setHtmlPanelGrid(HtmlPanelGrid htmlPanelGrid) {
this.htmlPanelGrid = htmlPanelGrid;
}
public void adiciona() {
HtmlInputText htmlInputText = new HtmlInputText();
htmlInputText.setValueExpression("value", createValueExpression("#{binding.arr[" + (arr.size()) + "]}", String.class));
arr.add("");
this.getHtmlPanelGrid().getChildren().add(htmlInputText);
}
public void imprime() {
for (String string : arr) {
System.out.println(string);
}
}
public ValueExpression createValueExpression(String elExpression, Class<?> elClass) {
return FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), elExpression, elClass);
}
}
<?xml version='1.0' encoding='UTF-8' ?>
<!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">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:commandButton value="Adicionar" actionListener="#{binding.adiciona()}" >
<f:ajax render="htmlPanelGrid" />
</h:commandButton>
<h:panelGrid binding="#{binding.htmlPanelGrid}" id="htmlPanelGrid"/>
<h:commandButton actionListener="#{binding.imprime()}" value="Imprime"/>
</h:form>
</h:body>
</html>
Era isso o que eu precisava Amauri!
Me ajudou demais! Obrigado!
Fico Muito feliz, você foi a primeira pessoa que eu ajudei aqui, coloca resolvido no post.
Amauri,
Você sabe como eu posso fazer os valores das caixas de texto quando eu faço o render?
Tentei ver se havia o envio dos dados para o array na hora de adicionar mais caixas de texto, mas os dados digitados não foram nem para o ArrayList e nem para os componentes Html do HtmlPanelGrid.
Se tiver alguma ideia agradeceria!
Consegui resolver!
Apaneas coloquei o h:commandButton e o h:panelGrid e adicionei o atributo execute="@form " para ele enviar os dados do formulário.
O código segue abaixo:
<h:form>
<h:panelGrid binding="#{requestView.htmlPanelGrid}" id="destinations"/>
<div>
<h:commandButton
actionListener="#{requestView.addInputText()}"
class="button" id="add-destination"
value="Adicionar Destino">
<f:ajax render="destinations" execute="@form "/>
</h:commandButton>
</div>
</h:form>
<h:form>
Foi rápido nem deu tempo de ler o problema.
Fexx
Dezembro 14, 2012, 1:07pm
#11
Era isso que eu realmente queria, tentei e pesquisei de varias maneiras, ate consegui algo que me foi util.
Obrigado AmauriSpPoa.
Abraços.
Fica com DEUS.
Fexx
Dezembro 20, 2012, 12:06pm
#13
AmauriSpPoa
Quando crio um novo campo ele zera os valores dos campos preenchidos
Você sabe como fazer isso sem que ele perca os valores do field preenchidos?
Obrigado.
Abraços.
Fica com DEUS.
Cara se você fez como o exemplo não deveria zerar, mas posta o código ai e agente da uma olhada.
Atualizando o Exemplo para a utilização de uma lista de objetos ao invés de uma lista de String’s.
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.el.ValueExpression;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlPanelGrid;
import javax.faces.context.FacesContext;
@ViewScoped
@Named
public class Binding implements Serializable {
private List<MinhaClasse> arr = new ArrayList();
private HtmlPanelGrid htmlPanelGrid;
public List<MinhaClasse> getArr() {
return arr;
}
public void setArr(List<MinhaClasse> arr) {
this.arr = arr;
}
public HtmlPanelGrid getHtmlPanelGrid() {
if (htmlPanelGrid == null) {
htmlPanelGrid = new HtmlPanelGrid();
}
return htmlPanelGrid;
}
public void setHtmlPanelGrid(HtmlPanelGrid htmlPanelGrid) {
this.htmlPanelGrid = htmlPanelGrid;
}
public void adiciona() {
HtmlPanelGrid campos = new HtmlPanelGrid();
campos.setColumns(4);
HtmlInputText campo1 = new HtmlInputText();
campo1.setValueExpression("value", createValueExpression("#{binding.arr[" + (arr.size()) + "].campo1}", String.class));
campos.getChildren().add(campo1);
HtmlInputText campo2 = new HtmlInputText();
campo2.setValueExpression("value", createValueExpression("#{binding.arr[" + (arr.size()) + "].campo2}", String.class));
campos.getChildren().add(campo2);
HtmlInputText campo3 = new HtmlInputText();
campo3.setValueExpression("value", createValueExpression("#{binding.arr[" + (arr.size()) + "].campo3}", String.class));
campos.getChildren().add(campo3);
HtmlInputText campo4 = new HtmlInputText();
campo4.setValueExpression("value", createValueExpression("#{binding.arr[" + (arr.size()) + "].campo4}", String.class));
campos.getChildren().add(campo4);
arr.add(new MinhaClasse());
this.getHtmlPanelGrid().getChildren().add(campos);
}
public void imprime() {
for (MinhaClasse minhaClasse : arr) {
System.out.println(minhaClasse);
}
}
public ValueExpression createValueExpression(String elExpression, Class<?> elClass) {
return FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), elExpression, elClass);
}
}
public class MinhaClasse {
private String campo1;
private String campo2;
private String campo3;
private String campo4;
public String getCampo1() {
return campo1;
}
public void setCampo1(String campo1) {
this.campo1 = campo1;
}
public String getCampo2() {
return campo2;
}
public void setCampo2(String campo2) {
this.campo2 = campo2;
}
public String getCampo3() {
return campo3;
}
public void setCampo3(String campo3) {
this.campo3 = campo3;
}
public String getCampo4() {
return campo4;
}
public void setCampo4(String campo4) {
this.campo4 = campo4;
}
@Override
public String toString() {
return "MinhaClasse{" + "campo1=" + campo1 + ", campo2=" + campo2 + ", campo3=" + campo3 + ", campo4=" + campo4 + '}';
}
}
[code]<?xml version=‘1.0’ encoding=‘UTF-8’ ?>
<!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 ”>
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:commandButton value=“Adicionar” actionListener="#{binding.adiciona()}" >
<f:ajax render=“htmlPanelGrid” execute=“htmlPanelGrid” />
</h:commandButton>
<h:panelGrid binding="#{binding.htmlPanelGrid}" id=“htmlPanelGrid”/>
<h:commandButton actionListener="#{binding.imprime()}" value="Imprime"/>
</h:form>
</h:body>
</html> [/code]