我可以将一个变量从JSP scriptlet传递到JSTL,但不能从JSTL传递到JSP scriptlet而不会出错

时间:2010-08-25 21:06:03

标签: java jsp jstl scope scriptlet

以下代码会导致错误:

 <c:set var="test" value="test1"/>
 <%
   String resp = "abc";
   resp = resp + test;
   pageContext.setAttribute("resp", resp);
 %>
 <c:out value="${resp}"/>

错误说

"error a line 4: unknown symbol 'test'".

如何将test从JSTL代码传递到JSP scriptlet?

2 个答案:

答案 0 :(得分:102)

脚本是嵌入在页面代码中的原始java,如果在脚本中声明变量,那么它们就会成为页面中嵌入的局部变量。

相比之下,JSTL完全使用范围属性,可以在pagerequestsession范围内使用。您需要重新编写Scriptlet以将test作为属性捕获:

<c:set var="test" value="test1"/>
<%
  String resp = "abc";
  String test = pageContext.getAttribute("test");
  resp = resp + test;
  pageContext.setAttribute("resp", resp);
%>
<c:out value="${resp}"/>

如果您查看<c:set>的文档,就会看到您可以将scope指定为pagerequestsession,并且默认为到page

更好的是,根本不要使用小脚本:它们会让小耶稣哭泣。

答案 1 :(得分:13)

@skaffman把它钉死了。他们每个人都生活在自己的环境中。但是,我不会考虑将scriptlet用作 解决方案。你想avoid他们。如果你想要的是在EL中连接字符串,你发现+运算符在EL中的字符串失败(这是正确的),那么就这样做:

<c:out value="abc${test}" />

或者,如果要从另一个名为abc的范围变量中获取${resp},请执行以下操作:

<c:out value="${resp}${test}" />