gpt4 book ai didi

jsf - 如何在JSF中的表中动态添加一行?

转载 作者:行者123 更新时间:2023-12-04 10:58:44 25 4
gpt4 key购买 nike

在我的应用程序中,我需要单击一个按钮来添加一行,这个按钮将在所有行中。需要帮助来做到这一点?

项目类别

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 是 session 作用域时,这一切都应该起作用。

此外,您的 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>

A session 或 View 范围 bean 可以是这样的:
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 保留在 中请求范围 ,那么您需要维护新添加项目的数量,以便 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());
}
}
}

您只需将以下内容添加到 <h:form> JSF 页面:
<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />

有关以任何方式使用数据表的更多见解,您可能会发现这篇文章很有用: Using Datatables .它还包含一个 WAR 文件,其中包含请求和 session 范围内的大量示例。

关于jsf - 如何在JSF中的表中动态添加一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com