题
在我的应用程序需要在一个按钮的点击添加行,这个按钮会在所有行。需要帮助做到这一点?
<强>物品类强>
public class Item {
public Item()
{
}
private String value;
public Item(String value) { this.value = value; }
public void setValue(String value) { this.value = value; }
public String getValue() { return value; }
}
管理Bean类强>
public class MyMB
{
private List<Item> list;
public void addItem() { // JSF action method
list.add(new Item("Default"));
Iterator<Item> iterator = list.iterator();
while(iterator.hasNext())
{
Item item = (Item)iterator.next();
System.out.println(item.getValue());
}
System.out.println();
}
/**
* @return the list
*/
public List<Item> getList() {
if(list==null)
{
loadList();
}
return list;
}
private void loadList() {
list = new ArrayList<Item>();
list.add(new Item("Data"));
}
}
<强> JSF代码强>
<h:form>
<rich:dataTable value="#{myMB.list}" var="item" id="tabel">
<h:column><h:inputText value="#{item.value}" /></h:column>
<h:column><a4j:commandButton value="Add" actionListener="#{myMB.addItem}" reRender="tabel"/></h:column>
解决方案
所有你需要做的基本上是确实只是添加一个空的对象value
的h:dataTable
属性背后的数据模型。
但是,同样的空行需要在后续请求被保留为好。如果支持bean的请求范围,那么数据模型得到重新加载没有空行。这当bean是会话范围都应该工作。
另外还有在JSF代码的几个误区。所述h:dataTable
var
属性丢失和列含量需要为一个h:column
内部。
<h:form>
<h:dataTable value="#{bean.list}" var="item">
<h:column><h:inputText value="#{item.value}" /></h:column>
</h:dataTable>
<h:commandButton value="Add" action="#{bean.add}"/>
</h:form>
一个的会话或视图作用域强>豆可以是这样的:
public class Bean {
private List<Item> list;
public Bean() {
list = new ArrayList<Item>();
}
public void add() {
list.add(new Item());
}
public List<Item> getList() {
return list;
}
}
在Item
类当然应该具有默认的无参数构造。通常情况下,这已经是默认可用,但如果你用的参数定义自己的构造函数,那么就不再可用。你需要明确定义它,否则你不能做Item item = new Item();
了。
public class Item {
private String value;
public Item() {
// Keep default constructor alive.
}
public Item(String value) {
this.value = value;
}
// ...
}
如果你喜欢保持在豆在请求范围,然后你需要保持新增项目的数量,从而使bean可以保护负载相同的金额。
public class Bean {
private List<Item> list;
private HtmlInputHidden count = new HtmlInputHidden();
public Bean() {
count.setValue(0);
}
public void add() {
list.add(new Item());
}
public List<Item> getList() {
if (list == null) loadList();
return list;
}
public HtmlInputHidden getCount() {
return count;
}
public void setCount(HtmlInputHidden count) {
this.count = count;
}
private void loadList() {
list = new ArrayList<Item>();
// Preserve list with newly added items.
for (int i = 0; i < (Integer) count.getValue(); i++) {
list.add(new Item());
}
}
}
您只需要以下添加到JSF页面的<h:form>
:
<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />
有关以任何方式使用数据表更多的见解你会发现这篇文章有用:使用数据表的。它也包含与很多的请求和会话范围实例WAR文件。
其他提示
以该表作为一个示例:
<h:datatable value="#{myBean.list}" ...>
...
<h:column>
<h:commandButton value="Add a row" action="#{myBean.addRow}"/>
</h:column>
</h:datatable>
方法的 myBean.addRow 的只会在你的列表中添加了新的元素:
public class MyBean {
private List<SomeClass> list;
...
public List<SomeClass> getList() {
return list;
}
public void addRow() {
list.add(new SomeClass());
}
}
当你点击按钮,该方法的 addRow 的将在列表中添加新元素的。页面将刷新,并用一个新的行显示表
编辑:
关于你的帖子版,三件事情:
点1:的你能请附上错误的堆栈跟踪
点2:你的方法addRow返回String
其对于导航使用JSF的ID。作为该动作不涉及任何导航(即,用户停留在同一页上),简单地返回null
或""
:
public String addRow() {
list.add(new Item("new data"));
return null;
}
点3:我建议你的类Item
提供一个空的构造(除了当前的构造的):
public Item() {
}