Java ServletのGenericServletクラスでgetInitParameterNamesメソッドを使う方法を初心者向けに解説
生徒
「サーブレットの初期化パラメータが複数あるとき、設定されている名前をまとめて調べる方法はありますか?」
先生
「そのような場合は、GenericServletクラスで利用できるgetInitParameterNamesメソッドを使います。設定されている初期化パラメータの名前を順番に取り出せます。」
生徒
「名前だけを取得するんですか。値も一緒に取得できますか?」
先生
「まず名前を取得し、その名前をgetInitParameterメソッドに渡すと値も取得できます。二つのメソッドを組み合わせると、すべての初期化パラメータを確認できます。」
1. GenericServletクラスとは
Javaのサーブレットを学習するときは、最初にGenericServletクラスの役割を理解しておくと、サーブレットの基本的な仕組みが分かりやすくなります。GenericServletは、サーブレットを作成するための基本機能をまとめた抽象クラスです。サーブレットコンテナから渡される設定情報を受け取り、初期化処理やログ出力、サーブレット名の取得、初期化パラメータの取得などに利用できる便利なメソッドを持っています。
一般的なウェブアプリケーションでは、HTTP通信を扱うためにHttpServletを継承することが多くあります。ただし、HttpServlet自身もGenericServletを継承しています。そのため、普段HttpServletを使っている場合でも、GenericServletが提供しているgetInitParameterNamesやgetInitParameterなどのメソッドを利用できます。
GenericServletでは、リクエストを処理するためのserviceメソッドが抽象メソッドとして用意されています。そのため、直接GenericServletを継承してサーブレットを作る場合は、serviceメソッドを実装します。初心者の段階では、HTTP専用のHttpServletと、その親クラスにあたるGenericServletの関係を一緒に覚えておくと整理しやすいでしょう。
jakarta.servletを使います。古いJava EE環境や古い教材ではjavax.servletと書かれている場合があります。
2. getInitParameterNamesメソッドとは
getInitParameterNamesメソッドは、そのサーブレットに設定されている初期化パラメータの名前をまとめて取得するためのメソッドです。初期化パラメータとは、サーブレットが動作するときに利用する設定値を、Javaのソースコードへ直接書き込まずに外部から渡すための仕組みです。
例えば、管理者名、表示件数、動作モード、接続先を識別する名前など、環境や運用方法によって変更する可能性がある値を初期化パラメータとして用意できます。設定値そのものを一つ取得したい場合はgetInitParameterを使います。一方、どの初期化パラメータが登録されているのかを一覧で知りたい場合はgetInitParameterNamesを使います。
戻り値はEnumerationという型です。Enumerationは複数の要素を一つずつ順番に取り出すための仕組みで、サーブレットの古くからあるAPIではよく登場します。初期化パラメータが一つも設定されていない場合は、要素を持たない空のEnumerationが返されます。そのため、戻り値が必ず名前を一つ以上持っていると決めつけず、要素があるかを確認しながら処理することが大切です。
Enumeration<String> names = getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
System.out.println(name);
}
この例では、まず初期化パラメータ名の一覧を取得し、hasMoreElementsで次の要素があるかを確認しています。要素が残っている間はnextElementで名前を一つずつ取り出します。初めてEnumerationを見ると難しそうに感じますが、考え方は一覧から順番に値を読む処理です。
3. web.xmlで初期化パラメータを設定する方法
サーブレットの初期化パラメータは、デプロイメント記述子と呼ばれるweb.xmlに設定できます。web.xmlは、サーブレット名、サーブレットクラス、URLマッピング、初期化パラメータなど、ウェブアプリケーションの動作に関する情報を記述する設定ファイルです。
初期化パラメータを設定するときは、対象となるサーブレットの定義内にinit-paramを記述します。パラメータの名前はparam-name、値はparam-valueに指定します。複数の設定値を用意したい場合は、init-paramを複数記述します。
<servlet>
<servlet-name>ConfigServlet</servlet-name>
<servlet-class>com.example.ConfigServlet</servlet-class>
<init-param>
<param-name>adminName</param-name>
<param-value>Tanaka</param-value>
</init-param>
<init-param>
<param-name>displayCount</param-name>
<param-value>20</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ConfigServlet</servlet-name>
<url-pattern>/config</url-pattern>
</servlet-mapping>
この設定では、対象のサーブレットに二つの初期化パラメータが登録されています。getInitParameterNamesを呼び出すと、adminNameとdisplayCountという名前を取得できます。取得できるのはパラメータの名前なので、対応する値まで読みたい場合は、取得した名前をgetInitParameterへ渡します。
初期化パラメータはリクエストパラメータとは別のものです。画面のフォームやURLから送信された値はリクエストパラメータであり、通常はrequest.getParameterで取得します。これに対して初期化パラメータは、サーブレットの設定としてあらかじめ用意しておく値です。名前が似ているため、初心者はここを混同しやすいので注意してください。
4. 初期化パラメータの名前と値をすべて取得する方法
実際の開発では、初期化パラメータの名前だけでなく、その名前に対応する値も一緒に確認したいことがあります。その場合は、getInitParameterNamesとgetInitParameterを組み合わせます。前者で名前を一つずつ取得し、後者にその名前を渡して値を読み取る流れです。
次のサンプルは、GenericServletを直接継承し、登録されている初期化パラメータをすべて画面に表示する例です。serviceメソッドの中で一覧を取得し、名前と値を組み合わせて出力しています。
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
public class ConfigServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = response.getWriter();
Enumeration<String> names = getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = getInitParameter(name);
out.println(name + " = " + value);
}
}
}
先ほどのweb.xmlと組み合わせて実行すると、登録した名前と値が順番に表示されます。表示順は設定を確認する目的で利用する程度に考え、特定の並び順になることを前提に処理を作らないほうが安全です。
adminName = Tanaka
displayCount = 20
このように、getInitParameterNamesは設定項目を動的に走査したいときに便利です。設定項目が増えても、Javaコード側で一つずつ名前を固定して書く必要がありません。特にデバッグ用の確認画面や、サーブレット起動時の設定確認などで考え方を応用できます。
5. WebServletアノテーションで設定する方法
Java Servletでは、web.xmlを使わず、WebServletアノテーションでサーブレットを登録する方法もあります。初期化パラメータはWebInitParamを使って指定できます。設定方法が変わっても、サーブレットから値を取得するときはgetInitParameterNamesとgetInitParameterを同じように利用できます。
次の例では、サイト名と表示言語を初期化パラメータとして設定しています。サーブレットの設定とJavaクラスを近い場所で確認できるため、小規模な学習用プログラムでは処理の関係を追いやすい書き方です。
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
@WebServlet(
urlPatterns = "/site-config",
initParams = {
@WebInitParam(name = "siteName", value = "Java Guide"),
@WebInitParam(name = "language", value = "Japanese")
}
)
public class SiteConfigServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain; charset=UTF-8");
PrintWriter out = response.getWriter();
Enumeration<String> names = getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
out.println(name + " : " + getInitParameter(name));
}
}
}
アノテーションを使う場合でも、初期化パラメータはサーブレット単位の設定として扱われます。あるサーブレットに設定した初期化パラメータを、別のサーブレットのgetInitParameterで当然に取得できるわけではありません。アプリケーション全体で共有したい設定との違いを意識しておくことが重要です。
サーブレット単位の初期化パラメータはServletConfigと深く関係しています。GenericServletのgetInitParameterNamesは、内部的にはサーブレットが保持している設定情報からパラメータ名を取得するための便利なメソッドです。利用者は毎回ServletConfigを明示的に取り出さなくても、継承したメソッドとして簡潔に呼び出せます。
6. Enumerationの扱い方を初心者向けに理解する
getInitParameterNamesを理解するうえで、初心者がつまずきやすいのがEnumerationです。Javaでは複数のデータを扱う方法として配列やListがよく使われますが、Servlet APIの一部ではEnumerationが戻り値として使われています。
Enumerationでは、次の要素が存在するかをhasMoreElementsで確認し、存在する場合にnextElementで一つ取り出します。この二つをwhile文と組み合わせるのが基本形です。最後の要素まで読み終えるとhasMoreElementsが偽になり、繰り返しが終了します。
一覧として扱いたい場合は、Collections.listを利用してListへ変換する方法もあります。普段から拡張for文に慣れている場合は、こちらのほうが読みやすいことがあります。
import java.util.Collections;
import java.util.List;
List<String> names =
Collections.list(getInitParameterNames());
for (String name : names) {
System.out.println(name);
}
ただし、単純に一度だけ順番に読み取るのであれば、無理にListへ変換する必要はありません。Servlet APIのサンプルや既存システムを読むときにはEnumerationの形を目にすることがあるため、hasMoreElementsとnextElementの役割を覚えておくと役立ちます。
7. getInitParameterNamesと似たメソッドの違い
サーブレットには名前の似たメソッドが複数あるため、何のパラメータを取得しているのかを整理しておきましょう。getInitParameterNamesはサーブレットの初期化パラメータ名を取得します。これに対して、request.getParameterNamesは利用者から送られたリクエストパラメータの名前を取得します。メソッド名は似ていますが、データの出どころが異なります。
例えばログイン画面から送られるユーザー名や検索フォームに入力されたキーワードは、リクエストごとに変化するデータです。このような値はServletRequestやHttpServletRequestから取得します。一方、画面の最大表示件数やサーブレット固有の動作モードのように、起動時から設定されている値は初期化パラメータとして扱えます。
また、サーブレット単位ではなくウェブアプリケーション全体で共有する初期化パラメータは、ServletContextから取得します。サーブレット固有の設定なのか、アプリケーション全体の設定なのかによって取得元が変わるため、設計時に区別することが重要です。
| 目的 | 主な取得方法 | 値のイメージ |
|---|---|---|
| サーブレット固有の初期化設定 | getInitParameterNames |
表示件数や動作モード |
| 利用者から送信された入力値 | request.getParameterNames |
氏名や検索キーワード |
| アプリケーション全体の初期化設定 | ServletContextのメソッド |
共通の設定値 |
初心者のうちは、パラメータという言葉だけを見ると全部同じに感じやすいですが、どこで設定された値なのかを考えると判断しやすくなります。サーブレットの設定なら初期化パラメータ、利用者の入力ならリクエストパラメータというように、値の役割から整理してください。
8. 実務で利用するときの注意点
getInitParameterNamesは、登録済みの初期化パラメータをまとめて確認できる便利なメソッドですが、取得した値をどのように使うかにも注意が必要です。まず、初期化パラメータの値は文字列として扱われます。表示件数などの数値として利用したい場合は、取得後に整数へ変換する処理が必要です。
次に、設定値が必ず存在するとは限りません。特定の名前を指定してgetInitParameterを呼び出したとき、その名前が設定されていなければ値を取得できません。必須の設定であれば、サーブレットの初期化時に存在を確認し、不足している場合に分かりやすいエラーを出す設計にすると原因を調査しやすくなります。
また、パスワードや秘密鍵などの重要な情報を、学習用の簡単な例と同じ感覚でそのまま画面へ表示しないようにしてください。getInitParameterNamesを使って全設定を一覧表示する処理は学習には便利ですが、実際の運用環境では公開してよい情報かどうかを確認する必要があります。設定確認用の機能を作る場合でも、利用できる人を限定するなどの配慮が必要です。
さらに、現在のServlet開発ではjakarta.servletパッケージを利用する環境が中心ですが、古いプロジェクトではjavax.servletが使われていることがあります。インターネット上のサンプルコードをそのままコピーすると、利用しているServlet APIの世代によってはインポート文が合わず、コンパイルエラーになることがあります。プロジェクトで利用しているサーバーや依存関係を確認して、パッケージ名を合わせてください。
GenericServletとgetInitParameterNamesを学ぶと、サーブレットが単にリクエストを受け取ってレスポンスを返すだけではなく、サーブレットコンテナから設定情報を受け取って動作していることも見えてきます。初期化パラメータ名の一覧取得、値の取得、ServletConfigとの関係まで理解しておくと、Java Servletの設定処理や既存コードを読むときに役立ちます。
まとめ
Java ServletのGenericServletクラスとgetInitParameterNamesメソッドを理解すると、サーブレットがどのように設定情報を受け取り、その設定を処理の中で利用しているのかが見えやすくなります。サーブレットは、利用者から送信されたリクエストを受け取ってレスポンスを返すだけの仕組みではありません。サーブレットコンテナから初期化情報を受け取り、その内容を利用しながら処理を行うこともできます。初期化パラメータは、そのために利用できる代表的な仕組みの一つです。
GenericServletは、Servlet APIで利用される基本的な抽象クラスです。HTTP通信を扱う一般的なウェブアプリケーションではHttpServletを継承してサーブレットを作成することが多いため、初心者の学習ではGenericServletを直接使う機会が少ないこともあります。しかし、HttpServletはGenericServletを継承しているため、GenericServletが持っている便利な機能はHttpServletからも利用できます。この継承関係を知っておくと、サーブレットのクラス構造を理解するときに役立ちます。
初期化パラメータの名前をまとめて取得する
getInitParameterNamesメソッドの役割は、対象となるサーブレットに設定されている初期化パラメータの名前を一覧として取得することです。例えば、表示件数、管理者名、動作モード、画面表示に関する設定などを初期化パラメータとして登録している場合、それぞれの名前を順番に調べることができます。特定の初期化パラメータだけを取得したい場合はgetInitParameterを使いますが、設定されている項目をまとめて調べたい場合はgetInitParameterNamesが便利です。
この二つのメソッドは一緒に使われることが多くあります。まずgetInitParameterNamesでパラメータ名を一つずつ取得し、その名前をgetInitParameterへ渡すことで、名前と値を組み合わせて確認できます。設定項目が増えた場合でも、Javaのソースコード側にすべての名前を固定して書く必要がないため、設定内容の一覧表示や動作確認にも応用できます。
Enumerationの基本的な読み方を覚える
getInitParameterNamesの戻り値はEnumerationです。Java初心者にとっては少し見慣れない型ですが、考え方は複数の要素を先頭から一つずつ取り出す仕組みです。次の要素が残っているかをhasMoreElementsで確認し、要素がある場合はnextElementで取り出します。この処理をwhile文で繰り返すことで、登録されている初期化パラメータ名をすべて読み取れます。
初期化パラメータが設定されていない場合は、要素を持たないEnumerationになります。そのため、必ず一つ以上の設定が存在すると考えるのではなく、要素があるかを確認しながら処理する書き方を身につけることが大切です。Servlet APIではEnumerationが使われる場面がほかにもあるため、この機会に基本的な扱い方を覚えておくと、既存のサーブレットプログラムを読むときにも役立ちます。
Enumeration<String> names = getInitParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = getInitParameter(name);
System.out.println(name + " = " + value);
}
このサンプルでは、最初に初期化パラメータ名の一覧を取得しています。繰り返し処理の中で名前を一つ取り出し、その名前を使って値を取得しています。処理の流れを言葉で表すと、名前の一覧を取得する、次の名前があるか確認する、名前を一つ取り出す、その名前に対応する値を取得する、という順番になります。初心者はコードを一行ずつ暗記するよりも、この処理の流れを理解しておくと応用しやすくなります。
web.xmlとアノテーションのどちらでも利用できる
サーブレットの初期化パラメータは、web.xmlに記述する方法と、WebServletやWebInitParamなどのアノテーションを利用してJavaクラス側に記述する方法があります。設定する場所は異なりますが、サーブレットから初期化パラメータを取得するときの考え方は同じです。どちらの方法でも、getInitParameterNamesで名前を取得し、getInitParameterで値を取得できます。
古いJava Servletの教材や既存システムではweb.xmlによる設定を見かけることが多く、比較的新しい学習用のサンプルではアノテーションによる設定もよく使われます。そのため、どちらか片方だけを覚えるのではなく、設定方法が違っても初期化パラメータという仕組み自体は同じであることを理解しておくとよいでしょう。既存システムの保守や改修を行うときにも、この知識が役立ちます。
ServletConfigとの関係を理解する
初期化パラメータはServletConfigと深く関係しています。サーブレットコンテナは、対象となるサーブレットの設定情報をServletConfigとして管理します。GenericServletはその設定情報を扱いやすくするためのメソッドを提供しているため、開発者は毎回複雑な処理を書かなくてもgetInitParameterNamesやgetInitParameterを直接利用できます。
ここで大切なのは、サーブレット固有の初期化パラメータと、ウェブアプリケーション全体で共有する設定を区別することです。サーブレットごとの設定はServletConfigに関係し、アプリケーション全体で共有する設定はServletContextから取得します。どの範囲で使う設定なのかを意識すると、サーブレットのスコープや設定情報の管理方法を理解しやすくなります。
リクエストパラメータとの違いを整理する
Java Servletを学び始めたときに混同しやすいのが、初期化パラメータとリクエストパラメータです。初期化パラメータは、サーブレットの動作に必要な設定として事前に登録しておく値です。一方、リクエストパラメータは、利用者がフォームへ入力した内容やURLに付けられた値など、リクエストごとに送信されるデータです。
例えば、一覧画面に表示する最大件数を設定しておきたい場合は初期化パラメータが候補になります。検索画面で利用者が入力した検索キーワードを取得したい場合はリクエストパラメータを使います。名前にパラメータという共通した言葉が含まれていても、値がどこから来るのか、いつ設定されるのか、どの範囲で利用されるのかが異なります。この違いを理解すると、getInitParameterNamesとrequest.getParameterNamesを使い分けやすくなります。
実務では設定値の扱いにも注意する
初期化パラメータから取得した値は文字列として扱われます。そのため、表示件数のような数値として利用する場合は、必要に応じて整数へ変換します。また、設定されているはずの値が存在しない場合も考えて処理する必要があります。必須設定であれば、サーブレットの初期化時に値を確認し、不足しているときに原因が分かるようにする設計も重要です。
さらに、設定情報の一覧を画面へ表示する処理をそのまま本番環境へ公開するのは避けるべきです。学習では値を確認するために表示すると理解しやすいですが、実際のシステムでは設定内容に公開すべきでない情報が含まれる可能性があります。特に認証情報や秘密情報を扱う場合は、設定方法そのものも含めて安全性を考える必要があります。
現在のJakarta Servletではjakarta.servletパッケージが使われますが、古いJava EEのプロジェクトではjavax.servletが使われています。インターネットでServletのサンプルコードを調べると両方が見つかるため、利用している環境に合わせてインポート文を確認することも大切です。パッケージ名が異なっていても、GenericServletや初期化パラメータの基本的な考え方を理解していれば、コードの意味を読み取りやすくなります。
Java ServletのGenericServletとgetInitParameterNamesを学ぶと、サーブレットの継承関係、初期化パラメータ、Enumeration、ServletConfig、ServletContext、リクエストパラメータなど、Servlet APIのさまざまな要素がつながって理解できるようになります。単独のメソッドとして暗記するのではなく、サーブレットコンテナが設定を読み込み、サーブレットへ渡し、Javaプログラムがその設定を取得して利用するという一連の流れとして理解することが、Servlet初心者が基礎を身につける近道です。
生徒
「getInitParameterNamesは、初期化パラメータの値を直接まとめて取得するメソッドではなく、まず名前を一覧で取得するメソッドなんですね。」
先生
「その通りです。取得した名前をgetInitParameterへ渡せば、それぞれの値も確認できます。名前の一覧取得と値の取得を分けて考えると分かりやすいですね。」
生徒
「戻り値がEnumerationなので、hasMoreElementsで確認してからnextElementで取り出すんですね。」
先生
「はい。Servlet APIではEnumerationを見ることがあるので、この基本形を覚えておくとほかのコードを読むときにも役立ちます。」
生徒
「初期化パラメータと、フォームから送られるリクエストパラメータは別物という点も大事ですね。」
先生
「そこは重要です。サーブレットの設定として用意する値なのか、利用者がリクエストごとに送る値なのかを考えると、どのメソッドを使えばよいか判断しやすくなります。」
生徒
「GenericServletを直接使わない場合でも、HttpServletが継承しているので、この知識は無駄にならないんですね。」
先生
「その通りです。クラスの継承関係まで含めて理解しておくと、Servletの設定処理や既存システムのコードが読みやすくなります。初期化パラメータを扱うときは、設定する場所、取得する範囲、値の用途まで一緒に確認する習慣をつけておきましょう。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
JavaのServletで初期化パラメータを一覧で取得するにはどうすればいいですか?
JavaのServletで初期化パラメータを一覧で取得するには、GenericServletクラスに用意されているgetInitParameterNamesメソッドを使用します。このメソッドを使うことで、Servletに定義されたすべての初期化パラメータ名をEnumerationで取得できます。
getInitParameterNamesメソッドは何を返すのですか?
getInitParameterNamesメソッドは、Servletに定義されたすべての初期化パラメータの名前を列挙するEnumeration型のオブジェクトを返します。これにより、すべてのパラメータ名をループ処理で取得できます。
Servletの初期化パラメータとは何ですか?
Servletの初期化パラメータとは、web.xmlファイルなどで設定される、Servlet起動時に渡す設定値のことです。例えば、データベース名やバージョンなどの情報が含まれます。
ChatGPTなどの生成AIをこれから学びたい方に向けて、AIスキルアカデミーの口コミ・評判、料金、無料セミナーの内容を詳しくまとめています。
AIスキルアカデミーの口コミ・評判を詳しく見る