【问题标题】:Using sqls in JSP - What is the best practice?在 JSP 中使用 sqls - 最佳实践是什么?
【发布时间】: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


    【解决方案1】:

    我永远不会将 SQL 放在 JSP 中。我会使用 Spring MVC 或 Struts 控制器或 servlet 来包含所有此类逻辑。它允许更好地处理错误(当查询失败时,您可以转发到错误页面)。

    如果您确实必须这样做,请使用JSTL SQL tags

    【讨论】:

    • 那么,您是否会从数据库中获取对象列表并在 java 中对其进行计数,而您可以直接从数据库中执行“select count(field)..”?或者,当它在对象中没有意义时,您会将其作为 JavaBean 中的私有成员吗?
    • 如果您只需要一个计数,那么执行“选择计数(字段)”是最好的查询......好吧,如果您不需要整个集合。
    【解决方案2】:

    就我个人而言,我采取了一种简单实用的方法。如果我正在编写仅显示用户列表及其部门计数的屏幕,那么整个代码可能是一个页面,并且我不希望在任何其他屏幕上使用此代码,我可能会扔掉它全部在 JSP 中。是的,我知道所有的 MVC 纯粹主义者都会说,“业务逻辑永远不应该出现在 JSP 中”。但除了教条规则之外,为什么不呢?在这种情况下会有什么伤害?

    如果我发现我有两个屏幕,也许一个我必须简单地显示列表,另一个我必须对列表进行一些额外的处理,那么我肯定会将通用代码提取到一个类中从两个地方调用。

    我认为标准应该是:什么产生最可维护的代码?什么是最短和最容易理解的?什么在模块之间产生最少的联系?等等。

    我坚决拒绝接受这样的原则:“在某些情况下,这种方法会导致问题,因此永远不要使用它。”如果有时它会导致问题,那么不要在它导致问题的情况下使用它。或者更糟糕的是,“有人把它写在书里,因此它是不容质疑的。”当然,有些规则在 99.99% 的时间里都是有效的,因此检查这种特殊情况是否是例外是毫无意义的。但是有很多规则在 51% 的情况下是好的,人们从“大部分”跳到“总是”。

    【讨论】:

      【解决方案3】:

      如果 JSP 只提供一个屏幕,你会在 JSP 中写入 sql 吗?

      在原型中,就像快速破解一样 - 也许。在任何其他情况下,更不用说生产环境 - 从不

      使用适当的 MVC 框架将业务逻辑与表示分离。

      【讨论】:

        【解决方案4】:

        我什至不确定应该使用 JSP,但对于琐碎的应用程序。如果您真的必须使用它们,请使用 MVC 模式或将您的逻辑封装在 JavaBean 中。

        【讨论】:

        • 您的 JavaBean 只不过是一个贫血的对象。它没有任何行为。您所做的只是将您的结果集转换为一个对象,这只是一个开销。你不这么认为吗?它可能看起来有点 OOish,但实际上并非如此。
        【解决方案5】:

        看看 JPA,它允许您进行对象操作,然后将其保存在数据库中

        【讨论】:

          【解决方案6】:

          我不会将 SQL 放在 jsp 中,因为害怕在以后的维护中忘记它。想想维护你的代码的可怜人——可怜的人 = 你在 10 个月内或每当数据库重组时——并且至少将所有 SQL 放在同一个通用区域中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-21
            • 2014-11-10
            • 2018-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-07
            • 1970-01-01
            相关资源
            最近更新 更多