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! </font> </c:if> |
或
1 2 3 4 5 | <%if (param.Clear){%> <font color="#ff0000" size="+2"> You just cleared your shopping cart! </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! </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中有些事情是你做不到的。