【问题标题】:JSP and MVC Best PracticesJSP 和 MVC 最佳实践
【发布时间】:2017-01-22 10:23:35
【问题描述】:

我是 JSP 编程的新手,正在为一位家庭成员编写一个 Web 应用程序。在我学习的过程中,我听到了很多关于 JSP 应该如何用于表示和 servlet 用于业务逻辑的信息。我的问题基本上是关于这能走多远以及何时使用 JSTL 是不好的做法。这是一个示例:我的应用程序有一个登录页面,并且我使用 c:if 和连接到我的 java 类的自定义函数来处理表单。这会被认为是糟糕的 MVC 实践,还是因为我只是从 EL 引用我的逻辑代码,所以这是对 JSP 的合法使用吗?

【问题讨论】:

  • JSP 是一种较旧的技术,是 1990 年代对 Microsoft Active Server Pages 的回应。更现代的方法是使用 HTML5、CSS3 和 JavaScript 查看页面;休息服务;与客户端交互的 HTTP servlet/控制器。
  • 所以你会建议不要使用它们?
  • 请不要接受这个建议。 HTML5、CSS3 和 JavaScript 都很棒,但它们对动态 Java Web 应用程序毫无帮助。这听起来就像您在构建一个 Java Web 应用程序。使用 JSP。否则你会限制你能做什么。
  • 是的,我对JSTL和EL的使用更感兴趣。我之所以选择该架构,是因为似乎很多关于 Java 的职位都提到了 JSP 作为要求,而我是新手,正在努力确定获得 Java 经验的最佳框架。也许它很旧但仍在使用?
  • 请注意,如果您使用 scriptlet 代码编写 JSP,我们会找到您。只使用 JSTL 并坚持标签。

标签: java jsp jakarta-ee model-view-controller jstl


【解决方案1】:

使用 JSP 的最佳实践是 根本不使用 JSP。我将尝试解释原因并说清楚。

首先我必须解释一些与 JSP 完全没有联系的东西,但它会帮助您了解 JSP 技术的确切问题。

在函数式编程中有一个术语 - 纯函数。这意味着它没有副作用。此外,这样的函数确实保证对于具有相同输入的每次调用,它总是返回相同的输出。 在 OOP 中,函数不是纯粹的。它可能有副作用。它使我们的生活更加复杂。但重要的是,这些副作用只能在WITHIN您的函数中发生。你可以调试它。它或多或少在您的控制之下

让我们把我们用 JSP 编写的功能想象成一个带有输入 I 和输出 O 的函数 f:

O f(I)
  1. JSP 的第一个问题是它确实有副作用,而且这种副作用不仅会发生在你的函数f 内部,而且还会从外部影响它。一个简单的例子:你使用tiles技术,你的jsp页面被用作一个tile模板中的一个组件。此模板的另一个组件使用getOutputstream() 方法并写入此输出流。但是应用程序可以在任何给定的响应上调用 getOutputStream 或 getWriter,但不允许两者都做。 JSP 引擎使用getWriter,因此不能调用getOutputStream。你进入你的 jsp 页面,它在单独时可以正常工作:

    java.lang.IllegalStateException: getOutputStream() 已经为此响应调用

getOutputStream() has already been called for this response

  1. 使用函数可以显式获取输入参数。输入总是清晰的。此外,您可以使用常量,或者,如果您的函数有副作用,请使用其他服务来获取数据进行处理。但它始终在您的职能范围内,或多或少受到控制。对于 JSP 页面,您根本没有这样的控制权。输入数据可以与不同的 servlet/web 组件放入会话中,输入数据可以通过带有大量 if 语句的 servlet 放入请求范围。您必须首先调查此 servlet 的逻辑。当您创建“Hello World!”时,额外的复杂性并不明显。程序,但是当您维护几年前编写的此类页面时,这真的会让您发疯。
  2. 我想你已经读过混合输出和逻辑不是一个好主意。 JSP 允许人们这样做。因为它“很方便”。
  3. 您无法在 jsp 页面中测试逻辑。或者这会让事情变得更加困难。

您可以说正确使用 jsp 技术和应用最佳实践可以解决大部分问题。是的。同意。但它永远无法摆脱其内部缺陷和复杂性。您总是需要检查,开发人员是否真的遵循了最佳实践?我们的时代有更好、更好的技术。

注意:我个人会使用它的唯一例外或用例:用于本地化。您没有从服务器获取所有消息。您不想让服务器一一获取本地化字符串。例如,您确实想要获得一批将在您的 Web 表单上使用的值。使用 JSP + JS,您可以非常轻松且明确地做到这一点。

【讨论】:

    【解决方案2】:

    您的问题包含很多最佳实践,这些最佳实践引发了很多意见和辩论,这在本论坛中通常是不受欢迎的。一般来说,JSP 是 MVC 中的“V”视图,应该用于呈现由“M”模型提供的数据,这将是您的 Java 代码。 “C”控制者经常分散在 M 和 V 之间(引起更多争论,抱歉)。

    您在 JSP 中添加的任何逻辑都超出了查看给定数据并决定如何呈现数据的范围,将其移向模型。您的登录页面应该只收集凭据并将它们呈现给模型,模型应该反过来响应“无效”并重新请求凭据(或完全失败),或者如果有效,则转到下一页。

    在实践中,恕我直言,除了格式化数据(创建表格条目、使用链接包装等)之外,您不应放置大量(如果有的话)操作数据的代码。您不应该(恕我直言)查询数据库、执行计算、等等,在 JSP 中 - 让模型来做。

    正如 duffymo 所说,JSP 是旧的,但它们仍然有效。我建议您也考虑 AngularJs (ng)(在阅读了 V1 v. V2 的争议之后)。

    【讨论】:

      【解决方案3】:

      JSP 是一种过时的技术,很少有软件仍在使用它。但如果你想使用它,我建议你使用Oracle Coding Standards。这个页面应该让你清楚地知道你应该做什么和不应该做什么。

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2011-05-18
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多