Accessing a jstl variable inside a scriptlet

2019-01-17 10:49发布

问题:

The following code causes an error:

       <c:set var="test" value="test1"/>
      <%
        String resp = "abc"; 
        resp = resp + ${test};  //in this line I got an  Exception.
        out.println(resp);
       %>

Don't I use the expression language "${test}" in the scriptlet.why?

回答1:

JSTL variables are actually attributes, and by default are scoped at the page context level.
As a result, if you need to access a JSTL variable value in a scriptlet, you can do so by calling the getAttribute() method on the appropriately scoped object (usually pageContext and request).

resp = resp + (String)pageContext.getAttribute("test"); 

Full code

 <c:set var="test" value="test1"/>
 <%
    String resp = "abc"; 
    resp = resp + (String)pageContext.getAttribute("test");   //No exception.
    out.println(resp);
  %>  

Update

But why that exception come to me.

A JSP scriptlet is used to contain any code fragment that is valid for the scripting language used in a page. The syntax for a scriptlet is as follows:

<%
   scripting-language-statements
%>

When the scripting language is set to java, a scriptlet is transformed into a Java programming language statement fragment and is inserted into the service method of the JSP page’s servlet.

In scriptlets you can write Java code and ${test} in not java code.


Not related

  • How to avoid Java Code in JSP-Files?


回答2:

The content of your scriptlet code (inside <% %>) is java language code snippet to be put into the translated servlet's service method (JSPs are translated into servlet classes). Only valid java syntax can be put there, so you cannot use expression language. If you want to append two strings in JSP, were the first one is constant "abc" and the second is value of some EL, you can simple use

abc${test}

If you want to store the result into scripting variable, follow the answer from Aniket (although my advice is to avoid scripting at all).