JSTLの<c:set>で値をセットした変数をスクリプトレットで使う方法 2016/09/19
こんにちは。
前回の記事
「JSP側でJavaのクラスを使いたい 2016/09/17 - Novice Engineer BLOG」
で質問したことを教えていただけたので、その部分をまとめてみました。
今回はその記事です。
アジェンダ(目次)
- 前回の質問
- 解決策
- まとめ
1.前回の質問
JSTLの「c:set」で変数に格納して、
その変数を、読み込んだJavaクラスのメソッドの引数として渡す方法が分かりません。。
<% page import="オリジナルのクラス(testクラスを読み込んだとする)" %>
<c:set var="test" value="テスト" />
<% test.testMethod(${test}) %>
こんな感じで渡そうとすると「${test}」のとこでエラーになる。
これのエラーの原因は、
スクリプトレットの中でEL式を使おうとしていたこと。
そうなんです。<%%>の中で${}は使えないんです。
そもそもEL式ってのは、 JSP式をより簡潔に書くためのもんだから、
スクリプトレットとは全く無関係。(根本的なことを分かってなかった。)
こんなことできるわけないんだね。。。
<% test.testMethod(${test}) %>
JSP式とEL式の書き方を少し説明します。
JSTLの<c:set>で以下のように値を変数に格納したとして、
<c:set var="test" value="EL式ってなんじゃそれ">
JSP式ではこう書くものを
<%=((String) pageContext.getAttribute("test")) %>
それがEL式を使ったらこう書けば良い
${test}
ほら変数に格納した値を簡単に取り出せる。
※<c:set>
JSTLの中で定義されてるタグで、変数を格納するときに使用する
※pageContext
ページスコープの値を操作するための暗黙オブジェクト
<c:set>で値を格納すると、ページスコープという場所に格納されるのでpageContextを使う
※getAttribute()
ページスコープに格納された値を取得するメソッド
2.解決策
<% test.testMethod(${test}) %>
こうではなく、
<% test.testMethod((String) pageContext.getAttribute("test")); %>
こう書けばよかった!(実際に変数「test」をメソッドの仮引数として渡せました)
3.まとめ
①スクリプットレットの中でEL式は使えない
②EL式はJSP式をより簡単に記述できるようにしたもの
③<c:set>で値はpageScopeに格納される
余談
スクリプトレットについて調べてたら、アプリケーションを作るときはマルチスレッドセーフになるように意識しないといけないと書かれてあった。
これはフルスクラッチで作るときに意識すれば良いのかな。
フレームワークやライブラリを使うときでもマルチスレッドセーフになっていることを事前に確認する必要があるそう。
じゃないと思わぬところでバグを生む。
ここら辺についても面白そうだから調べてみよう。