2011-08-17 61 views
3

我試圖圍繞一些基本的JSF 2概念我的頭。舉例來說,如果我有一個託管bean,Bean1:如何將多個JSF 2託管bean實例添加到Java集合?

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

foobar的值從一個JSF網頁形式獲得。在每個網頁表單的提交,我想存儲的Bean1實例中其他bean的Java集合:

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

什麼是實現這一目標的正確方法是什麼?謝謝。

回答

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的狀態或東西不是一個克隆!)

不用說,這是一個設計的氣味。在提出問題的同時,您可能會有更好的方式來達到您所想的具體功能要求,但沒有說明任何內容。在未來嘗試問如何解決功能需求,而不是如何實現解決方案(畢竟這可能不是正確的解決方案)。

+0

謝謝,BalusC!我會記住你的建議,即在未來要求具體的幫助。 – holic87

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> 
+0

我覺得你對OP *真正需要的東西感到頭痛了:) – BalusC