web-dev-qa-db-ja.com

スクリプトレット内のjstl変数へのアクセス

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

       <c:set var="test" value="test1"/>
      <%
        String resp = "abc"; 
        resp = resp + ${test};  //in this line I got an  Exception.
        out.println(resp);
       %>

Scriptlet.whyで式言語「$ {test}」を使用しませんか?

31
reddy

[〜#〜] jstl [〜#〜] 変数は実際には属性であり、デフォルトではページコンテキストレベルでスコープされます。
その結果、スクリプトレットのJSTL変数値にアクセスする必要がある場合、適切にスコープされたオブジェクトで getAttribute() メソッドを呼び出すことでアクセスできます(通常 pageContext および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コードと${test} in not Java code。


関連なし

59
Aniket Kulkarni

スクリプトレットコードのコンテンツ(<% %>)Java言語コードスニペットは、翻訳されたサーブレットのサービスメソッドに配置されます(JSPはサーブレットクラスに翻訳されます)。有効なJava構文のみJSPに2つの文字列を追加する場合、1つ目は定数「abc」で、2つ目はELの値である場合、簡単に使用できます

abc${test}

結果をスクリプト変数に保存する場合は、Aniketの回答に従ってください(ただし、スクリプトを作成しないようにすることをお勧めします)。

1
Kojotak