Como adicionar dinamicamente componentes JSF
-
25-09-2019 - |
Pergunta
Posso adicionar componentes JSF dinamicamente? Eu preciso ter um formulário com um botão que deve adicionar um <h:inputText>
para o formulário. Isso é possível?
Eu sei que isso deve ser possível em JavaScript de alguma forma. Alguém sabe como fazer isso no JSF? Eu acho que o principal problema é como obtenho ou defina valores de novas entradas via #{value}
.
Solução
Use um componente de iteração como <h:dataTable>
ou <ui:repeat>
Para exibir um tamanho dinamicamente List
de entidades. Faça o feijão @ViewScoped
Para garantir que a lista seja lembrada entre os postagens na mesma visão, em vez de recriada repetidamente.
Exemplo de kickoff com <h:dataTable>
:
<h:form>
<h:dataTable value="#{bean.items}" var="item">
<h:column><h:inputText value="#{item.value}" /></h:column>
<h:column><h:commandButton value="remove" action="#{bean.remove(item)}" /></h:column>
</h:dataTable>
<h:commandButton value="add" action="#{bean.add}" />
<h:commandButton value="save" action="#{bean.save}" />
</h:form>
Bean gerenciado:
@ManagedBean
@ViewScoped
public class Bean {
private List<Item> items;
@PostConstruct
public void init() {
items = new ArrayList<Item>();
}
public void add() {
items.add(new Item());
}
public void remove(Item item) {
items.remove(item);
}
public void save() {
System.out.println("items: " + items);
}
public List<Item> getItems() {
return items;
}
}
Modelo:
public class Item {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String toString() {
return String.format("Item[value=%s]", value);
}
}
Veja também:
Outras dicas
Deve ser assim
Vincule uma etiqueta de formulário à propriedade Bean
<form binding="#{myBean.myform}">...</form>
@ManagedBean("myBean")
public class Bean{
property HtmlForm myform;
}
No evento, crie uma nova instância do componente de entrada
HtmlInputText input=new HtmlInputText();
e anexe ao seu formulário
myform.getChildren().add(input);
Usar h:dataTable
Para adicionar elementos dinamicamente ... tenha uma lista de qualquer tipo que você queira fornecer valores para o DataTable ...
Dentro h:dataTable
... você pode incluir a tag de elemento para criar dentro <h:column>
Ele será usado para gerar elementos que você deseja criar dinamicamente.