【问题标题】:I can pass a variable from a JSP scriptlet to JSTL but not from JSTL to a JSP scriptlet without an error我可以将变量从 JSP scriptlet 传递给 JSTL,但不能从 JSTL 传递给 JSP scriptlet 而不会出错
【发布时间】:2011-04-03 23:13:02
【问题描述】:

以下代码导致错误:

 <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?

【问题讨论】:

    标签: java jsp jstl scope scriptlet


    【解决方案1】:

    脚本是嵌入在页面代码中的原始 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}"/>
    

    如果您查看&lt;c:set&gt; 的文档,您会发现您可以将scope 指定为pagerequestsession,默认为page

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

    【讨论】:

    • JSTL 让我哭泣,或者至少在我不得不阅读许多丑陋的东西时感到畏缩。不过谢谢!
    【解决方案2】:

    @skaffman 确定了它。他们每个人都生活在自己的环境中。但是,我不会考虑将 scriptlet 用作 the 解决方案。你想avoid他们。如果您只想在 EL 中连接字符串,并且发现 + 运算符在 EL 中对字符串失败(这是正确的),那么只需执行以下操作:

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

    或者如果abc 是从另一个名为${resp} 的作用域变量中获取的,那么这样做:

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

    【讨论】: