为什么 scriptlet 存在于 JSP 中?
Why do scriptlets exist in JSP?
关于在 JSP 中使用 Scriptlet(那些类似 php <% %>
的东西)是多么可怕,我已经听过 亿 次了。
- 事实证明,Scriptlet 打破了代码设计模式,通常 MVC Pattern
- 许多 J2EE 框架(例如 JSF 2.0+)已经禁止使用 scriptlet。
既然 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 的功能对于干净的代码纯粹主义者来说应该足够好了。
关于在 JSP 中使用 Scriptlet(那些类似 php <% %>
的东西)是多么可怕,我已经听过 亿 次了。
- 事实证明,Scriptlet 打破了代码设计模式,通常 MVC Pattern
- 许多 J2EE 框架(例如 JSF 2.0+)已经禁止使用 scriptlet。
既然 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 的功能对于干净的代码纯粹主义者来说应该足够好了。