我试图围绕一些基本的JSF 2概念。例如,如果我有一个托管bean,Bean1:
@ManagedBean
public class Bean1 {
private String foo;
private String bar;
}
并且foo
和bar
的值是从JSF Web表单获取的。在每次提交Web表单时,我想将Bean1
的实例存储在另一个bean的Java Collection中:
@ManagedBean
public class Bean2 {
private List<Bean1> beanList;
}
实现这一目标的正确方法是什么?感谢。
答案 0 :(得分:4)
@ManagedBean
@ViewScoped
class PeopleHolder {
private List<Person> people = new ArrayList<Person>();
// not managed at all:
private Person currentPerson;
// just the getter, no need for a setter
public Person getCurrentPerson() { return currentPerson; }
@PostConstruct
public init(){ currentPerson = new Person(); }
public void addCurrentPersonToList() {
people.add(currentPerson);
init();
}
// just for test:
public List<People> getPeople() { return people; }
}
现在是表格:
<h:form>
<h:inputText value="#{peopleHolder.currentPerson.name}" />
<h:inputText value="#{peopleHolder.currentPerson.lastName}" />
<h:commandButton action="#{peopleHolder.addCurrentPersonToList}" />
</h:form>
答案 1 :(得分:2)
将Bean2
设置为Bean1
的托管属性,以便您可以访问其beanList
属性。
@ManagedBean
public class Bean1 {
private String foo;
private String bar;
@ManagedProperty("#{bean2}")
private Bean2 bean2;
public void submit() {
bean2.getBeanList().add(this);
// ...
}
// ...
}
(请注意,这样只存储引用,而不是Bean1
状态的克隆或其他东西!)
毋庸置疑,这是一种设计气味。有可能更好的方法来实现您在提出问题时想到的具体功能要求,但没有说明任何事情。在未来尝试询问如何解决功能需求而不是如何实现解决方案(毕竟这可能不是正确的解决方案)。