3.2 コンテキストパス

3.2 コンテキストパス

本節ではWebアプリケーションの画面の移動で利用されるコンテキストパスについて学習していきます。

3.2.1 コンテキストパスとは

プログラムを表示する際のURLは次のような構成になります。

上記の構成で、目的のファイルの位置を指定しています。

① サーバー名

接続先のサーバー名です。接続元のPCと接続先のサーバーが同一の場合は、「localhost」を指定します。
ドメイン(○○.comのような文字列)の代わりに、IPアドレスを指定することもできます。

② ポート番号

サーバーに接続するためのIPアドレスの下に設けられたサブ(補助)アドレスです。
Tomcatを利用する場合、デフォルトでは「8080」を指定する設定になっています。

③ プロジェクト名

Eclipseで作成したプロジェクトの名前です。
動的Webプロジェクトを作成した際に「コンテキストパス」として登録されます。

④ フォルダ名

表示するファイルが格納されているフォルダの名前です。ファイルがサブフォルダに格納されている場合は、
「フォルダ名/サブフォルダ名/ファイル名」といったように、全てのフォルダを「/」で区切って指定します。

⑤ ファイル名

表示するファイルの名前です。

Webサーバーは、Webアプリケーションをコンテキストと呼ばれる単位で管理しており、WebアプリケーションのURLのことをコンテキストルートとも呼びます。
また、Webサーバーから見たコンテキストルートまでのパスのことをコンテキストパスと呼びます。先程の図のURLでは「/web_basic」の部分がコンテキストパスとなっており、Tomcatの設定がデフォルトの状態のときは、Webアプリケーションのプロジェクト名の頭に「/」(スラッシュ)を付けたパスとなります。

Webアプリケーションの画面の移動は相対パスを指定して行われるのが一般的ですが、単純にファイルからファイルへの相対パスを指定するわけではなく、getContextPath()メソッドを利用してWebアプリケーションのパスを取得し、そこからの相対パスでファイルを指定することで画面遷移をすることが多いです。

3.2.2 Webアプリケーションのパスの取得

Webアプリケーションの画面の移動は相対パスを指定して行われるのが一般的ですが、単純にファイルからファイルへの相対パスを指定するわけではなく、getContextPath()メソッドを利用してWebアプリケーションのパスを取得し、そこからの相対パスで行われます。
まずは以下のプログラムを作成し、Webアプリケーションのパスの取得方法について学習します。また、記述された相対パスがどのようなURLとして実行されているのかもあわせて確認します。

Webアプリケーションのパスを取得するプログラム

サーブレットで3つのリンクを出力します。1つはサーバールートへリンクする特殊な記述で、残りの2つは先程作成したbeforeLink.htmlへのリンクです。beforeLink.htmlへのリンクは、コンテキストパスを指定するメソッドを利用したリンクと通常の相対パスを利用したリンクの2パターンです。各々のリンク先がどのようなURLとして実行されるのかを確認してみましょう。

① ソース・フォルダ: web_basic/src/main/java
② パッケージ: ch03
③ 名前: GetContext
④ スーパークラス: jakarta.servlet.http.HttpServlet
⑤ アクセスURL: http://localhost:8080/web_basic/GetContext

GetContext.java

package ch03;

import java.io.IOException;
import java.io.PrintWriter;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/GetContext")
public class GetContext extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //画面の出力
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<p><a href=\"/\">サーバルート(/)によるリンク</a></p>");
        out.println("<p><a href=\"" + request.getContextPath() + "/ch03/beforeLink.html\">コンテキストパスによるリンク</a></p>");
        out.println("<p><a href=\"./ch03/beforeLink.html\">相対パスによるリンク</a></p>");
        
    }

}

解説

このプログラムでは、リンク先のパスに「/(スラッシュ)」のみを記述した場合に対応するURLと、request.getContextPath()メソッドで取得できる文字列、及びその対応するURLがどのようになっているかが重要です。
GetContext,javaを実行して表示される画面を右クリックして「ページのソースを表示」を選択すると、以下のように出力されていることが分かります。

サーブレットによって出力されたHTML

1: <p><a href="/">サーバルート(/)によるリンク</a></p>
2: <p><a href="/web_basic/ch03/beforeLink.html">コンテキストパスによるリンク</a></p>
3: <p><a href="./ch03/beforeLink.html">相対パスによるリンク</a></p>

リンクの表記についてはこちらの方がわかりやすいので、上記出力結果を元に解説を進めます。
まず初めに、リンク先のパスに「/(スラッシュ)」のみを記述した場合です。スラッシュから始まるパスは通常のパスとは異なり、サーバーのルートからのURLを表します。そのため、リンク先のパスにスラッシュのみを記述した場合、サーバーのルートである「http://localhost:8080/」を指します。今回はサーバールート用のWebページは用意していないので、実行結果からもわかるように404のページが表示されます。

1: <p><a href="/">サーバルート(/)によるリンク</a></p>

次に、request.getContextPath()メソッドを利用した場合です。このメソッドは、コンテキストパスと呼ばれるパスを取得することができます。
GetContext.java内では21行目で出力する際にgetContextPath()メソッドを使用しています。

21: out.println("<p><a href=\"" + request.getContextPath() + "/ch03/beforeLink.html\">コンテキストパスによるリンク</a></p>");

出力後は、request.getContextPath()が書かれていた位置にコンテキストパスとして「/web_basic」が出力されています。

2: <p><a href="/web_basic/ch03/beforeLink.html">コンテキストパスによるリンク</a></p>

このコンテキストパスは、Webアプリケーションの名前の前にスラッシュを付けた文字列となっていて、サーバーのルートとWebアプリケーションの名前をつなげたURL「http://localhost:8080/web_basic」を指します。その結果、2章で作成したウェルカムファイルが表示されます。

また、相対パスで表記すると、ファイルが別のフォルダに移動してしまうとパスの書き換えが必要になりますが、getContextPath()メソッドを利用すると、呼び出し元のファイルの位置は気にせずに、サーバーのルートから相対パスを指定することができるので、移動先が同じリンクであれば全てのファイルで同じ記述ができます。

ポイント
  • パスの最初に「/」がつくとサーバールートからのパスになる。
  • getContextPathを利用すると特定のファイルへのパスが全て同じ記述で行える。

NEXT>> 3.3 本章のまとめ