JSP 式言語


JSP 式言語 (EL) を使用すると、JavaBeans に格納されたデータへのアクセスが非常に簡単になります。 JSP EL は、算術式と論理式の両方を作成するために使用できます。 JSP EL 式では、整数、浮動小数点数、文字列、定数 true、false、および null を使用できます。


単純な構文

通常、JSP タグで属性値を指定する必要がある場合は、単に文字列を使用します。

<jsp:setProperty name="box" property="perimeter" value="100"/>

JSP EL では、属性値を表す式を指定できます。簡単な式の構文は次のとおりです。

${expr}

ここで、 expr は式を指します。 JSP EL の一般的な演算子は「.」と「[]」です。これら 2 つの演算子を使用すると、埋め込み JSP オブジェクトを通じてさまざまな JavaBean プロパティにアクセスできます。

たとえば、上記の <jsp:setProperty> タグは、式言語を使用して次の形式に書き換えることができます:

<jsp:setProperty name="box" property="perimeter" 
                 value="${2*box.width+2*box.height}"/>

JSP コンパイラーはプロパティ内に「${}」形式を認識すると、評価するコードを生成します。式を検索し、式の値の代替値を生成します。

ラベルのテンプレートテキストで表現言語を使用することもできます。たとえば、<jsp:text> タグは、本文のテキストを JSP 出力に挿入するだけです。

<jsp:text>
<h1>Hello JSP!</h1>
</jsp:text>

ここで、次のように <jsp:text> タグの本文に式を使用します。 EL では、式内で括弧を使用して部分式を整理できます。たとえば、${(1 + 2) * 3} は 9 に等しくなりますが、${1 + (2 * 3)} は 7 に等しくなります。

EL 式の評価を無効にしたい場合は、ページ ディレクティブを使用して isELIgnored 属性値を true に設定する必要があります:

<jsp:text>
Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

この方法では、EL 式は無視されます。 false に設定すると、コンテナーは EL 式を評価します。

EL

EL 式の基本演算子は、Java が提供するほとんどの算術演算子および論理演算子をサポートします。以上かどうかをテストします
オペレーター説明
. Bean プロパティまたはマッピング エントリにアクセスします
[] 配列またはリンク リストの要素にアクセスします
( ) 部分式を整理して優先度を変更する
+
を追加 - 減算または負の値
* 掛ける
/ または div
を除く % または mod 係数を計算します
== または eq 平等性をテストする
!= またはね
と等しいかどうかをテストします。 < または lt
より小さいかどうかをテストします > またはGT
より大きいかどうかをテストします <= または le
以下かどうかをテストします >= または ge
&& または and テストロジックと
|| または 論理和をテストします
かどうか テスト否定
null 値をテストする

JSP EL の関数

JSP EL では、式で関数を使用できます。これらの関数はカスタム タグ ライブラリで定義する必要があります。関数を使用するための構文は次のとおりです。

<%@ page isELIgnored ="true|false" %>

ns は名前空間を参照し、func は関数の名前を参照し、param1 は最初のパラメーターを参照し、param2 は 2 番目のパラメーターを参照します。たとえば、JSTL ライブラリで定義されている関数 fn:length があり、次のように文字列の長さを取得するために使用できます:

${ns:func(param1, param2, ...)}

タグ ライブラリの関数を使用するには、これらのライブラリを次の場所にインストールする必要があります。 <taglib> タグには、JSP ファイルにこれらのライブラリが含まれています。


JSP EL の非表示オブジェクト

JSP EL は、次の表にリストされている非表示オブジェクトをサポートします:

暗黙のオブジェクト説明
pageScope ページスコープ
requestScope リクエストスコープ
sessionScope セッションスコープ
applicationScope 適用範囲
param Request オブジェクトのパラメーター、文字列
paramValues Request オブジェクトのパラメータ、文字列コレクション
ヘッダー HTTP ヘッダー、文字列
headerValues HTTP ヘッダー、文字列コレクション
initParam コンテキスト初期化パラメータ
クッキー Cookie の値
pageContext 現在のページの pageContext

これらのオブジェクトは変数と同じように式で使用できます。次に、この概念をよりよく理解するためにいくつかの例を示します。


pageContext オブジェクト

pageContext オブジェクトは、JSP の pageContext オブジェクトへの参照です。 pageContext オブジェクトを通じて、リクエスト オブジェクトにアクセスできます。たとえば、リクエスト オブジェクトで渡されたクエリ文字列へのアクセスは次のようになります:

${fn:length("Get my length")}

スコープ オブジェクト

pageScope、requestScope、sessionScope、および applicationScope 変数は、各スコープ レベルに格納されている変数にアクセスするために使用されます。

たとえば、applicationScope レイヤーの box 変数に明示的にアクセスする必要がある場合は、applicationScope.box のようにアクセスできます。


param オブジェクトと paramValues オブジェクト

param オブジェクトと paramValues オブジェクトは、request.getParameter メソッドと request.getParameterValues メソッドを使用してパラメータ値にアクセスするために使用されます。

たとえば、order という名前のパラメータにアクセスするには、${param.order} または ${param["order"]} という式を使用できます。

次の例は、リクエスト内の username パラメータにアクセスする方法を示しています:

${pageContext.request.queryString}

param オブジェクトは単一の文字列を返し、paramValues オブジェクトは文字列の配列を返します。


header オブジェクトと headerValues オブジェクト

header オブジェクトと headerValues オブジェクトは、request.getHeader メソッドと request.getHeaders メソッドを使用して情報ヘッダーにアクセスするために使用されます。

たとえば、user-agent という名前の情報ヘッダーにアクセスするには、${header.user-agent} または ${header["user-agent"]} という式を使用できます。

次の例は、ユーザー エージェント情報ヘッダーにアクセスする方法を示しています:

<%@ page import="java.io.*,java.util.*" %>
<%
    String title = "Accessing Request Param";
%>
<html>
<head>
<title><% out.print(title); %></title>
</head>
<body>
<center>
<h1><% out.print(title); %></h1>
</center>
<div align="center">
<p>${param["username"]}</p>
</div>
</body>
</html>

実行結果は次のとおりです:

jsp-expression-language.jpg

ヘッダー オブジェクトは単一の値を返しますが、headerValues は文字列の配列を返します。