web-dev-qa-db-fra.com

Je peux passer une variable d'un scriptlet JSP à JSTL mais pas de JSTL à un scriptlet JSP sans erreur

Le code suivant provoque une erreur:

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

L'erreur dit

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

Comment passer test du code JSTL au scriptlet JSP?

49
Cornish

Les scripts sont bruts Java incorporés dans le code de la page, et si vous déclarez des variables dans vos scripts, alors ils deviennent des variables locales incorporées dans la page.

En revanche, JSTL fonctionne entièrement avec des attributs de portée, soit à l'étendue page, request ou session. Vous devez retravailler votre scriptlet pour utiliser test comme attribut:

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

Si vous regardez les documents pour <c:set>, vous verrez que vous pouvez spécifier scope comme page, request ou session, et par défaut c'est page.

Mieux encore, n'utilisez pas du tout de scriptlets: ils font pleurer le bébé Jésus.

104
skaffman

@skaffman l'a cloué. Ils vivent chacun dans son propre contexte. Cependant, je ne considérerais pas l'utilisation de scriptlets comme la solution . Vous souhaitez éviter eux. Si tout ce que vous voulez est de concaténer des chaînes dans EL et vous avez découvert que le + L'opérateur échoue pour les chaînes dans EL (ce qui est correct), alors faites simplement:

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

Ou si abc doit être obtenu à partir d'une autre variable de portée nommée ${resp}, alors fais:

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