【发布时间】:2009-07-02 16:12:12
【问题描述】:
假设,您有一个应用程序列出了您的应用程序中的用户。理想情况下,如果您在 Java 中编写代码来实现这一点,无论您的 UI 层是什么,我都认为您会编写从数据库中检索结果集并将其映射到您的应用程序对象的代码。因此,在这种情况下,您正在查看您的 ORM / 数据层做它的事情并创建一个“用户”对象列表。
假设您的 User 对象如下所示:
public class User {
private String userName;
private int userid;
}
您现在可以在任何 UI 中使用此“用户”对象列表。 (摇摆/Webapp)。 现在,想象一个场景,你必须列出用户名和数量,比如部门或其他什么,这是 web 应用程序中一个非常具体的屏幕。所以你正在寻找这样的对象结构:
public class UserViewBean {
private String userName;
private int countDepartments;
}
最简单的方法是编写 SQL 以在一个查询中检索部门计数和用户名。如果我让你写这样一个查询,你会在哪里得到这个查询?在你的jsp中?但是,如果您在 MVC 框架中执行此操作,您会将此查询移动到数据层,获取结果集,将其转换为 UserViewBean 并将其发送到请求范围内的 jsp 吗?如果您将查询直接写入 jsps/如果您直接在 JSP 中使用连接,那不是一个坏习惯吗?
我知道,你们中的一些人可能会说,'嘿,你的对象组合错误!如果部门与用户相关联,您可能希望在您的用户对象中创建部门列表' - 是的,我同意。但是,考虑一下这种情况 - 比如说,除了这个屏幕之外,我的应用程序中的其他任何地方都不需要这个部门计数信息。你是说无论我从数据库加载我的用户对象,我都必须加载一个依赖对象列表,即使我不会使用它们?您的对象图将在所有关系完整性下获得多长时间?是的,我知道你有 ORM 正是出于这个原因,所以你可以从延迟加载和其他东西中受益,但我没有使用它的特权。
这里的底线问题是:
如果 JSP 只提供一个屏幕,你会将 sql 写入到 JSP 中吗? 或者
你会写一个贫血的物体吗 迎合你的看法,使 你的业务层返回这个 此屏幕的对象 - 只是为了制作 看起来有点 OOish? 或者
- 不管你的屏幕是什么 要求,你会组成你的 对象,例如对象图 已加载,您将获得 该列表的大小?
这里的最佳做法是什么?
【问题讨论】:
标签: java design-patterns jsp web-applications