【问题标题】:How to add multiple instances of JSF 2 managed beans to Java Collection?如何将 JSF 2 托管 bean 的多个实例添加到 Java 集合?
【发布时间】:2011-10-29 03:30:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: jsf jsf-2 managed-bean


    【解决方案1】:

    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>
    

    【讨论】:

    • 我认为你对 OP 真正需要什么一针见血 :)
    【解决方案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 状态的克隆或其他东西!)

    不用说,这是一种设计气味。可能有更好的方法来实现您在提出问题时已经想到但没有说明任何内容的具体功能要求。以后尝试问如何解决功能需求,而不是如何实现解决方案(这可能不是正确的解决方案)。

    【讨论】:

    • 谢谢,BalusC!我会记住您的建议,以便将来在需求方面寻求具体帮助。
    猜你喜欢
    • 2013-09-06
    • 1970-01-01
    • 2015-05-06
    • 2016-07-09
    • 2014-07-01
    • 1970-01-01
    • 2013-09-10
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多