Pytanie Mogę przekazać zmienną ze skryptu JSP do JSTL, ale nie od JSTL do skryptu JSP bez błędu


Poniższy kod powoduje błąd:

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}"/>

Błąd mówi

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

Jak przejść test od kodu JSTL do skryptletu JSP?


44
2017-08-25 21:06


pochodzenie




Odpowiedzi:


Skrypty to surowe java osadzone w kodzie strony, a jeśli zadeklarujesz zmienne w swoich skryptach, staną się one zmiennymi lokalnymi osadzonymi na stronie.

Natomiast JSTL działa wyłącznie z atrybutami o ustalonym zakresie, czyli na page, request lub session zakres. Musisz przerobić swój skrypt na ryby test jako atrybut:

<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}"/>

Jeśli spojrzysz na dokumenty dla <c:set>zobaczysz, że możesz określić scope tak jak page, request lub sessioni domyślnie jest to ustawione page.

Jeszcze lepiej, nie używajcie skryptletów w ogóle: sprawiają, że dziecko Jezus płacze.


97
2017-08-25 21:11



JSTL sprawia, że ​​płaczę, a przynajmniej wzdrygam się, kiedy muszę czytać wiele z fuchowatych rzeczy. W każdym razie dzięki! - Roboprog


@skaffman go zabił. Żyją one w swoim własnym kontekście. Jednak nie rozważam używania skryptletów jako  rozwiązanie. Chciałbyś uniknąć im. Jeśli chcesz tylko połączyć ciągi w EL i odkryłeś, że + operacja kończy się niepowodzeniem dla ciągów w EL (co jest poprawne), a następnie po prostu wykonaj:

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

Albo jeśli abc jest uzyskiwany z innej zmiennej o ustalonym zakresie ${resp}, a następnie:

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

13
2017-08-25 21:16