タイトル: コンテキストパスの取得
この本文には実行可能なタグ等が含まれるため、安全のためHTMLソースとして表示しています。本文データは変更していません。
<p>JSPで<strong>コンテキストパス(アプリケーションのベースパス)</strong>を取得する方法を説明します。Webアプリ内のリソースを絶対URLで指す際に必須の処理です。</p>
<h2>基本:EL式で取得</h2>
<p>以下のコードを実装することでJSP側でコンテキストパスを取得することが可能。</p>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<tbody>
<tr>
<td style="background-color:#000000">
<p><span style="color:#ffffff">${pageContext.request.contextPath}</span></p>
</td>
</tr>
</tbody>
</table>
<p>これがJSPで最も使われる書き方です。例えば <code>/myapp</code> としてデプロイされている場合、<code>${pageContext.request.contextPath}</code> は <code>/myapp</code> を返します。</p>
<h2>典型的な利用例</h2>
<p>CSS・JS・画像のパスを安全に書く際に使います。</p>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<tbody>
<tr>
<td style="background-color:#000000">
<p><span style="color:#ffffff"><!-- CSS --><br />
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css"><br />
<br />
<!-- JS --><br />
<script src="${pageContext.request.contextPath}/js/app.js"></script><br />
<br />
<!-- 画像 --><br />
<img src="${pageContext.request.contextPath}/img/logo.png"><br />
<br />
<!-- リンク --><br />
<a href="${pageContext.request.contextPath}/user/list">ユーザー一覧</a></span></p>
</td>
</tr>
</tbody>
</table>
<h2>スクリプトレットで取得する書き方</h2>
<p>古い書き方ですが、スクリプトレットでも取得できます。新規実装ではEL式を推奨。</p>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<tbody>
<tr>
<td style="background-color:#000000">
<p><span style="color:#ffffff"><%= request.getContextPath() %></span></p>
</td>
</tr>
</tbody>
</table>
<h2>JSTL の c:url を使う書き方</h2>
<p>JSTLが使える環境では <code><c:url></code> も選択肢です。コンテキストパスが自動補完され、セッションIDのURL書き換え(URL rewriting)にも対応します。</p>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<tbody>
<tr>
<td style="background-color:#000000">
<p><span style="color:#ffffff"><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><br />
<br />
<a href="<c:url value='/user/list' />">ユーザー一覧</a></span></p>
</td>
</tr>
</tbody>
</table>
<h2>取得結果の例</h2>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<thead>
<tr><th>デプロイ状況</th><th>contextPathの値</th></tr>
</thead>
<tbody>
<tr><td>ROOT.war としてデプロイ</td><td><code>""</code>(空文字)</td></tr>
<tr><td>myapp.war としてデプロイ</td><td><code>/myapp</code></td></tr>
<tr><td>独自パス指定 (server.xml)</td><td>指定したパス</td></tr>
</tbody>
</table>
<h2>関連する取得</h2>
<table border="1" cellpadding="1" cellspacing="1" style="width:1000px">
<thead>
<tr><th>取得対象</th><th>書き方</th></tr>
</thead>
<tbody>
<tr><td>コンテキストパス</td><td><code>${pageContext.request.contextPath}</code></td></tr>
<tr><td>リクエストURI</td><td><code>${pageContext.request.requestURI}</code></td></tr>
<tr><td>リクエストURL</td><td><code>${pageContext.request.requestURL}</code></td></tr>
<tr><td>サーバー名</td><td><code>${pageContext.request.serverName}</code></td></tr>
<tr><td>ポート</td><td><code>${pageContext.request.serverPort}</code></td></tr>
<tr><td>プロトコル</td><td><code>${pageContext.request.scheme}</code></td></tr>
</tbody>
</table>
<h2>注意点</h2>
<ul>
<li><strong>絶対パスのスラッシュに注意</strong>: <code>${pageContext.request.contextPath}</code> は先頭にスラッシュを含むので、続けて書く相対パスは <code>/css/...</code> のように <code>/</code> で始める</li>
<li><strong>ROOT配下にデプロイすると空文字</strong>になる。<code>${pageContext.request.contextPath}/css/...</code> は <code>/css/...</code> になり問題ないが、自前で連結処理する場合は注意</li>
<li><strong>リバースプロキシ経由</strong>のときは、外部URLとコンテキストパスがズレることがある</li>
</ul>
<h2>関連</h2>
<ul>
<li>親カテゴリ: <a href="/article/20347">JSP</a></li>
<li>Servlet: <a href="/article/20346">Servlet(サーブレット)</a></li>
<li>JSPタグ: <a href="/article/20377">JSPのタグ一覧</a></li>
</ul>