为什么 JSP 中存在 scriptlet?

Vic*_*748 3 java jsp scriptlet jakarta-ee

我已经听过十亿次关于在 JSP 中使用 Scriptlet(那些类似 php 的<% %>东西)是多么可怕的事情了。

  • 事实证明,Scriptlet 打破了代码设计模式,通常是MVC模式
  • 许多 J2EE 框架(例如JSF 2.0+)已经禁用了 scriptlet。

既然 scriptlet 不需要任何用途,并且可以用 JSTL、其他标记库和 EL(表达式语言)替换,为什么它们仍然存在?为什么 Oracle 还没有从 JSP 技术中删除这些 scriptlet?

biz*_*wiz 5

这是三年前的问题,但我\xe2\x80\x99d想就此事发表我个人的看法。我在大型项目(CRM 系统)中使用带有 scriptlet 的 JSP 已超过 15 年,以下是我的经验:

\n\n
    \n
  • 仅当您允许时,Scriptlet 才会破坏 MVC 模式。我不明白为什么应该比<c:out ...${product.priceVat}>更好<%= product.getPriceVat() %>。很多时候\xe2\x80\x99实际上更糟。它\xe2\x80\x99s 更详细,你可能会丢失类型信息。属性是priceVatBigDecimal 还是带有货币的格式化字符串?有时您不知道 EL 的情况(取决于所使用的 IDE)。
  • \n
  • 自动重构对我们的项目有很大帮助。如果一位开发人员将getPriceVat方法重命名为getPriceTax它,则必须反映在所有代码库中。IntelliJ IDEA 非常擅长处理 scriptlet。不确定它是否会自动重命名${product.priceVat}${product.priceTax}(编辑:确实如此,很酷)。Netbeans 或 Eclipse 不能很好地处理 JSP 解析。
  • \n
  • Scriptlet 的性能优于 EL/JSTL 组合。如果你深入了解的话,他们就必须这么做。后者产生更大的代码(Apache Jasper),我们几次在 Java 方法的 64kB 代码限制下运行,实际上被迫用 scriptlet 替换一些标签。
  • \n
  • 原型制作。我们经常使用 scriptlet 构建 JSP 原型(键入代码 - 刷新页面 - 键入代码 - 刷新...)。后来我们增强了标签库并清理了页面。
  • \n
  • 热修复。我们通过直接更改生产服务器上的一个 JSP scriptlet 来阻止服务器重新启动几次。如果您需要更改类内部的编译代码并且需要重建整个 WAR 文件,则这是不可能的。我知道这很恶心。
  • \n
  • 代码缩进对于 scriptlet 来说是一场噩梦。\xe2\x80\x99 是使用 scriptlet 的明显缺点。
  • \n
  • 我希望对 scriptlet 的支持永远不会被弃用。对于干净代码纯粹主义者来说,在 web.xml 中禁用 scriptlet 的能力应该足够好了。
  • \n
\n