Har*_*aji 7 jsf dynamic-forms jsf-1.2
在我的应用程序中,我需要在单击按钮时添加一行,此按钮将在所有行中.需要帮助吗?
物品等级
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; }
}
Run Code Online (Sandbox Code Playgroud)
管理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"));
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
您需要做的就是基本上只是将空对象添加到value属性后面的数据模型中h:dataTable.
但是同样的空行也需要在后续请求中保留.如果支持bean是请求作用域,则重新加载数据模型而不使用空行.当bean是会话作用域时,这一切都应该工作.
此外,您的JSF代码中存在多个错误.h:dataTable var缺少该属性,列内容需要位于a内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>
Run Code Online (Sandbox Code Playgroud)
一个会话或查看作用域 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;
}
}
Run Code Online (Sandbox Code Playgroud)
该Item课程的班级应该有一个默认的无参数的构造函数.通常这已经隐式可用,但如果您使用参数定义自己的构造函数,则它不再可用.你需要明确定义它,否则你不能再做Item item = new Item();了.
public class Item {
private String value;
public Item() {
// Keep default constructor alive.
}
public Item(String value) {
this.value = value;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果您希望将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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
您只需要将以下内容添加到<h:form>JSF页面:
<h:inputHidden binding="#{bean.count}" converter="javax.faces.Integer" />
Run Code Online (Sandbox Code Playgroud)
有关以任何方式使用数据表的更多见解,您可能会发现本文很有用:使用数据表.它还包含一个WAR文件,在请求和会话范围内都有很多示例.
| 归档时间: |
|
| 查看次数: |
22705 次 |
| 最近记录: |