关于java:JSP中的标记库与scriptlet

Tag library versus scriptlets in JSP

本问题已经有最佳答案,请猛点这里访问。

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

例如,在性能环境中哪个更好?

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

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

我有一个大的JSP项目,我想知道是否有必要使用标签库,或者如果我可以保留我的Java脚本。

另外,我想为一些现在使用JavaScript、JavaScript、CSS和HTML代码的JSP文件实现自定义标签。


我喜欢JSP。我认为它是最好的Java页面服务标记语言。它的主要缺点是它不能很好地应用于电子邮件之类的事情,因为你不能把一个字符串和一张地图传递给一个评价者,然后像使用速度之类的东西一样得到一个结果。

但除此之外,JSP还不错。

要回答您的问题,您仍然可以保留Scriptlet代码。类似于scriptlet"if"与c:if标记的情况肯定会更快地适应CPU,因为"if"只是一个if,而c:if是一个方法调用,在调用标记时还添加了一些环境问题。

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

大多数代码不应该在JSP中,显然,逻辑应该主要在servlet中,或者在后端使用的其他任何代码中,JSP只包含呈现代码(当然可能涉及到ifs和fors等)。

脚本的主要参数是JSP标记文件。标记文件将JSP与其他文件分开。JSP标记文件使JSP可重构,并使添加新标记变得轻松。但缺点是,当使用标记文件时,您创建的任何标记都不能在其边界内有scriptlet代码。

例如,如果您创建了一个"table"标记,那么t:table和/t:table元素之间的任何内容都不能有scriptlet元素。但是,您当然可以在标记文件实现中使用scriptlet代码,所以我只需要在这些实现中包装我需要的任何scriptlet内容。

您可以在这里:JSP技巧使模板化更容易?有关标记文件的概述。但我们远远超出了这个范围。我们使用标记文件定义窗体、表、组件和各种各样的东西。


就性能而言,它们都被编译成Servlet,所以它们应该表现得同样好。

在您给出的示例中,似乎没有太多的建议可以推荐JSTL,但是我看到的项目会发生什么样的代码:

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

它被复制了。>如果你用JSTL来机械地替换它,你可以得到同样糟糕的东西,很明显,但是它给了你更好地组织事物的机会。

按照BalusC的建议,从你的JSP中去掉内联Java代码。


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

imho,反对scriptlet的有效参数几乎都是关于编码、调试和维护方面的问题。JSP被嘲笑这么久的一个主要原因不是因为JSP,而是人们如何使用它。没有什么比在您的IDE中打开一个JSP(别人写的)和看到这个由脚本和HTML组成的意大利面代码更糟糕的了。如果你想把服务器端代码和HTML混合在一起,你最好用PHP来编写代码!:)

使用taglibs将使您的JSP在最初的开发、调试和长期维护中变得更加容易。

我认为Scriptlet是一个糟糕的选择,所以在启动新项目时,我总是喜欢在web.xml文件中添加类似于这个小片段的内容:

1
2
3
4
5
6
<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等,那么单元测试标记库非常简单——根据定义,您可能无法真正对JSP进行单元测试,至多您可能能够进行某种集成测试。

同样,正如有人提到的,使用TayLBS有一个架构上的好处。代码设计和重用因素是有利于标记库的方式。共享JSP文件中嵌入的scriptlet代码并不是一个简单的方法。所以你最终会在整个地方复制粘贴编码。


我宁愿完全摆脱JSP…我已经和JSP一起工作了6到8年,但它根本不值得使用。模板引擎为您提供了更好的转向。


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

  • 使用JSTL更容易阅读。
  • 如果您在JSP中创建了一个方法,那么只有那个JSP可以使用它。因此,可重用性也是其中之一。
  • pageScoperequestScope对象已经可以使用${foo}而不是request.getAttribute('foo')读取。
  • 缺点-在JSTL中有些事情是你做不到的。