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

Cor*_*ish 50 java jsp scope jstl scriptlet

以下代码导致错误:

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

错误说

"error a line 4: unknown symbol 'test'".
Run Code Online (Sandbox Code Playgroud)

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

ska*_*man 105

脚本是嵌入在页面代码中的原始java,如果在脚本中声明变量,则它们将成为页面中嵌入的局部变量.

相比之下,JSTL工作完全与范围属性,无论是在page,requestsession范围.您需要重新编写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}"/>
Run Code Online (Sandbox Code Playgroud)

如果您查看文档<c:set>,您将看到您可以指定scopepage,request或者session默认为page.

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

  • JSTL让我哭泣,或者至少在我必须阅读大部分非常糟糕的东西时感到畏缩.不过谢谢! (6认同)

Bal*_*usC 14

@skaffman把它钉死了.他们生活在各自的环境中.不过,我不会考虑使用小脚本作为解决方案.你想避免它们.如果你想要的只是在EL中连接字符串,你发现+操作符在EL中的字符串失败(这是正确的),那么就这样做:

<c:out value="abc${test}" />
Run Code Online (Sandbox Code Playgroud)

或者如果abc要从另一个范围内的变量名称获取${resp},那么执行:

<c:out value="${resp}${test}" />
Run Code Online (Sandbox Code Playgroud)