Я могу передать переменную из скриптлета JSP в JSTL, но не из JSTL в скриптлет JSP без ошибки - PullRequest
48 голосов
/ 26 августа 2010

Следующий код вызывает ошибку:

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

Ответы [ 2 ]

102 голосов
/ 26 августа 2010

Скрипты - это необработанные java, встроенные в код страницы, и если вы объявляете переменные в своих скриптах, то они становятся локальными переменными, встроенными в страницу.

В отличие от этого, JSTL полностью работает с атрибутами области, либо наОбъем page, request или session.Вам нужно переработать скриптлет, чтобы вывести 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 как page, request или session, и по умолчанию он равен page.

Еще лучше, не используйте скриплетов вообще: они заставляют младенца Иисуса плакать.

13 голосов
/ 26 августа 2010

@ Скаффман прибил его. Они живут каждый в своем собственном контексте. Однако я бы не стал использовать скриптлеты в качестве решения . Вы хотели бы избегать их. Если все, что вам нужно, это объединить строки в EL, и вы обнаружили, что оператор + не работает для строк в EL (что правильно), то просто выполните:

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

Или, если abc нужно получить из другой переменной области действия с именем ${resp}, выполните:

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