JSP和MVC最佳实践

时间:2016-09-14 14:43:37

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

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

3 个答案:

答案 0 :(得分:5)

你的问题包含许多最佳实践,这些实践引发了很多观点和争论,这在这个论坛中通常是不受欢迎的。通常,JSP是MVC中的“V”,应该用于呈现由“M”odel提供的数据,这将是您的Java代码。 “C”ontroller经常分散在M和V之间(邀请更多辩论,抱歉)。

您在JSP中放置的任何逻辑除了查看给定的数据并决定如何呈现它之外,还将其移向模型。您的登录页面应该只收集凭据并将它们呈现给模型,模型应该响应“无效”并重新请求凭证(或完全失败),或者如果有效,则转到下一页。

在实践中,恕我直言,你不应该放置很多(如果有的话)操作数据的代码,除了格式化它 - 创建表条目,用链接包装等等。你不应该(恕我直言)查询数据库,执行计算,等等,在JSP中 - 让模型做到这一点。

正如duffymo所说,JSP已经过时了,但它们仍然有效。我建议您也考虑AngularJs(ng)(在阅读了关于V1诉V2的争议之后)。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

JSP的最佳实践 - 根本不使用JSP 。我会试着解释原因并明确。

首先,我必须解释一些与JSP没有任何联系的东西,但它将帮助您理解JSP技术的确切问题。

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

让我们假设我们用JSP编写的函数作为函数f,输入I和输出O:

O f(I)
  1. JSP的第一个问题是它有副​​作用,这样的副作用不仅可以在你的函数f内发生,而且还可以从外部影响它。一个简单的例子:您使用tiles技术,您的jsp页面将用作切片模板中的组件。此模板的另一个组件使用getOutputstream()方法并写入此输出流。但是应用程序可以在任何给定的响应上调用getOutputStream或getWriter,不允许同时执行这两个操作。 JSP引擎使用getWriter,因此您无法调用getOutputStream。并且你进入你的jsp页面,只有它一个人工作正常:

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

  2. getOutputStream() has already been called for this response

    1. 使用函数可以获得显式输入参数。输入始终清晰。此外,您可以使用常量,或者,如果您的函数有副作用,请使用其他服务来获取要处理的数据。但它总是在你的功能中,或多或少地受到控制。对于JSP页面,您根本没有这样的控制。输入数据可以与不同的servlet / web组件进行会话,输入数据可以通过servlet与很多if语句一起放入请求范围。您必须首先调查此servlet的逻辑。当你创建“Hello World!”程序时,这种额外的复杂性并不明显,但是当你维护几年前编写的这些页面时,这真的会让你发疯。
    2. 我想你已经读过混合输出和逻辑并不是一个好主意。 JSP允许人们这样做。因为它“非常方便”。
    3. 您无法在jsp页面中测试逻辑。或者它使它变得更加困难。
    4. 您可以说正确使用jsp技术并应用最佳实践可以解决大多数问题。是。同意。但它永远不会摆脱其内部缺点和复杂性。你总是要检查,真的开发人员是否遵循了最佳实践?我们的日子里有更好,更好的技术。

      注意:唯一的例外或用例,当我亲自使用它时:用于本地化。您没有从服务器获取所有消息。您不希望要求服务器逐个获取本地化字符串。例如,您确实希望获得一批将在Web表单上使用的值。使用JSP + JS,您可以非常轻松地进行表达。