2011-01-13 53 views
0

我正在運行JSF 2.0JSF/Java設計問題

我目前有一個名爲Contacts.java的java控制器。裏面有我有存儲作爲成員變量

List<Addresses> addresses; 

地址的列表,當我的應用程序加載它會顯示一堆的聯繫人,你可以點擊一個聯繫人爲「打開」以查看其數據。點擊聯繫人時,contactId將傳遞給基於contactId填充列表的方法。然後它會顯示數據。

我也有一堆功能,將地址添加到列表中,刪除地址,更新等都取決於此contactId。

我正在考慮將我的Contacts.java分成兩個控制器Contacts.java和Addresses.java,因爲有太多的邏輯與地址有關,我認爲它應該在它自己的類中。

我正在努力解決的問題是,如果我將處理地址的所有邏輯移動到Addresses.java中,它需要以某種方式引用編譯後選定的contactId。

在編譯時地址將編譯查找當前contactId,當它填充構造函數中的列表地址。雖然這是因爲當用戶在應用程序中選擇一個聯繫人時設置了contactId,它將不會被設置。

這是一個糟糕的設計理念嗎?我對Java和OOP非常陌生,並沒有完全理解如何將這些分開的概念。任何幫助,將不勝感激。

+0

「地址」類本身是代表一堆地址還是一個地址? – BalusC 2011-01-13 18:07:29

+0

那麼它實際上代表了所有處理地址的邏輯,所以裏面有一個成員變量列表,然後還有更新,編輯,從數據庫中刪除地址的方法,這些方法依次更新列表 newtoJSF 2011-01-13 18:14:17

回答

2

通常情況下,每個視圖/表單中的單個bean是可取的,但這也取決於您是否使用異步請求(ajax或不)。關於傳遞數據,取決於來源,目標和/或路線有幾種方式。

在編譯時地址將編譯查找當前contactId,當它填充構造函數中的列表地址。雖然這是因爲當用戶在應用程序中選擇一個聯繫人時設置了contactId,它將不會被設置。

在你的具體情況,你似乎期望構造函數/ postconstruct是加載數據的唯一方法。這不是真的。您也可以在事件(操作)方法中執行此操作。例如。

<h:dataTable value="#{contacts.list}" var="contact"> 
    <h:column> 
    #{contact.name} 
    </h:column> 
    <h:column> 
    <h:commandButton value="View info" action="#{contacts.view(contact)}"> 
    </h:column> 
</h:dataTable> 

然後在Contacts支持bean(你只需要做出List<Address>List<Phone>Contact的屬性,適當的getter和setter)

public String view(Contact contact) { 
    this.contact = contact; 
    contact.setAddresses(addressDAO.list(contact)); 
    contact.setPhones(phoneDAO.list(contact)); 
    return "view"; 
} 

然後在頁面view相關:

<h:dataTable value="#{contacts.contact.addresses}" var="address"> 
    ... 
</h:dataTable> 
<h:dataTable value="#{contacts.contact.phones}" var="phone"> 
    ... 
</h:dataTable> 

或者如果您使用JPA,您也可以利用延遲加載。但這是一個故事和設計。