JSP中的标签库与scriptlet [重复]
Posted
技术标签:
【中文标题】JSP中的标签库与scriptlet [重复]【英文标题】:Tag library versus scriptlets in JSP [duplicate] 【发布时间】:2011-11-09 10:12:09 【问题描述】:使用自定义操作而不是 scriptlet 有什么好处(如果有的话)?
例如,在性能方面哪个更好?
<c:if test="$param.Clear">
<font color="#ff0000" size="+2"><strong>
You just cleared your shopping cart!
</strong><br> <br></font>
</c:if>
或
<%if (param.Clear)%>
<font color="#ff0000" size="+2"><strong>
You just cleared your shopping cart!
</strong><br> <br></font>
<%%>
我有一个大型 JSP 项目,我想知道是否有必要使用标记库,或者我是否可以保留我的 Java scriptlet。
另外,我想为一些现在是带有 Java、javascript、CSS 和 html 代码的独立 JSP 文件的东西实现自定义标签。
【问题讨论】:
【参考方案1】:我喜欢 JSP。我认为它是最好的 Java 页面服务标记语言。它的主要错误在于它不适用于电子邮件等内容,因为您不能只将字符串和映射传递给评估器并像使用 Velocity 之类的东西一样返回结果。
但除了这个用例之外,JSP 也很棒。
要回答您的问题,您仍然可以保留您的 scriptlet 代码。像 scriptlet "if" 与 c:if 标签之类的东西在 CPU 方面肯定会更快,因为 "if" 只是一个 if,而 c:if 是一个方法调用加上调用标签时的一些环境恶作剧。
也就是说,速度差异会产生多大影响,这是一个不同的问题。
大部分代码不应该在 JSP 中,显然,逻辑应该主要在 Servlet 或您在后端使用的其他任何东西中,并且 JSP 只包含渲染代码(这当然可能涉及 IF和 FOR 等)
反对 scriptlet 的主要论据是 JSP 标记文件。标记文件将 JSP 与其他文件区分开来。 JSP 标记文件使 JSP 可重构,并使添加新标记变得轻松。但缺点是在使用标签文件时,您创建的任何标签都不能在其边界内包含 scriptlet 代码。
例如,如果您创建了“TABLE”标签,则 t:table 和 /t:table 元素之间的任何内容都不能包含 scriptlet 元素。但是,您当然可以在标记文件实现中包含 scriptlet 代码,因此我只需将我需要的任何 scriptlet 内容包装在其中。
您可以访问此处:JSP tricks to make templating easier? 了解标签文件的概述。但我们在这里远远不止于此。我们使用标签文件定义表单、表格和组件以及各种各样的东西。
【讨论】:
【参考方案2】:您提出的两个选项之间的性能差异可能可以忽略不计,但我认为运行时性能并不是标签库真正要解决的问题。
恕我直言,反对 scriptlet 的有效参数几乎都与编码、调试和维护有关。 JSP 被嘲笑这么久的主要原因之一与其说是关于 JSP,不如说是关于人们如何使用它。没有什么比在您的 IDE 中打开一个 JSP(其他人编写的)并看到这个由 scriptlet 和 HTML 组成的意大利面条式代码更糟糕的了。如果你想在所有地方混合服务器端代码和 HTML,你不妨去用 php 编码! :)
使用 Taglibs 将使您的 JSP 更易于最初开发、更快地调试和长期维护。
我认为 scriptlet 是一个糟糕的选择,我总是喜欢在开始一个新项目时将类似于这个小 sn-p 的东西添加到我的 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 代码。所以你最终会在整个地方复制粘贴编码。
【讨论】:
【参考方案3】:我宁愿完全摆脱 JSP... 我现在使用 JSP 已经 6 到 8 年了,它根本不值得使用。模板引擎为您提供更好的周转。
【讨论】:
【参考方案4】:就性能而言,它们都被编译为 servlet,因此它们的性能应该一样好。
在您给出的示例中似乎没有太多推荐 JSTL,但我见过的项目发生的情况是这样的代码:
<%if (param1.Clear() && param2.isSomeFlagSet() && !param3.isSomeOtherFlagSet())%>
<font color="#ff0000" size="+2"><strong>
You just cleared your shopping cart!
</strong><br> <br></font>
<%%>
它会被全部复制。 >_
遵循 BalusC 的建议,尽可能从您的 JSP 中删除内联 Java 代码。
【讨论】:
【参考方案5】:这就是为什么我认为 JSTL 是更好的选择。
-
使用 JSTL 更易于阅读。
如果您在 JSP 中创建了一个方法,那么只有该 JSP 可以使用它。所以可重用性也是其中之一。
pageScope
和 requestScope
对象已经可以使用 $foo
而不是 request.getAttribute('foo')
读取
缺点 - 有些事情在 JSTL 中是无法做到的。
【讨论】:
而且更容易验证,因为你可以获得有效的XML以上是关于JSP中的标签库与scriptlet [重复]的主要内容,如果未能解决你的问题,请参考以下文章