为什么 scriptlet 存在于 JSP 中?

Why do scriptlets exist in JSP?

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

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

为了向后兼容,它们仍然存在。

这是一个三年前的问题,但我想谈谈我对此事的个人看法。我在大型项目(CRM 系统)中将 JSPs 与 scriptlet 一起使用超过 15 年,以下是我的经验:

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