0

我非常喜欢将应用程序逻辑保留在 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 作为建议的答案)。

4

5 回答 5

1

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

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

于 2009-05-04T23:32:25.590 回答
1

您需要创建一个自定义 bean,它将为前端执行查询。实际上,根据您这里所说的,它可能更像是为您获取数据的几个bean。

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

于 2009-05-05T00:06:19.033 回答
1

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

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

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

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

于 2009-05-05T00:25:26.930 回答
1

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

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

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

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

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

于 2009-05-05T00:27:27.783 回答
0

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

于 2009-05-04T23:30:19.743 回答