Подтвердить что ты не робот

Я могу передать переменную из сценария JSP в JSTL, но не из JSTL в сценарий JSP без ошибки

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

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

Ошибка говорит

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

Как передать test из кода JSTL в сценарий JSP?

4b9b3361

Ответ 1

Скрипты представляют собой raw 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.

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

Ответ 2

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

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

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

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