我正在运行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的新手,并没有完全掌握如何将这些分开的概念。任何帮助将不胜感激。
答案 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,您还可以利用延迟加载。但那是一个故事和设计。