JSPのEL式でMapの値を取り出す方法を徹底解説!初心者でもわかる基本構文と使い方
生徒
「JSPのEL式って便利らしいんですが、Mapから値を取り出す方法がよくわかりません…」
先生
「いいところに気づきましたね。JSPのEL式は、MapやListなどのデータを簡潔に取り出すことができる強力な仕組みなんですよ。」
生徒
「具体的にどうやってMapの値をEL式で取り出すんですか?」
先生
「それでは、JSPにおけるEL式とMapの基本的な使い方を一緒に見ていきましょう!」
1. JSPとEL式の基本をおさらいしよう
まず最初に、JSP(JavaServer Pages)とは、Javaを用いてWebアプリケーションを開発する際に使われるテンプレート技術です。HTMLとJavaコードを組み合わせて、動的なWebページを生成することができます。
その中でもEL式(Expression Language)は、JSPの中でオブジェクトのプロパティやコレクション(MapやListなど)にアクセスするための簡潔な記法を提供します。
EL式を使えば、<%= %>のようなスクリプトレットを使わずに、値をJSPに埋め込むことができます。
2. JSPのEL式でMapの値を取り出す基本構文
JSPでMapの値をEL式で取り出すには、以下のような構文を使います。
${map['キー名']}
ここでのmapは、スコープ(request・session・applicationなど)に格納されたMapオブジェクトを指します。
そして、'キー名'には取り出したい要素のキーを文字列で指定します。ダブルクォーテーションでもOKですが、EL式ではシングルクォートの方が一般的です。
3. JSPでMapをEL式で使う実例を見てみよう
以下のようなServletでMapを準備し、requestスコープにセットしたとしましょう。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "田中太郎");
userMap.put("email", "tanaka@example.com");
request.setAttribute("userInfo", userMap);
request.getRequestDispatcher("/user.jsp").forward(request, response);
}
このとき、JSPファイル(たとえばuser.jsp)では以下のようにEL式でMapの値を取り出すことができます。
<p>名前:${userInfo['name']}</p>
<p>メールアドレス:${userInfo['email']}</p>
出力結果は以下のようになります。
名前:田中太郎
メールアドレス:tanaka@example.com
4. EL式でMapのキーを動的に指定したいときは?
実際の開発現場では、EL式で指定するMapのキーを動的に変えたい場面も出てきます。
たとえば、別の変数にキーが格納されている場合、次のように書くことができます。
<c:set var="keyName" value="email" />
<p>動的キーで取得:${userInfo[keyName]}</p>
このように<c:set>タグで変数を定義し、それをキーとして使うことができます。これはJSTL(JSP Standard Tag Library)との連携によって可能になります。
5. キーに数値や変数を使いたい場合の注意点
Mapのキーに数値や変数を使いたい場合は、EL式の仕様を理解しておく必要があります。以下のような記述が可能です。
<c:set var="userId" value="101" />
${userMap[userId]} もしくは ${userMap['101']}
ただし、Mapのキーが文字列である場合には、数値も文字列として扱う必要があります。EL式では、[]の中に変数を直接指定することで柔軟なアクセスが可能になります。
6. EL式でMapの中にMapがあるときのネストアクセス
EL式は、Mapの中にMapが入っているような入れ子構造でもアクセスできます。たとえば以下のようにMapが二重になっているケースを考えます。
Map<String, Map<String, String>> nestedMap = new HashMap<>();
Map<String, String> innerMap = new HashMap<>();
innerMap.put("address", "東京都港区");
nestedMap.put("user1", innerMap);
request.setAttribute("userData", nestedMap);
この場合、JSPのEL式では以下のように書くことで中の値を取り出せます。
${userData['user1']['address']}
このように、EL式を使えばMapの中のMap、いわゆるネストされた構造でも直感的にアクセスできるのが特徴です。
7. JSPでMapを使うときによくあるエラーと対処法
EL式でMapを使うときに、以下のようなエラーや意図しない出力が出ることがあります。
- キーが存在しない場合: EL式は空文字を返します。
nullにはなりません。 - Mapがnullの場合: EL式全体が何も出力されず、エラーにもなりません。
- キーが数値のとき: 文字列で書かないと見つけられないことがあります。
${map['100']}のように明示しましょう。
エラーを防ぐためには、サーバーサイドでMapの初期化やデータチェックを丁寧に行いましょう。また、JSTLの<c:if>や<c:choose>タグを組み合わせて条件分岐を行うのも効果的です。
8. JSTLとの組み合わせでMapの中身をループ表示
JSPではJSTLを使って、Mapの中身をループして表示することもできます。たとえば以下のようなMapがあるとします。
Map<String, String> colors = new HashMap<>();
colors.put("red", "赤");
colors.put("blue", "青");
colors.put("green", "緑");
request.setAttribute("colorMap", colors);
これをJSPで表示するには、次のように<c:forEach>タグを使います。
<c:forEach var="entry" items="${colorMap}">
<p>${entry.key}:${entry.value}</p>
</c:forEach>
このようにすることで、Mapのすべてのキーと値を簡単に一覧表示することができます。
まとめ
JSPのEL式でMapの値を取り出す方法を理解すると、ServletからJSPへ渡したデータを画面に表示する処理がとても書きやすくなります。Mapはキーと値の組み合わせでデータを管理できるため、ユーザー情報、商品情報、設定値、メッセージ一覧、色やカテゴリの一覧など、さまざまな場面で利用できます。JSPでは、EL式を使うことでJavaコードを直接書かずに、Mapの中にある値を簡潔に表示できます。
基本構文は、${map['キー名']}の形です。Servlet側でrequest.setAttributeを使ってMapをリクエストスコープに保存しておけば、JSP側ではその属性名を使ってMapの値を取り出せます。たとえばuserInfoという名前でMapを渡した場合、${userInfo['name']}と書くことでnameキーに対応する値を表示できます。
JSPのEL式は、スクリプトレットを減らし、HTMLに近い読みやすいテンプレートを作るために役立ちます。昔のJSPでは、画面に値を表示するために<%= %>のような書き方を使うことがありました。しかし現在では、EL式やJSTLを使って表示処理を整理する書き方がよく使われます。初心者のうちからEL式に慣れておくと、保守しやすいJSP画面を作れるようになります。
EL式でMapを扱う基本の考え方
Mapは、キーを指定して値を取り出すデータ構造です。JSPのEL式では、角括弧を使ってMapのキーを指定します。キーが文字列の場合は、シングルクォートで囲んで書くと分かりやすくなります。
<p>名前:${userInfo['name']}</p>
<p>メール:${userInfo['email']}</p>
このように書くと、Servletで用意したuserInfoというMapから、nameとemailの値を取り出して表示できます。EL式を使うことで、JSPの中にJavaの処理を直接書かずに済むため、画面の見た目と表示する値の関係が分かりやすくなります。
また、Mapのキーを固定値ではなく変数で指定したい場合は、${userInfo[keyName]}のように書けます。JSTLのc:setでキー名を変数に入れておけば、表示する項目を動的に切り替えることもできます。
<c:set var="keyName" value="email" />
<p>選択された値:${userInfo[keyName]}</p>
固定のキーを使う場合は${userInfo['email']}、変数をキーとして使う場合は${userInfo[keyName]}という違いを覚えておくと、EL式でMapを扱うときに迷いにくくなります。
ServletからJSPへMapを渡す流れ
JSP単体でMapを表示するのではなく、多くの場合はServletやController側でMapを作成し、requestスコープやsessionスコープへ保存してからJSPへフォワードします。初心者は、Mapの作成、setAttribute、JSPでのEL式表示という流れをセットで覚えると理解しやすくなります。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Map<String, String> userInfo = new HashMap<>();
userInfo.put("name", "佐藤花子");
userInfo.put("email", "sato@example.com");
userInfo.put("role", "管理者");
request.setAttribute("userInfo", userInfo);
request.getRequestDispatcher("/user.jsp").forward(request, response);
}
このようにServlet側でuserInfoをrequest.setAttributeに設定すると、JSP側ではuserInfoという名前でMapを参照できます。JSPのEL式は、requestスコープ、sessionスコープ、applicationスコープなどから自動的に属性を探してくれるため、画面表示が簡潔になります。
<div class="card p-3">
<p>名前:${userInfo['name']}</p>
<p>メール:${userInfo['email']}</p>
<p>権限:${userInfo['role']}</p>
</div>
このようにBootstrapのcardクラスなどと組み合わせると、JSPで取り出したMapの値を見やすく表示できます。Java側でデータを準備し、JSP側でEL式を使って表示するという役割分担を意識すると、コード全体が整理されます。
Mapの中身を一覧表示する方法
Mapの値を一つずつ指定して表示するだけでなく、JSTLのc:forEachを使うと、Mapの中身をループして一覧表示できます。設定値一覧やカテゴリ一覧、色の一覧、エラーメッセージの一覧など、項目数が変わる可能性があるデータを表示するときに便利です。
<ul class="list-group">
<c:forEach var="entry" items="${colorMap}">
<li class="list-group-item">
${entry.key}:${entry.value}
</li>
</c:forEach>
</ul>
c:forEachでMapを繰り返すと、entry.keyでキー、entry.valueで値を取り出せます。Mapの中身をすべて表示したい場合は、この書き方を覚えておくと便利です。JSPのEL式とJSTLを組み合わせることで、画面側の処理をシンプルにできます。
また、Mapの中にMapが入っているネスト構造でも、EL式では${userData['user1']['address']}のように続けて指定できます。ユーザーごとの住所情報、商品ごとの詳細情報、カテゴリごとの設定値など、階層のあるデータを表示するときに役立ちます。
よくあるミスと確認ポイント
JSPのEL式でMapの値が表示されない場合は、まず属性名とキー名を確認しましょう。Servlet側でrequest.setAttributeに指定した名前と、JSP側で使っている名前が違うと値は表示されません。また、Mapに入れたキー名とEL式で指定したキー名が違う場合も、期待した値は表示されません。
たとえばServlet側でuserInfoという名前で保存したのに、JSP側で${userMap['name']}と書くと値は取り出せません。Mapの変数名、スコープ名、キー名をそろえることが大切です。
キーに数値を使う場合も注意が必要です。Mapのキーが文字列の"101"なのか、数値の101なのかによって、取り出し方が変わることがあります。文字列キーとして保存している場合は、${userMap['101']}のように文字列として指定すると分かりやすくなります。
さらに、Map自体がnullの場合や、キーが存在しない場合、EL式は画面に何も表示しないことがあります。エラーにならないため気づきにくいですが、表示されない原因を探すときは、Servlet側でMapに値が入っているか、JSPへ正しくforwardされているか、JSTLのタグライブラリ宣言が正しく書かれているかを確認しましょう。
JSP、EL式、Map、HashMap、requestスコープ、sessionスコープ、setAttribute、getRequestDispatcher、forward、JSTL、c:set、c:forEach、entry.key、entry.value、ネストMap、動的キー、Java Servlet、Webアプリケーション開発といったキーワードは、JSPを学ぶうえで何度も登場します。これらを関連づけて理解することで、JSP画面でのデータ表示がより実践的になります。
今回の内容で大切なのは、ServletなどのJava側でデータを用意し、JSP側ではEL式を使って見やすく表示するという役割分担です。Javaの処理をJSPに直接多く書いてしまうと、画面の見た目と処理が混ざり、あとから修正しにくくなります。EL式とJSTLを活用することで、読みやすく保守しやすいJSPを作ることができます。
初心者のうちは、まず${map['キー名']}の書き方をしっかり覚えましょう。その後、変数をキーとして使う${map[keyName]}、Mapの中のMapを取り出す${map['外側キー']['内側キー']}、c:forEachでMapを一覧表示する方法へ進むと、無理なく理解を深められます。
生徒
JSPのEL式では、Mapの値を${map['キー名']}の形で取り出せることが分かりました。
先生
その通りです。Mapはキーと値でデータを管理するので、EL式でもキーを指定して値を取り出します。
生徒
Servlet側でrequest.setAttributeを使ってMapを保存しておけば、JSP側でその名前を使えるのですね。
先生
はい。Java側でMapを作り、JSP側ではEL式で表示するという流れを覚えると分かりやすいです。
生徒
固定のキーなら${userInfo['name']}のように書いて、変数をキーにするなら${userInfo[keyName]}と書くのですね。
先生
その理解で大丈夫です。シングルクォートで囲むと文字列キー、囲まない場合は変数として扱うと考えると整理しやすいです。
生徒
Mapの中にMapがある場合でも、${userData['user1']['address']}のようにつなげて書けるのが便利だと思いました。
先生
はい。ネストされたMapでもEL式なら直感的に値を取り出せます。階層のあるデータを表示するときに役立ちます。
生徒
c:forEachを使えば、Mapの中身を一覧表示できることも分かりました。
先生
はい。entry.keyでキー、entry.valueで値を表示できます。項目数が変わるデータではとても便利です。
生徒
値が表示されないときは、属性名やキー名、スコープ、JSTLの設定を確認することが大切ですね。
先生
その通りです。JSPのEL式は便利ですが、名前が少し違うだけでも表示されません。Servlet側とJSP側の名前をそろえることを意識しましょう。
生徒
EL式とJSTLを使えば、JSPにJavaコードを直接たくさん書かずに済むのですね。
先生
はい。画面は画面、処理はJava側という役割分担がしやすくなります。Mapの値をEL式で取り出す基本を覚えて、読みやすいJSPを作れるようになりましょう。