今更ですが、何でも記事にしていく方針ですので書いておきます。
EL式とはExpression Languageの略で、JSP2.0より導入されました。
JSP2.0がリリースされた時期は2003年であり、今から約10年も過去になります。2003年といえば、世界に一つだけの花やケツメイシの夏の思い出が大ヒットして、カラオケ全盛の時代でしたから夜な夜なカラオケに行っては歌いまくっていた、そして広末涼子が岡沢高宏と結婚した、そんな年です。あの頃は楽しかった。あの頃は楽しかった。
という訳でEL式ですが、書き方はJSP内に${}で
${変数}
のように記述します。
暗黙オブジェクトであるsessionやcookieも利用出来ます。
利用できる暗黙オブジェクト
pageContext PageContextオブジェクト変数 pageScope pageスコープのオブジェクト変数 requestScope requestスコープのオブジェクト変数 sessionScope sessionスコープのオブジェクト変数 cookie クッキーMapオブジェクト変数 applicationScope applicationスコープのオブジェクト変数 header リクエストヘッダーと値を格納するMapオブジェクト変数 headerValues 複数の値を持つリクエストヘッダーを格納するString型配列変数 param リクエストパラメータMapオブジェクト変数 paramValues 複数の値を持つリクエストパラメータString型配列変数 initParam コンテキスト初期化パラメータMapオブジェクト変数
以上が基本であり、そこまではググったら簡単に調べられるのですが、どういう場面で使うの?という疑問に、私が良く使っている使用法を書いておきます。何かの役に立てばこれ幸いです。
こういう使い方も便利だよ!ってのがあれば教えてください。お願いします。
・開発環境と本番環境の差異を吸収する
開発環境でデバッグを行う場合と、本番環境ではURLが異なります。これをEL式で吸収します。
私の開発用のマシンはWindowsであり、eclipseにつっこんでいるTomcatを使ってデバッグを行っています。
デバッグ起動する際に、コンテキスト名としてプロジェクトの名前などをサーバーの設定で指定してあります。
そのコンテキスト名がデバッグ起動時のアクセスの際にURLに付加される為、本番環境とURLが異なります。
例えば、デバッグ環境のサーバーのコンテキスト名に「love2003」を設定している場合、アクセスURLは下記となります。
http://domain-name/love2003/
そして本番では
http://domain-name/
でアクセス出来るように設定するはずです。
※domain-nameやポート番号は環境に沿って読み替えてください
上記のように、本番とデバッグでは同じページにアクセスする場合でもURLが異なっていますね。
普通にJSPを記述していては、外部ファイルの読み込みのパスが異なりますから、本番用とデバッグ用でJSPを切り分けるなりしなければなりません。
そこでEL式を使うと、
<link rel="Stylesheet" href="${pageContext.request.contextPath}/css/stylesheet.css" />
のような記述とする事で、デバッグ環境では自動で${pageContext.request.contextPath}の箇所がlove2003となり、本番環境では空文字になり、パス関係での404NotFoundエラーが無くなります。
※デバッグ環境のTomcatでROOTアプリケーションをデプロイする方法をとれば、コンテキスト名を削除し、本番と同じURLでのアクセスが出来るようになり、EL式を使用しなくてもよくなります。
が、それをやるには毎回手動でビルドデプロイを行わなければならず、eclipseの虫アイコンをぽちっとクリックして簡単にデバッグ起動が出来ませんのでこの方法を使っています。
簡単に出来るよ!ってのを知っていれば教えてください。お願いします。
・簡単な演算を行った結果を変数に格納
EL式はJSP内で実装しても問題ないような簡単な演算を組み込むのに最適です。
以下はページング制御が必要な画面の生成で使用している例です。
<s:if test="1 < cp"> <li class="page"><a class="pageL" href="${pageContext.request.contextPath}/search/?id=${id}&np=1" >先頭</a></li> <li class="page"><a class="pageL" href="${pageContext.request.contextPath}/search/?id=${id}&np=${cp-1}" >前へ</a></li> </s:if> <s:iterator value="page" status="pageSt"> <s:if test="cp == page[#pageSt.index]"> <li class="page"><div class="pageLabel"><s:property/></div></li> </s:if> <s:else> <li class="page"><a class="pageL" href="${pageContext.request.contextPath}/search/?id=${id}&np=${page[pageSt.index]}" ><s:property/></a></li> </s:else> </s:iterator> <s:if test="tp > cp"> <li class="page"><a class="pageL" href="${pageContext.request.contextPath}/search/?id=${id}&np=${cp+1}" >次へ</a></li> <li class="page"><a class="pageL" href="${pageContext.request.contextPath}/search/?id=${id}&np=${tp}" >最後</a></li> </s:if>
2行目では、aタグのリンク先の指定のパラメータidに対して変数のidを${id}により設定しています。これは演算ではありませんが、基本的な使い方です。
3行目では、2行目のパラメータに加えてnpというパラメータに対して変数cp-1の値を${cp-1}により設定しています。
これは『前へ』ボタンのリンク先に設定されます。
cpというカレントページ番号を格納している変数が有り、『前へ』ボタンをクリックした時のリンク先の指定にcp-1を設定する事により、カレントページ番号を1減らしてアクションに渡すようになっています。
アクションではnpで受け取ったページ番号のデータを検索して画面表示します。
16行目では、逆に『次へ』ボタンのリンクの設定をcp+1によりおこなっています。
このように、ページング制御などでちょっとした演算が必要になった時にEL式を使えば簡潔に書くことが出来、コードを忘れてしまっている数か月後とかに見てもパッと思い出せるように記述出来ます。
・Javascript + EL式
何らかの画面要素をクリックした際の制御をonclickにより行う場合が有ると思います。
次の例ではそんな時、Javascriptを使用して画面内のDOMに対しての値設定をEL式の結果値の設定としています。
<a href="#" onclick="document.getElementById('keywordId').value='${imazinData.getImazin()}'; document.imazinForm.submit(); return false;">Imazin</a>