我试图弄清楚JSTL <c:set>
标记的这两种用法之间是否存在任何功能差异。假设我已经通过类似的东西将一些字符串常量导入到我的JSP页面中:
<%@ page import="some.package.of.AppConstants"%>
因此,鉴于上述导入指令,这两个例子之间的区别是什么:
指定value
属性中的值:
<c:set var="SOME_VAR" value="${AppConstants.SOME_CONSTANT}" />
指定标记正文中的值:
<c:set var="SOME_VAR">
<%=AppConstants.SOME_CONSTANT%>
</c:set>
第二个例子与第一个例子中${SOME_VAR}
的值有什么不同?在AppConstants.SOME_CONSTANT
中是否存在任何特殊字符会影响${SOME_VAR}
在这两种情况下的价值吗?
答案 0 :(得分:2)
jstl c之间的区别:标签的属性和正文中的设置值
是技术差异。
value
保留原始值类型。例如,如果您提供Integer
或其他任何内容,它将保留Integer
。然而,正文基本上对值有toString()
,因此基本上将任何类型转换为String
。在某些情况下这可能是有益的,例如:
回到具体的功能需求,第一个例子只有在你使用web.xml
与Servlet 3.1匹配的webapp定位Servlet 3.1 / EL 3.0容器(Tomcat 8等)时才有效。
<c:set var="SOME_VAR" value="${AppConstants.SOME_CONSTANT}" />
即,只有EL 3.0才支持此功能。这绝对是 Scriptlet 方式的首选方法。您应该不惜一切代价避免使用 Scriptlets 。您只需要记住,代码不能与旧的版本化目标运行时向后兼容。
答案 1 :(得分:1)
根据O'Reillys HeadsFirstServlets第457页,为什么你会使用c:set的身体版本而不是无体版本。看起来他们做同样的事情。
答案:
那是因为他们做...做 一样。正文版仅供参考 当你想要更多的空间时,方便 价值。这可能是漫长而复杂的 表达式,例如,并将其放入 身体使阅读更容易。
更新
经过一些额外的研究后发现,上述推理仅适用于EL v2.2及更低版本。请参阅BalusC对3.0行为的回答。