d
public class ContactController {
...
public void persist() {
/* Setup the group into contact. */
contact.setGroup(groupRepository.lookup(selectedGroupId));
/* Turn form off, turn link on. */
form.setRendered(false);
addNewCommand.setRendered(true);
/* Add a status message. */
if (contactRepository.persist(contact) == null) {
addStatusMessage("Added " + contact);
} else {
addStatusMessage("Updated " + contact);
}
}
...
public void read() {
/* Prepare selected contact. */
contact = selectedContact;
/* Turn form on and the link off. */
form.setRendered(true);
addNewCommand.setRendered(false);
/* Prepare selected group id. */
selectedGroupId = contact.getGroup().getId();
...
this.selectedTagIds = tagIds.toArray(new Long[tags.size()]);
addStatusMessage("Read " + contact);
persistCommand.setValue("Update");
}
...
注意,Contact 类添加了一个 group 属性。因此,Contact 与 Group 之间存在多对一关系。
清单 9 中的 read() 方法初始化 this.selectedTagIds,从而在视图中显示所选的列表项。
您已经看到如何用 <h:selectOne> 处理一对一关系。Contact 还与 Tag 形成多对多关系(用 Contact 的 tags 属性表示)。为了处理这个关系,要使用一个 <h:selectManyCheckbox>,见清 单 10:
清单 10. 用来处理 Contact.tags 的 selectManyCheckbox
<h:selectManyCheckbox id="tags"
value="#{contactController.selectedTagIds}">
<f:selectItems value="#{contactController.availableTags}" />
</h:selectManyCheckbox>
JSF 1.2入门,第2部分 JSF生命周期、转换、检验和阶段******(7)
时间:2011-08-09 IBM Richard Hightower
<h:selectManyCheckbox> 的主要差异是,它绑定到一个 long 数组,而不是绑定到单个 long (见清单 10)。
Java 代码与 清单 8 相似,只是现在要处理所选 ID(long)的数组,而不是处理单个 long,见清单 11:
清单 11. 后端支持 selectManyCheckbox 的 Java 代码
public class ContactController {
...
private Long[] selectedTagIds;
private TagRepository tagRepository;
...
public List<SelectItem> getAvailableTags() {
List<Tag> tags = tagRepository.list();
List<SelectItem> list = new ArrayList<SelectItem>(tags.size ());
for (Tag tag : tags) {
SelectItem selectItem = new SelectItem(tag.getId(), tag.getName());
list.add(selectItem);
}
return list;
}
...
public void persist() {
...
/* Setup the tags into contact. */
List<Tag> tags = new ArrayList<Tag>(selectedTagIds.length);
for (Long selectedTagId : selectedTagIds) {
tags.add(tagRepository.lookup(selectedTagId));
}
contact.setTags(tags);
...
}
...
public void read() {
...
/* Prepare selected tag IDs. */
List<Tag> tags = contact.getTags()
|