4

使用自定义操作而不是 scriptlet 有什么好处(如果有的话)?

例如,在性能方面哪个更好?

<c:if test="${param.Clear}">
  <font color="#ff0000" size="+2"><strong> 
  You just cleared your shopping cart! 
  </strong><br>&nbsp;<br></font>
</c:if> 

或者

<%if (param.Clear){%>
      <font color="#ff0000" size="+2"><strong> 
      You just cleared your shopping cart! 
      </strong><br>&nbsp;<br></font>
<%}%>

我有一个大型 JSP 项目,我想知道是否有必要使用标记库,或者我是否可以保留我的 Java scriptlet。

另外,我想为一些现在是带有 Java、JavaScript、CSS 和 HTML 代码的独立 JSP 文件的东西实现自定义标记。

4

5 回答 5

3

我喜欢 JSP。我认为它是最好的 Java 页面服务标记语言。它的主要缺点是它不适用于电子邮件等东西,因为你不能只将字符串和映射传递给评估器并像使用 Velocity 之类的东西一样得到结果。

但除了这个用例之外,JSP 也很棒。

要回答您的问题,您仍然可以保留您的 scriptlet 代码。像 scriptlet "if" 与 ac:if 标签之类的东西在 CPU 方面肯定会更快,因为 "if" 只是一个 if 而 ac:if 是一个方法调用加上调用标签时的一些环境恶作剧。

也就是说,速度差异会产生多大的影响,这是一个不同的问题。

大多数代码不应该在 JSP 中,显然,逻辑应该主要在 Servlet 或您在后端使用的任何其他内容中,并且 JSP 仅包含渲染代码(当然可能涉及 IF 和 FOR 等.)

反对 scriptlet 的主要论据是 JSP 标记文件。标记文件将 JSP 与其他文件区分开来。JSP 标记文件使 JSP 可重构,并使添加新标记变得轻松。但缺点是使用标记文件时,您创建的任何标记都不能在其边界内包含 scriptlet 代码。

例如,如果您创建了一个“TABLE”标签,则 t:table 和 /t:table 元素之间的任何内容都不能包含 scriptlet 元素。但是,您当然可以在标记文件实现中包含 scriptlet 代码,因此我只需将我需要的任何 scriptlet 内容包装在其中。

你可以去这里:让模板更容易的 JSP 技巧?了解标签文件的概述。但我们在这里远远不止于此。我们使用标签文件定义表单、表格和组件以及各种东西。

于 2011-09-02T20:49:23.350 回答
3

就性能而言,它们都被编译为 servlet,因此它们的性能应该一样好。

在您给出的示例中似乎没有太多推荐 JSTL 的内容,但是我见过的项目会发生如下代码:

<%if (param1.Clear() && param2.isSomeFlagSet() && !param3.isSomeOtherFlagSet()){%>
      <font color="#ff0000" size="+2"><strong> 
      You just cleared your shopping cart! 
      </strong><br>&nbsp;<br></font>
<%}%>

它被全部复制。>_< 如果你机械地用 JSTL 替换它,你会得到同样糟糕的东西,很明显,但它给了你一个更好地组织事情的机会。

遵循 BalusC 的建议,尽可能从您的 JSP 中删除内联 Java 代码。

于 2011-09-02T19:30:10.703 回答
1

我宁愿完全摆脱 JSP……我现在使用 JSP 已经 6 到 8 年了,它根本不值得使用。模板引擎为您提供了更好的转机。

于 2011-09-02T20:26:29.010 回答
1

这就是为什么我认为 JSTL 是更好的选择。

  1. 使用 JSTL 更容易阅读。
  2. 如果您在 JSP 中创建了一个方法,那么只有该 JSP 可以使用它。所以可重用性也是其中之一。
  3. pageScope并且requestScope对象已经可以使用${foo}而不是request.getAttribute('foo')

缺点 - 有些事情在 JSTL 中是做不到的。

于 2011-09-02T19:05:42.653 回答
1

您提出的两个选项之间可能存在一些可忽略不计的性能差异,但我认为运行时性能并不是标签库旨在解决的问题。

恕我直言,反对scriptlet的有效论据几乎都是关于编码、调试和维护问题。JSP 被嘲笑这么久的主要原因之一与其说是关于 JSP,不如说是关于人们如何使用它。没有什么比在您的 IDE 中打开一个 JSP(其他人编写的)并看到这个由 scriptlet 和 HTML 组成的意大利面条式代码更糟糕的了。如果你想在所有地方混合服务器端代码和 HTML,你不妨去用 PHP 编码!:)

使用 Taglibs 将使您的 JSP 更易于最初开发、更快地调试和长期维护。

我认为 scriptlet 是一个糟糕的选择,我总是喜欢在开始一个新项目时将类似于这个小片段的内容添加到我的 web.xml 文件中:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>

这会关闭 Web 应用程序内 JSP 中的 scriptlet 评估,迫使开发人员寻找更好的替代方案。

Taglibs 的另一个重要论点是您将以更严格的方式进行编码。例如,当您编写 Taglib 时,您必须处理代码中抛出的任何异常(一种或另一种方式)。如果您在 scriptlet 中编写相同的代码,IDE 或 JSP 编译器不会提示您将代码包装在 try-catch 块中。懒惰/不专业的程序员可能会因为避免编写几行错误处理代码而感到高兴。真正的程序员从经验中知道,在 Java 中捕获异常并正确处理它们比让 JSP 在运行时抛出异常更容易、更干净、更健壮。此外,如果您喜欢 JUnit 等,那么对 taglibs 进行单元测试非常简单——根据定义,您可能无法真正对 JSP 进行单元测试,充其量您可能能够进行某种集成测试。

此外,正如有人还提到的,使用 Taglibs 有架构上的好处。代码设计和重用因素有利于 Taglibs。没有简单的方法可以共享嵌入在 JSP 文件中的 scriptlet 代码。因此,您最终会到处复制粘贴编码。

于 2011-09-02T22:14:56.823 回答