我能动态地添加JSF组件吗?我需要一个表单和一个按钮,点击按钮应该可以在表单中添加一个<h:inputText>
。这个可行吗?
我知道这应该在JavaScript中有一些解决方法。有人知道如何在JSF中实现吗?我认为主要问题是如何通过#{value}
获取或设置新输入的值。
我能动态地添加JSF组件吗?我需要一个表单和一个按钮,点击按钮应该可以在表单中添加一个<h:inputText>
。这个可行吗?
我知道这应该在JavaScript中有一些解决方法。有人知道如何在JSF中实现吗?我认为主要问题是如何通过#{value}
获取或设置新输入的值。
使用迭代组件,如<h:dataTable>
或<ui:repeat>
来显示一个动态大小的实体List
。将bean设置为@ViewScoped
以确保在同一个视图的postback中记住列表,而不是反复创建。
使用<h:dataTable>
进行示例(当使用<ui:repeat>
时,只需将<h:dataTable>
替换为<ui:repeat>
,将<h:column>
替换为例如<li>
或<div>
):
<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:
@Named
@ViewScoped
public class Bean {
private List<Item> items;
@PostConstruct
public void init() {
items = new ArrayList<>();
}
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;
}
}
模型:
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);
}
}
应该是这样的
将表单标签绑定到Bean属性
<form binding="#{myBean.myform}">...</form>
@ManagedBean("myBean")
public class Bean{
property HtmlForm myform;
}
HtmlInputText input=new HtmlInputText();
并附加到您的表单中
myform.getChildren().add(input);
FacesContext.getCurrentInstance().getApplication().createComponent(HtmlInputText.COMPONENT_TYPE);
- dforceh:dataTable
动态添加元素... 拥有任何类型的列表,您可以为 dataTable 提供值...h:dataTable
中... 您可以包含元素标记以在 <h:column>
内创建。
new HtmlInputText()
这样通过编程方式创建组件,但这只会导致托管的 bean 中出现难以理解且不易维护的代码。 - BalusC