如何将JSF 2托管bean的多个实例添加到Java Collection



我正在努力理解一些基本的JSF 2概念。例如,如果我有一个托管bean, Bean1:

@ManagedBean
public class Bean1 {
    private String foo;
    private String bar;
}

foobar的值是从JSF web表单中获得的。在每次提交的web表单,我想在另一个bean的Java集合中存储Bean1的实例:

@ManagedBean
public class Bean2 {
    private List<Bean1> beanList;
}

实现这一目标的正确方法是什么?谢谢。

BalusC 100%正确,但(正如他警告的那样)他的答案将毫无用处。这里重要的一点是,您根本不需要也不希望管理第二个bean。它是你的模型,而不是你的GUI。您可能想要这样的内容:

@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>

使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状态的克隆或其他东西!)

不用说,这是一种设计的味道。可能有更好的方法来实现具体的功能需求,当你问这个问题的时候,你已经想到了,但没有告诉任何事情。在将来,试着问如何解决功能需求,而不是如何实现解决方案(这可能终究不是正确的解决方案)。

相关内容

  • 没有找到相关文章

最新更新