コンテキストパス
7.2 コンテキストパス
本節ではWebアプリケーションの画面の移動で利用されるコンテキストパスについて学習していきます。
7.2.1 コンテキストパスとは
2.2.3項で紹介しましたが、プログラムを表示する際のURLは次のような構成になります。
図 7.2.1: コンテキストルートとコンテキストパス
Webサーバは、Webアプリケーションをコンテキストと呼ばれる単位で管理しており、WebアプリケーションのURLのことをコンテキストルートとも呼びます。また、Webサーバから見たコンテキストルートまでのパスのことをコンテキストパスと呼びます。上記の図のURLでは「/web_basic」の部分がコンテキストパスとなっており、Tomcatの設定がデフォルトの状態のときは、Webアプリケーションのプロジェクト名の頭に「/」(スラッシュ)を付けたパスとなります。
7.2.2 Webアプリケーションのパスの取得
Webアプリケーションの画面の移動は相対パスを指定して行われるのが一般的ですが、単純にファイルからファイルへの相対パスを指定するわけではなく、getContextPath()メソッドを利用してWebアプリケーションのパスを取得し、そこからの相対パスで行われます。
まずは以下のプログラムを作成し、Webアプリケーションのパスの取得方法について学習します。また、記述された相対パスがどのようなURLとして実行されているのかもあわせて確認します。
Webアプリケーションのパスを取得するプログラム
JSPファイル内に3つのリンクを作成します。1つはサーバルートへリンクする特殊な記述で、残りの2つは2章で作成したウェルカムファイルへのリンクです。ウェルカムファイルへのリンクは、専用のメソッドを利用したリンクと通常の相対パスを利用したリンクの2パターンです。各々のリンク先がどのようなURLとして実行されるのかを確認してみましょう。
実行結果
アプリケーション構成
➢ getContext.jsp① 親フォルダの入力または選択 :web_basic/view/ch07
② ファイル名 :getContext.jsp
③ アクセスURL :http://localhost:8080/web_basic/view/ch07/getContext.jsp
<%@page contentType= "text/html; charset=UTF-8" %> <html> <head> <title>Webアプリのパスを取得するJSP</title> </head> <body> <p><a href="/">サーバルート(/)によるリンク</a></p> <p><a href="<%= request.getContextPath() %>">コンテキストパスによるリンク</a></p> <p><a href="../../">相対パスによるリンク</a></p> </body> </html>
解説
このプログラムでは、リンク先のパスに「/(スラッシュ)」のみを記述した場合に対応するURLと、request.getContextPath()メソッドで取得できる文字列、及びその対応するURLがどのようになっているかが重要です。
まず初めに、リンク先のパスに「/(スラッシュ)」のみを記述した場合です。スラッシュから始まるパスは通常のパスとは異なり、サーバのルートからのURLを表します。そのため、リンク先のパスにスラッシュのみを記述した場合、サーバのルートである「http://localhost:8080/」を指します。実行結果からもわかるようにTomcatサーバのページが表示されます。
図 7.2.2: リンクに「/」のみを記述する場合のURL
次に、request.getContextPath()メソッドを利用した場合です。このメソッドは、コンテキストパスと呼ばれるパスを取得することができます。getContextPath()メソッドを呼び出すオブジェクトとして利用しているrequest変数は、5.1.2節で触れたout変数と同じ暗黙オブジェクトで、JSPでは宣言を行わずに利用することができる変数です。
ブラウザからソースを確認してみると、コンテキストパスは「/web_basic」となっているのが分かります。
図 7.2.3: コンテキストパスの確認
このコンテキストパスは、Webアプリケーションの名前の前にスラッシュを付けた文字列となっていて、サーバのルートとWebアプリケーションの名前をつなげたURL「http://localhost:8080/web_basic」を指します。その結果、2章で作成したウェルカムファイルが表示されます。
図 7.2.4: getContextPath()を利用したURL
表 7.2.1
また、相対パスでは、ファイルが別のフォルダに移動されるとパスの書き換えが必要になりますが、getContextPath()メソッドを利用すると、呼び出し元のファイルの位置は気にせずに、サーバのルートから相対パスを指定することができるので、移動先が同じリンクであれば全てのファイルで同じ記述ができます。
試しに、今回作成したgetContext.jspを以下の「sub」フォルダに移動して実行してみましょう。
図 7.2.5: getContext.jspの移動
移動後にプログラムを実行するには、ブラウザに以下のURLを指定します。
http://localhost:8080/web_basic/view/ch07/sub/getContext.jsp
リンクの動きを確認すると、相対パスで記述したリンクだけが404エラーになっていることがわかります。
図 7.2.6: getContext.jspの移動後の実行結果
このように、呼び出し元のファイルの位置は気にせずに、サーバのルートから相対パスを指定することができるので、Webアプリケーションのパスの指定には、request.getContextPath()メソッドがよく利用されます。
ポイント
パスの最初に「/」がつくとサーバルートからのパスになる。 getContextPathを利用すると特定のファイルへのパスが全て同じ記述で行える。
7.2.3 Tomcatプロジェクトのコンテキスト名の確認
本章で利用したコンテキストパスは「/web_basic」となっていました。このコンテキストパスはTomcatプロジェクトを作成した際に定義されます。Tomcatの設定がデフォルトの状態であれば、プロジェクト名の頭に「/」(スラッシュ)を付けたパスとなります。
では、web_basicプロジェクトのコンテキストパスの設定を見てみましょう。
① Tomcatプロジェクトのプロパティを表示
web_basicプロジェクトを右クリックし、表示された一覧の中から「プロパティ」を選択します。するとweb_basicのプロパティ画面が表示されます。
図 7.2.7: web_basicのプロパティー画面の表示
② コンテキスト名の確認
表示されたプロパティ画面の左にある一覧から「Tomcat」を選択すると、Tomcatの設定の中にコンテキスト名を確認することができます。このコンテキスト名がgetContextPathを利用した際に取得されます。
図 7.2.8: 新規フォルダ作成画面
Tomcatプロジェクトのコピーによるコンテキスト名の不一致についてコンテキスト名はTomcatプロジェクトの作成時に設定されます。そのため、プロジェクトをコピーして別の名前に変更しても、コンテキスト名は元のプロジェクトのままになってしまいます。
このように、プロジェクト名とコンテキスト名が違う状態になってしまうと、プログラムを実行できないなどの不具合が発生します。Tomcatプロジェクトを作る場合は既存のプロジェクトはコピーせず、新規に作成するようにしましょう。