通过属性和正文指定JSTL <c:set>值之间的区别

时间:2015-12-22 21:16:29

标签: jsp jstl

我试图弄清楚JSTL <c:set>标记的这两种用法之间是否存在任何功能差异。假设我已经通过类似的东西将一些字符串常量导入到我的JSP页面中:

<%@ page import="some.package.of.AppConstants"%>

因此,鉴于上述导入指令,这两个例子之间的区别是什么:

  1. 指定value属性中的值:

    <c:set var="SOME_VAR" value="${AppConstants.SOME_CONSTANT}" />
    
  2. 指定标记正文中的值:

    <c:set var="SOME_VAR">
        <%=AppConstants.SOME_CONSTANT%>
    </c:set>
    
  3. 第二个例子与第一个例子中${SOME_VAR}的值有什么不同?在AppConstants.SOME_CONSTANT中是否存在任何特殊字符会影响${SOME_VAR}在这两种情况下的价值吗?

2 个答案:

答案 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行为的回答。