gpt4 book ai didi

java - JSF/Java 设计问题

转载 作者:行者123 更新时间:2023-12-02 08:25:07 24 4
gpt4 key购买 nike

我正在运行 JSF 2.0

我目前有一个名为 Contacts.java 的 Java Controller 。在里面我有一个地址列表存储为成员变量

List<Addresses> addresses;

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

我还有很多功能,可以将地址添加到列表、删除地址、更新等,这些功能都依赖于此 contactId。

我正在考虑将 Contacts.java 分成两个 Controller Contacts.java 和 Addresses.java,因为与地址相关的逻辑太多,我认为它应该在自己的类中。

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

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

这是一个糟糕的设计理念吗?我对 Java 和 OOP 非常陌生,还没有完全掌握如何将它们分开的概念。任何帮助将不胜感激。

最佳答案

一般来说,每个 View /表单使用一个 bean 是更好的选择,但这也取决于您是否使用异步请求(是否使用 ajax)。至于传递数据,有多种方法,具体取决于源、目标和/或路由。

At compile time Addresses will compile looking for the current contactId when it is populating the List addresses in the constructor. It will have not been set at this point though because the contactId is set when the user selects a contact in the application.

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

<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(您只需使用适当的 getter 和 setter 将 List<Address>List<Phone> 设为 Contact 的属性)

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,您也可以利用延迟加载。但这是故事和设计的区别。

关于java - JSF/Java 设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com