JSP 和 MVC 最佳实践
JSP and MVC Best Practices
我是 JSP 编程新手,正在为家庭成员编写网络应用程序。在我学习的过程中,我听到很多关于 JSP 应该如何用于表示以及 servlet 用于业务逻辑的说法。我的问题基本上是关于这能走多远以及我何时使用 JSTL 是不好的做法。这是一个示例:我的应用程序有一个登录页面,我正在使用 c:if 的自定义函数连接到我的 java 类 来处理表单。这会被认为是糟糕的 MVC 实践吗,或者,因为我只是从 EL 引用我的逻辑代码,这是对 JSP 的合法使用吗?
JSP 是一种过时的技术,现在很少有软件还在使用它。但是如果你想使用它,我建议你使用 Oracle Coding Standards 。此页面应该让您清楚地了解应该和不应该使用它做什么。
你的问题包含很多最佳实践,这会引起很多意见和争论,而这在本论坛中通常是不受欢迎的。通常,JSP 是 MVC 中的 "V" 视图,应该用于呈现 "M" 模型提供的数据,这将是您的 Java 代码。 "C"控制者经常分散在 M 和 V 之间(引起更多争论,抱歉)。
您在 JSP 中放置的任何逻辑,除了查看给您的数据并决定如何呈现数据之外,都会将其移向模型。您的登录页面应该只收集凭据并将它们呈现给模型,而模型又应该响应 "Invalid" 并重新请求凭据(或完全失败),或者如果有效,则转到下一页。
实际上,恕我直言,您不应该放置很多(如果有的话)操作数据的代码,除了格式化它 - 创建 table 条目,用链接包装等。您不应该(恕我直言)在 JSP 中查询数据库、执行计算等 - 让模型执行这些操作。
正如 duffymo 所说,JSPs 是旧的,但它们仍然有效。我建议您也考虑 AngularJs (ng)(在阅读 V1 v. V2 的争议之后)。
使用 JSP 的最佳做法是 根本不要使用 JSP。我会尽量解释清楚原因。
首先,我必须解释一些与 JSP 完全没有关系的东西,但它会帮助您理解 JSP 技术的确切问题。
在函数式编程中有一个术语——纯函数。这意味着它没有副作用。此外,这样的函数确实保证对于具有相同输入的每次调用它 ALWAYS return 相同的输出。
在 OOP 中,函数不是纯粹的。它可能有副作用。它使我们的生活变得更加复杂。但重要的是,这些副作用只会在 WITHIN 你的函数中发生。你可以调试它。或多或少,它 在您的控制之下。
让我们把用 JSP 编写的功能想象成一个输入为 I 输出为 O 的函数 f:
O f(I)
JSP 的第一个问题是它确实有副作用,而且这种副作用不仅会发生在您的函数 f
内部,还会影响它外部。一个简单的示例:您使用 tiles
技术,您的 jsp 页面用作 tiles 模板中的组件。此模板的另一个组件使用 getOutputstream()
方法并写入此输出流。但是应用程序可以对任何给定的响应调用 getOutputStream 或 getWriter,但不允许两者都执行。 JSP 引擎使用 getWriter,因此您不能调用 getOutputStream。然后你进入你的 jsp 页面,当它单独时工作正常:
java.lang.IllegalStateException: 已经为此响应调用了 getOutputStream()
getOutputStream() has already been called for this response
- 使用函数,您可以获得明确的输入参数。输入总是清晰的。此外,您可以使用常量,或者,如果您的函数有副作用,则可以使用其他服务来获取数据进行处理。但它始终在您的职能范围内,或多或少处于控制之下。对于 JSP 页面,您根本没有这种控制权。输入数据可以放入不同 servlets/web 组件的会话中,输入数据可以通过带有大量 if 语句的 servlet 放入请求范围。您必须首先调查此 servlet 的逻辑。当您创建“Hello World!”时,额外的复杂性并不明显。程序,但是当你维护这些几年前写的页面时,这真的会让你发疯。
- 我想您已经了解到混合输出和逻辑不是一个好主意。 JSP 允许人们这样做。因为“太方便了”
- 您无法在 jsp 页面中测试逻辑。或者它使它变得更加困难。
可以说,正确使用 jsp 技术并应用最佳实践可以解决大部分问题。是的。同意。但它永远无法摆脱其内部缺陷和复杂性。你总是要检查,开发人员是否真的遵循了最佳实践?我们这个时代有更好、更好的技术。
注意: 我个人会使用它的唯一例外或用例:用于本地化。您没有从服务器获取所有消息。您不想让服务器一个一个地获取本地化字符串。例如,您确实希望获得一批值,这些值将用于您的 Web 表单。使用 JSP + JS,您可以非常轻松和明确地做到这一点。
我是 JSP 编程新手,正在为家庭成员编写网络应用程序。在我学习的过程中,我听到很多关于 JSP 应该如何用于表示以及 servlet 用于业务逻辑的说法。我的问题基本上是关于这能走多远以及我何时使用 JSTL 是不好的做法。这是一个示例:我的应用程序有一个登录页面,我正在使用 c:if 的自定义函数连接到我的 java 类 来处理表单。这会被认为是糟糕的 MVC 实践吗,或者,因为我只是从 EL 引用我的逻辑代码,这是对 JSP 的合法使用吗?
JSP 是一种过时的技术,现在很少有软件还在使用它。但是如果你想使用它,我建议你使用 Oracle Coding Standards 。此页面应该让您清楚地了解应该和不应该使用它做什么。
你的问题包含很多最佳实践,这会引起很多意见和争论,而这在本论坛中通常是不受欢迎的。通常,JSP 是 MVC 中的 "V" 视图,应该用于呈现 "M" 模型提供的数据,这将是您的 Java 代码。 "C"控制者经常分散在 M 和 V 之间(引起更多争论,抱歉)。
您在 JSP 中放置的任何逻辑,除了查看给您的数据并决定如何呈现数据之外,都会将其移向模型。您的登录页面应该只收集凭据并将它们呈现给模型,而模型又应该响应 "Invalid" 并重新请求凭据(或完全失败),或者如果有效,则转到下一页。
实际上,恕我直言,您不应该放置很多(如果有的话)操作数据的代码,除了格式化它 - 创建 table 条目,用链接包装等。您不应该(恕我直言)在 JSP 中查询数据库、执行计算等 - 让模型执行这些操作。
正如 duffymo 所说,JSPs 是旧的,但它们仍然有效。我建议您也考虑 AngularJs (ng)(在阅读 V1 v. V2 的争议之后)。
使用 JSP 的最佳做法是 根本不要使用 JSP。我会尽量解释清楚原因。
首先,我必须解释一些与 JSP 完全没有关系的东西,但它会帮助您理解 JSP 技术的确切问题。
在函数式编程中有一个术语——纯函数。这意味着它没有副作用。此外,这样的函数确实保证对于具有相同输入的每次调用它 ALWAYS return 相同的输出。 在 OOP 中,函数不是纯粹的。它可能有副作用。它使我们的生活变得更加复杂。但重要的是,这些副作用只会在 WITHIN 你的函数中发生。你可以调试它。或多或少,它 在您的控制之下。
让我们把用 JSP 编写的功能想象成一个输入为 I 输出为 O 的函数 f:
O f(I)
JSP 的第一个问题是它确实有副作用,而且这种副作用不仅会发生在您的函数
f
内部,还会影响它外部。一个简单的示例:您使用tiles
技术,您的 jsp 页面用作 tiles 模板中的组件。此模板的另一个组件使用getOutputstream()
方法并写入此输出流。但是应用程序可以对任何给定的响应调用 getOutputStream 或 getWriter,但不允许两者都执行。 JSP 引擎使用 getWriter,因此您不能调用 getOutputStream。然后你进入你的 jsp 页面,当它单独时工作正常:java.lang.IllegalStateException: 已经为此响应调用了 getOutputStream()
getOutputStream() has already been called for this response
- 使用函数,您可以获得明确的输入参数。输入总是清晰的。此外,您可以使用常量,或者,如果您的函数有副作用,则可以使用其他服务来获取数据进行处理。但它始终在您的职能范围内,或多或少处于控制之下。对于 JSP 页面,您根本没有这种控制权。输入数据可以放入不同 servlets/web 组件的会话中,输入数据可以通过带有大量 if 语句的 servlet 放入请求范围。您必须首先调查此 servlet 的逻辑。当您创建“Hello World!”时,额外的复杂性并不明显。程序,但是当你维护这些几年前写的页面时,这真的会让你发疯。
- 我想您已经了解到混合输出和逻辑不是一个好主意。 JSP 允许人们这样做。因为“太方便了”
- 您无法在 jsp 页面中测试逻辑。或者它使它变得更加困难。
可以说,正确使用 jsp 技术并应用最佳实践可以解决大部分问题。是的。同意。但它永远无法摆脱其内部缺陷和复杂性。你总是要检查,开发人员是否真的遵循了最佳实践?我们这个时代有更好、更好的技术。
注意: 我个人会使用它的唯一例外或用例:用于本地化。您没有从服务器获取所有消息。您不想让服务器一个一个地获取本地化字符串。例如,您确实希望获得一批值,这些值将用于您的 Web 表单。使用 JSP + JS,您可以非常轻松和明确地做到这一点。