2011-09-02 71 views
1

使用自定义操作而不是scriptlet有什么优势(如果有的话)?标记库与JSP中的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小脚本。

此外,我想实现一些自定义标签,这些标签现在是使用Java,JavaScript,CSS和HTML代码的单独JSP文件。

+1

[如何避免JSP文件中的Java代码?](http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files) – BalusC

回答

0

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

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

缺点 - 有出头你不能在JSTL做。

+0

它可能是重复的因为您可以获得有效的XML,所以更容易 – Hurda

2

就性能而言,它们都被编译为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代码。

0

我宁可摆脱JSP ... 我已经使用JSP现在6至8年,它根本不值得使用。模板引擎可以让您更好地转身。

2

我喜欢JSP。我认为它是Java页面服务标记语言中最好的。它的主要缺点是,它不适用于诸如电子邮件之类的东西,因为你不能只是将字符串和地图传递给评估者,并像Velocity那样获得结果。

但是超出这个用例,JSP很棒。

要回答你的问题,你仍然可以保留你的scriptlet代码。因为“if”只是一个if,而c:if是一个方法调用,并且在调用标记时会加上一些环境参数,所以类似于scriptlet“if”和c:if标签肯定会更快。

也就是说,这与速度差异造成的影响有多大是不同的问题。

大部分的代码不应该在JSP中,显然,逻辑应该主要在Servlet中,或者你在后端使用的任何东西,而JSP只包含渲染代码(这当然可以涉及到IF和FOR等)

针对scriptlet的主要参数是JSP标记文件。标记文件是将JSP与其他JSP分开的东西。 JSP标签文件使JSP可以重构,并且可以轻松添加新标签。但缺点是,使用标签文件时,您创建的任何标签都不能在其边界内包含scriptlet代码。例如,如果您创建了“TABLE”标签,则t:table和/ t:table元素之间的任何内容都不能包含scriptlet元素。然而,你当然可以在标签文件实现中使用scriptlet代码,所以我只需要包装我需要的任何scriptlet。

您可以在这里:JSP tricks to make templating easier?了解标签文件的概述。但是我们远远超过了这里。我们使用标签文件定义表单和表格和组件以及各种东西。

0

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

恕我直言,有效论据针对 scriptlets几乎都是关于编码,调试和维护的问题。 JSP被嘲笑了这么久的主要原因之一不是关于JSP,而是关于人们如何使用它的更多。没有什么比在您的IDE中打开一个JSP(别人写的)并且看到这个意大利面代码混杂了scriptlet和HTML更糟糕的了。如果你想在所有地方混合使用服务器端代码和HTML,那么你也可以用PHP编写代码! :)

使用Taglibs将使您的JSP方法更容易开始开发,更快速地调试和维护,从长远来看。

我觉得小脚本是这样一个糟糕的选择,我总是喜欢开始一个新项目时,类似这样的小片段的东西添加到我的web.xml文件:

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

这将关闭小脚本评估Web应用程序内部的JSP,迫使开发人员找到更好的选择。

Taglibs的另一个重要论点是您将以更严格的方式进行编码。例如,当您编写Taglib时,您将不得不处理代码中抛出的任何异常(这种或那种方式)。如果您在scriptlet中编写相同的代码,IDE或JSP编译器将不会提示您将代码包装在try-catch块中。懒惰/不专业的程序员可能会喜欢避免编写几行错误处理代码。真正的程序员从经验中得知,捕捉异常并在Java中正确处理它们比在JSP运行时抛出异常更容易,更干净和更健壮。同样,如果你进入JUnit等,那么单元测试taglib就非常简单 - 根据定义,你可能不能真正单元测试一个JSP,最好你可以做一些集成测试。

另外,正如有人也提到,使用Taglibs有一个建筑上的好处。代码设计和重用因子有利于Taglibs。没有简单的方法来共享嵌入在JSP文件中的scriptlet代码。所以你最终会在整个地方进行复制粘贴编码。