【问题标题】:Keeping queries out of JSP - how?将查询排除在 JSP 之外 - 如何?
【发布时间】:2009-05-04 23:24:02
【问题描述】:

我非常喜欢将应用程序逻辑保留在 servlet 中,并使 JSP 尽可能简单。原因之一是任何优秀的网页设计师都应该能够扩展他的 HTML 知识以构建一些 JSTL 标记来进行简单的迭代、访问 bean 等。我们还保留了更复杂的/ajax/js 组件一个标签库(类似于 displayTag,但用于我们自己的组件)。

大多数时候一切正常 - servlet 执行它需要的任何 SQL,并将结果存储在 bean 中以供 JSP 访问。我们遇到的问题是我们希望访问的记录是由设计指定的。

最明显的例子是主页 - 它需要引人注目且有效。它不需要像网站的其他部分一样统一。这里有很多一次性或“特殊情况”,我们想在其中查询特定的产品记录或其他什么。

设计师真正想要的是一种通过产品 id 获取产品 bean 的方法,以便他可以正常访问属性。我们显然不想查询所有产品,我也不想在演示文稿中查询。

我很确定我在这里问的是不可能的事情,我必须放弃一些东西。我的问题是什么?

编辑

我认为所有应用程序逻辑都应该在调用 JSP 之前完成是错误的吗?我的印象是最好的做法是在 servlet 中进行所有查询/计算/处理,然后将(相当)愚蠢的 bean 传递给(非常)愚蠢的 JSP。

有几种方法可以将查询的实际复杂性封装在另一个类(自定义标记或 bean)中,并且 JSP 可以调用它。这个 保持 JSP 简单(目标 1),但 JSP 仍在“触发”查询 - 相当 过程后期。

  • 我是不是完全搞错了,这样做也没关系。
  • 这是一般规则,但在这种情况下完全可以这样做。
  • 我会遇到问题吗?

编辑 - 示例

我希望这个例子会有所帮助:

主页不像类别/搜索页面那样是“模板” - 它是定制设计的,可以很好地与营销图片和几个特定的​​产品图片配合使用。然而,它确实有关于应该动态获取的这两种产品的信息(因此名称和重要的价格)与数据库保持同步。

servlet 无法知道这些产品将是哪些产品,因为如果设计人员想要更改/删除/添加更多产品,他应该只需要编辑 JSP(可能还有一个答案建议的 XML)。

【问题讨论】:

  • 您是否特别使用了任何框架?您应该提及这一点,以便更容易与您的问题联系起来。
  • 不。我正在使用 JSTL/Tomcat/Apache/JDBC。
  • 如果你已经知道productId,为什么不在逻辑命中JSP页面之前查询产品并将其放入请求对象中。
  • servlet知道产品ID,JSP的设计者知道。
  • 鉴于您的更新,我认为产品 ID 应该存储在您的设计师可以维护的非常简单的配置文件中。然后 servlet 可以读取并提供正确的 bean。

标签: sql jsp jstl


【解决方案1】:

如果我理解正确,您在 JSP 中有需要特定产品的逻辑,但此时您不想从数据库中查询,而 servlet 意识到这一点为时已晚。

(附带说明,虽然我尊重您保持关注点分离的意愿,但这是一个问题这一事实清楚地表明您的框架在表示层中有太多逻辑......但是因为我们可能无法修复那...继续前进)。

我的建议是您的设计人员创建一个配置 XML 文件,其中包含前端所需的任何特殊情况,您的 servlet 可以读取该文件,然后将哑 bean 传递回 JSP。

或者...您使用 XMLHTTPRequest 将事情分解为多个请求,并为每个单独的查询回调 servlet,然后在客户端上组装页面。

【讨论】:

  • 在您的第一句话中:是的,完全正确。你能解释一下为什么你认为我在表示层有太多逻辑吗?它是预发布的,而且很小,所以如果真的有问题,我想修复它。我不认为有,但我想确认一下。真正的问题是产品的选择(在这个孤立的案例中)是演示的一部分。我喜欢 xml 的想法——设计者可以控制它和 JSP。我会权衡它只是拥有一个自定义 bean。附言。 AJAX 会很疯狂!
  • 我正在描绘一个主页,该主页具有某种逻辑,可以选择“3 个特色产品”并显示它们。让我知道那是否可行。在这种情况下,我会在一个 servlet 中有执行此操作的逻辑,并将一个容器(我猜是 Bean,我不是 java 大佬)传递给前端。前端要做的就是将其数据绑定到它。
  • 你说得对,但设计师才是选择这些产品的人。它们不是一般意义上的“特色”,但会有特定的图像(不在数据库中)与主页的设计密切相关,所以我认为让 servlet“知道”是没有意义的" 这些产品 ID。
【解决方案2】:

听起来您需要更好地分离显示代码和数据库代码。您应该有单独的类来处理与数据库的交互,而对显示一无所知。

然后您只需创建一个方法,该方法将通过 id 查找产品并返回该 bean,以便显示可以提取所需的属性。

【讨论】:

  • 我已经有了专门处理数据库的类,然后 servlet 只需执行所需的任何“操作”并将结果转发到 JSP 以进行显示。问题是 JSP “知道”产品 ID,但我不希望它调用 DB 类,因为 JSP 在此过程中“为时已晚”。
  • 那你可以写一个控制器类,它是db类和jsp之间的抽象,jsp只会调用控制器,控制器会决定做什么来获取需要的信息,即使这意味着调用多个数据库方法。
【解决方案3】:

您需要创建一个自定义 bean,它将为前端执行查询。其实,按照你这里说的,可能更像是几颗豆子帮你获取数据。

从设计的角度来看,这样做没有问题;只是主页的特定设计比您网站的其他部分具有更多的异构要求。确保您的设计师知道他需要将他的需求很好地传达给开发团队,以便为您的主页(或其他)创建 BO,并且一切都会顺利。

【讨论】:

  • 嗯...听起来很有趣。让我看看我是否有这个权利。我将一个 bean(或几个)从 servlet 传递给 JSP,这个 bean 具有主页特定的方法(例如)获取产品 id 并返回产品 bean。这很好,但这意味着 JSP 仍在触发查询,我认为这是一个禁忌。我的印象是所有应用程序逻辑都应该在调用 JSP 时完成?
  • 我不太确定您从哪里得到这样的印象,即应用程序逻辑都需要在调用 JSP 时完成;这对我来说似乎有点奇怪。无论如何,您的 bean 是否有任何理由不能为您的主页显示内置“默认”查询参数?
  • 使用 bean 访问器(“触发”)请求数据与实现数据访问逻辑不同。 McWafflestix 已为您解答。
【解决方案4】:

您认为在呈现 JSP 之前应该完成所有应用程序逻辑并没有错。

如果需要获取更多内容以显示在您的 JSP 中,这将是对服务器的另一个请求和另一个页面循环。如果您正在寻找“交互式”加载体验,您可以使用 AJAX。

在单页生命周期中,我很难理解为什么必须从 JSP 调用数据库。该页面之前不是已经发布了所有必需的表单变量来帮助您在 Servlet/Helper 类中查找数据吗?

如果你能给出一个案例的例子,那会很有帮助。

[编辑] 看看您的示例,是的,您的设计师(或网站管理员)应该将该信息设置为配置,而不是 JSP 的一部分。或者,您可以有一个小的应用程序/管理页面来维护数据库中的信息,以便可以随时更改它。当您显示您的主页时,请阅读配置并加载相应的数据。

【讨论】:

    【解决方案5】:

    我不确定问题是什么。如果你想从你的 jsp 页面中获取 sql 语句,那么你可以将它们放在一个属性文件中,然后从 jsp 页面中读取属性文件。

    【讨论】:

    • 即使我将 SQL 本身放在属性文件中,逻辑仍然会出现在错误的位置。查询应该在调用 JSP 之前从 servlet(或帮助程序)完成。
    猜你喜欢
    • 2013-04-12
    • 1970-01-01
    • 2023-04-09
    • 2013-05-02
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多