Jakarta EE 10 の学習 - サーブレットアプリ 2 -

記事
IT・テクノロジー
前の記事で作成したアプリのソースコードなどの中身を詳しく理解する。

ウェブアプリケーションのディレクトリ構成

その前に、ウェブアプリのディレクトリ構成についてのルールを確認しておく。
tree.png

ディレクトリのルート(SimpleServlet/ ) がドキュメントルートとなり、基本的にはこの下に置かれたファイルが公開の対象となる。
WEB-INF ディレクトリはこの例外であり、公開対象となるのは WEB-INF/lib ディレクトリの中に置かれた JAR ファイルのMETA-INF/resources ディレクトリに含まれるファイルだけである。
従って、公開対象でないファイルは全てこの WEB-INF ディレクトリ中に格納することになる。
サーブレットやそれ以外のクラスファイル(.class) は WEB-INF/classes ディレクトリに置く。(または WEB-INF/lib 内の JAR ファイルに含める)

web.xml ファイル

Jakarta EE アプリケーションをデプロイする際の設定を定める XMLファイルを"デプロイメント デスクリプタ(Deployment Descriptor)" という。
ウェブアプリケーションの場合は web.xml ファイルを使う。今使用している web.xml の中で使われているエレメントをそれぞれ簡単に確認する。

<web-app>: ウェブアプリケーションで使うルートエレメント
<servlet>: サーブレットの定義
  <servlet-name>: サーブレットの名前
  <servlet-class>: サーブレットのクラス名
<servlet-mapping>:
  <servlet-name>: サーブレットの名前
  <url-pattern>: 指定サーブレットにマップするURLパスを設定
<welcome-file-list>: welcome-file サブエレメントのリストを含める
<welcome-file>: マップが指定されていないディレクトリへアクセスしたときにレスポンスとして使用するファイルを指定(リストの上が優先)

最後のウェルカムファイルの設定は少し分かりにくいので後述する。

ウェブアプリのURL の決まり方

ウェブアプリのサーブレットへアクセスするときのURL は下記のように決まる。
ホスト:ポート/コンテキストルート/サーブレットマッピングURLパターン

コンテキストルートはデフォルトではアプリのディレクトリ名(WARファイルの場合は拡張子.war を除くファイル名)となり、後ろのサーブレットマッピングURLパターンは web.xml で指定できる(今は / に設定している)。

従ってこのアプリのサーブレットのURL は下記のようになっている。
localhost:8080/SimpleServlet/

Java ソースファイル

SimpleServlet.java の内容を見てみる。
ここでは SimpleServlet クラスを HttpServlet クラスを継承して定義している。

Jakarta サーブレットの API に含まれるクラスで、このソースファイルでインポートして使用しているものを整理すると、
・jakarta.servlet.http パッケージから
HttpServletRequest, HttpServletResponse, HttpServlet の各クラス

・jakarta.servlet パッケージから
ServletException クラス

親クラスの HttpServlet クラスは Servlet インターフェイスを実装しており、これにより継承クラス SimpleSevlet クラスはサーブレットとして機能できるようになる。

init() メソッドは最初にリクエストを受け取ったときにサーブレットを初期化するために使われる。
doGet() は名前が示す通り HTTP GETメソッドリクエストに対する処理のために呼ばれる。引数である HttpServletResponse オブジェクトにサーブレットが返すレスポンスデータが含まれる。
ここではHttpServletResponseオブジェクトの setContentType() メソッドでContent-Type の設定と、getWriter() でPrintWriter オブジェクトを取得を行っていることが分かる。 取得したPrintWriter オブジェクトには printf() メソッドで HTML コードを出力している。
HTML コードの中に request.getContextPath() を変数として含めているが、これはサーブレットのコンテキストルートを示す文字列でデフォルトではアプリケーションのディレクトリ名を使って "/SimpleServlet" となる。

要するに、このサーブレットに対して GET リクエストを送信すると、レスポンスとして doGet() で定義した HTML コードが返される、ということ。

サーブレットオブジェクトの生成、メソッド呼び出しはサーブレットコンテナが自動で行ってくれるので、サーブレットクラスの定義をするだけで良い。

静的ファイル(index.html) の使用

サーブレットとは別に静的ファイルの表示を試してみる。アプリケーションに Hello/index.html を加えてディレクトリ構成を下記のようにする。
modified.png

web.xml の値を下記のように2つ変更する。
<servlet-mapping> の <url-pattern> サブエレメントの値を /servlet に、
<welcome-file-list> の <welcome-file> サブエレメントの値を index.html にする

アプリケーションをデプロイし、 localhost:8080/SimpleServlet/Hello にアクセスするとindex.html ページが表示される。
Hello.png
ウェルカムファイルをindex.html に設定しているので、Hello ディレクトリにアクセスしたときにはこの index.html ファイルが使われる、ということがポイント。
補足: デフォルトで index.html, index.htm, index.jsp ファイルがウェルカムファイルとして設定されているので、web.xml で指定しなくても index.html は表示される。 これら以外のファイルを使用したいときには web.xml で指定すれば設定が上書きされる。
(例えば <welcome-file>index2.html</welcome-file> とすれば index2.html が表示される)

サーブレットページは localhost:8080/SimpleServlet/servlet  でアクセスできる。

参考資料:

・Jakarta サーブレットの仕様や、web.xml ファイルの内容については
URL: jakarta.ee/specifications/servlet/6.0/ にある "Jakarta Servlet 6.0 Specification Document"
URL: glassfish.org/documentation/ にある "application-development-guide.pdf"

・XML スキーマについては
URL: jakarta.ee/xml/ns/jakartaee/#10
(ここからダウンロードできる web-app_6_0.xsd ファイルの中身の記述も参考になる)

・サーブレットAPI のリファレンスは
URL: jakarta.ee/specifications/servlet/6.0/apidocs/jakarta.servlet/module-summary.html

コメント: 記事内の情報は著者が個人的に調べた範囲で理解しているものです。必要に応じて訂正する場合があります。

著者・投稿者: ENARTS05
編集履歴:
2023/9/29 作成
2023/9/30 ウェルカムファイルのデフォルト設定について補足を追記
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す