web-dev-qa-db-ja.com

エラーなしでJSPスクリプトレットからJSTLに変数を渡すことはできますが、JSTLからJSPスクリプトレットに変数を渡すことはできません

次のコードはエラーの原因になります。

 <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スクリプトレットに渡すにはどうすればよいですか?

49
Cornish

スクリプトは生のJavaページコードに埋め込まれており、スクリプトで変数を宣言すると、ページに埋め込まれたローカル変数になります。

対照的に、JSTLはpagerequest、または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>のドキュメントを見ると、scopepagerequest、またはsessionとして指定できることがわかります。デフォルトはpageです。

いっそのこと、スクリプトレットはまったく使用しないでください。赤ん坊のイエスを泣かせます。

104
skaffman

@skaffmanはそれを打ち明けた。それらはそれぞれ独自のコンテキストで生きています。ただし、スクリプトレットをtheソリューションとして使用することは考えません。 avoid それらが必要です。 ELで文字列を連結するだけで、ELの文字列に対して+演算子が失敗することを発見した場合(これは正しい)、次のようにします。

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

または、abc${resp}という名前の別のスコープ変数から取得される場合、次のようにします。

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