読者です 読者をやめる 読者になる 読者になる

Novice Engineer BLOG

プログラミングやITニュースについて発信していきます。ときどき日常

JSTLの<c:set>で値をセットした変数をスクリプトレットで使う方法 2016/09/19

こんにちは。
前回の記事
JSP側でJavaのクラスを使いたい 2016/09/17 - Novice Engineer BLOG
で質問したことを教えていただけたので、その部分をまとめてみました。
今回はその記事です。

アジェンダ(目次)

  1. 前回の質問
  2. 解決策
  3. まとめ

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}

ほら変数に格納した値を簡単に取り出せる。

JSTL
JSPで使用できるカスタムタグ

※<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に格納される

余談
スクリプトレットについて調べてたら、アプリケーションを作るときはマルチスレッドセーフになるように意識しないといけないと書かれてあった。
これはフルスクラッチで作るときに意識すれば良いのかな。
フレームワークやライブラリを使うときでもマルチスレッドセーフになっていることを事前に確認する必要があるそう。
じゃないと思わぬところでバグを生む。
ここら辺についても面白そうだから調べてみよう。

TO BE CONTINUED