Java JSP中的标记库与scriptlet

Java JSP中的标记库与scriptlet,java,performance,jsp,jstl,tld,Java,Performance,Jsp,Jstl,Tld,使用自定义操作而不是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&g

使用自定义操作而不是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> 


你刚刚清理了你的购物车!




你刚刚清理了你的购物车!


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


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

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

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

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

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

    我宁愿彻底删除JSP。。。
    我现在已经使用JSP 6到8年了,它根本不值得使用。模板引擎为您提供了更好的扭转局面。

    我喜欢JSP。我认为它是服务于标记语言的Java页面中最好的。它的主要缺点是,它不能很好地用于电子邮件之类的事情,因为你不能仅仅将字符串和映射传递给评估器,然后像速度一样返回结果

    但是除了这个用例之外,JSP还是很棒的

    要回答您的问题,您仍然可以保留scriptlet代码。类似于scriptlet“if”与c:if标记的比较肯定会在CPU方面更快,因为“if”只是一个if,而c:if是一个方法调用,在调用标记时加上一些环境方面的诡计

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

    大部分代码不应该在JSP中,显然,逻辑应该主要在Servlet中或在后端使用的任何其他内容中,JSP只包含呈现代码(当然可能涉及IFs和FORs等)

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

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


    您可以转到这里:查看标记文件的概述。但我们在这方面做得远远不止这些。我们使用标记文件定义表单、表、组件和各种各样的东西。

    您提出的两个选项之间可能存在一些微不足道的性能差异,但是我认为运行时性能并不是标记库想要解决的问题

    依我看,反对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>
    
    
    *.jsp
    真的
    
    这将关闭web应用程序内JSP中的scriptlet评估,迫使开发人员找到更好的替代方案

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


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

    而且更容易验证,因为您可以获得有效的XML
    <jsp-config>
      <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
      </jsp-property-group>
    </jsp-config>