我有一个JSF2应用程序,该应用程序应该显示一个页面,其中必须在列表中添加多个操作系统项。用户希望通过单个保存操作添加这些项目,设置它们的某些属性,最后将它们永久保存在一起。
该页面应处理的域对象如下所示:
public class Item {
private long id;
private String name;
private Item previous;
public Item() { }
public Item(Item previousItem) {
this.previous = previousItem;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Item getPrevious() {
return previous;
}
}
ItemBean类如下所示:
@ManagedBean
public class ItemBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<Item> items = new ArrayList<Item>();
public List<Item> getItems() {
if(items.size()==0) {
items.add(new Item()); // adding the first item
}
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
public void addItem(Item previousItem) {
Item newItem = new Item(previousItem);
items.add(newItem);
}
public void save() {
...
}
}
该视图是一个如下所示的xhtml
文件:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
<ui:composition template="/templates/layout.xhtml">
<ui:define name="content">
<h2>Items</h2>
<fieldset>
<legend>Items being added</legend>
<ui:repeat value="#{itemBean.items}" var="item">
<div>
<h:outputLabel value="Item" for="name" />
<h:inputHidden value="#{item.id}" />
<h:inputText id="name" value="#{item.name}" />
<h:commandLink action="#{itemBean.addItem(item)}">Add</h:commandLink>
</div>
</ui:repeat>
</fieldset>
<div class="options">
<h:commandButton action="#{itemBean.save}" value="Save"/>
<div class="clear border-bottom"></div>
</div>
</ui:define>
</ui:composition>
</body>
</html>
注意,为了添加新项目,必须发送当前项目以满足业务规则。
问题是我可以毫无问题地添加第二个项目,但是当我单击第二个项目旁边的“添加”链接时,页面将仅显示一个项目,就像在开始时一样。
不幸的是,即使阅读了很多文章,页面和一些书中的章节,我也看不到要使它起作用所缺少的东西。
更新1
我被问到此bean所使用的范围类型。它是默认范围(@RequestScoped
)。@SessionScoped
为了可伸缩性,我试图避免使用它,但是在这种特殊情况下,我不确定是否可以选择。有更多经验的人可以给我小费吗?
您的范围是ManagedBean
什么?
由于您没有发布任何持久性代码,因此我认为items
List仅在Bean的整个生命周期中都存在。这意味着,如果您的Bean是@ViewScoped
或@RequestScoped
,则在您提交表单后,您的项目将不复存在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句