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

时间:2011-08-17 17:32:19

标签: jsf jsf-2 managed-bean

我试图围绕一些基本的JSF 2概念。例如,如果我有一个托管bean,Bean1:

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

并且foobar的值是从JSF Web表单获取的。在每次提交Web表单时,我想将Bean1的实例存储在另一个bean的Java Collection中:

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

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

2 个答案:

答案 0 :(得分:4)

BalusC百分之百正确,但(正如他警告的那样)他的回答将毫无用处。这里重要的一点是,您根本不需要也不需要管理第二个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>

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

毋庸置疑,这是一种设计气味。有可能更好的方法来实现您在提出问题时想到的具体功能要求,但没有说明任何事情。在未来尝试询问如何解决功能需求而不是如何实现解决方案(毕竟这可能不是正确的解决方案)。