次のコードではエラーが発生します。
<c:set var="test" value="test1"/>
<%
String resp = "abc";
resp = resp + ${test}; //in this line I got an Exception.
out.println(resp);
%>
スクリプトレットで式言語「${test}」を使用できないのはなぜですか?
JSTL変数は実際には属性であり、デフォルトではページ コンテキスト レベルでスコープが設定されます。
その結果、スクリプトレットで JSTL 変数の値にアクセスする必要がある場合はgetAttribute()
、適切なスコープのオブジェクト (通常はpageContext
and request) でメソッドを呼び出すことでアクセスできます。
resp = resp + (String)pageContext.getAttribute("test");
完全なコード
<c:set var="test" value="test1"/>
<%
String resp = "abc";
resp = resp + (String)pageContext.getAttribute("test"); //No exception.
out.println(resp);
%>
しかし、なぜその例外が私に来るのですか。
JSP スクリプトレットは、ページで使用されるスクリプト言語に有効なコード フラグメントを含めるために使用されます。スクリプトレットの構文は次のとおりです。
<%
scripting-language-statements
%>
スクリプト言語が Java に設定されている場合、スクリプトレットは Java プログラミング言語のステートメント フラグメントに変換され、JSP ページのサーブレットのサービス メソッドに挿入されます。
スクリプトレットでは Java コードを記述できますが、Java コードでは記述でき${test}
ません。
関係ない
スクリプトレット コードの内容 ( 内<% %>
) は、変換されたサーブレットのサービス メソッドに挿入される Java 言語コード スニペットです (JSP はサーブレット クラスに変換されます)。そこには有効な Java 構文しか入れられないため、式言語を使用することはできません。JSP に 2 つの文字列を追加する場合、最初の文字列が "abc" 定数で、2 番目の文字列が EL の値である場合、簡単に使用できます。
abc${test}
結果をスクリプト変数に保存する場合は、Aniket からの回答に従ってください (ただし、私のアドバイスは、スクリプトをまったく作成しないようにすることです)。