JSF / Java设计问题

时间:2011-01-13 18:00:56

标签: java jsf jsf-2

我正在运行JSF 2.0

我目前有一个叫做Contacts.java的java控制器。在那里,我有一个存储为成员变量的地址列表

List<Addresses> addresses;

当我的应用程序加载时,它会显示一堆联系人,您可以点击联系人“打开它”查看其数据。单击联系人时,contactId将传递给基于contactId填充List的方法。然后它会显示数据。

我还有一堆功能,可以在列表中添加地址,删除地址,更新等等,这些功能都依赖于此contactId。

我正在考虑将我的Contacts.java分成两个控制器Contacts.java和Addresses.java,因为我认为它应该在自己的类中的地址有很多逻辑。

我正在努力解决的问题是,如果我将处理Addresses的所有逻辑移动到Addresses.java中,它将需要以某种方式引用在编译时选择的contactId。

在编译时,地址将编译,在构造函数中填充List地址时查找当前的contactId。此时尚未设置,因为在用户选择应用程序中的联系人时设置了contactId。

这是一个糟糕的设计理念吗?我是Java和OOP的新手,并没有完全掌握如何将这些分开的概念。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

通常,每个视图/表单最好使用一个bean,但这也取决于您是否使用异步请求(ajax与否)。至于传递数据,取决于源,目标和/或路线有几种方式。

  

在编译时,地址将在构造函数中填充List地址时编译查找当前的contactId。此时尚未设置,因为在用户选择应用程序中的联系人时设置了contactId。

在您的特定情况下,您似乎期望构造函数/ postconstruct是加载数据的唯一方法。这不是真的。您也可以在事件(动作)方法中执行此操作。 E.g。

<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,您还可以利用延迟加载。但那是一个故事和设计。