コンテキストとサーブレットの初期化パラメータ
1. 概要
サーブレットは、サーブレットコンテナで実行されるプレーンなJavaクラスです。
HTTPサーブレット(特定のタイプのサーブレット)は、JavaWebアプリケーションの第一級市民です。 HTTPサーブレットのAPIは、クライアントサーバープロトコルに実装されている、一般的な要求-処理-応答サイクルを通じてHTTP要求を処理することを目的としています。
さらに、サーブレットは、要求/応答パラメーターの形式のキーと値のペアを使用して、クライアント(通常はWebブラウザー)とサーバー間の相互作用を制御できます。
これらのパラメーターは、初期化して、アプリケーション全体のスコープ(コンテキストパラメーター)およびサーブレット固有のスコープ(サーブレットパラメーター)にバインドできます。
このチュートリアルでは、コンテキストとサーブレットの初期化パラメータを定義してアクセスする方法を学習します。
2. サーブレットパラメータの初期化
アノテーションと標準のデプロイメント記述子(“ web.xml” ファイル)を使用して、サーブレットパラメータを定義および初期化できます。 これらの2つのオプションは相互に排他的ではないことに注意してください。
これらの各オプションについて詳しく見ていきましょう。
2.1. 注釈の使用
アノテーションを使用してサーブレットパラメータを初期化すると、構成とソースコードを同じ場所に保持できます。
このセクションでは、アノテーションを使用して特定のサーブレットにバインドされる初期化パラメータを定義してアクセスする方法を示します。
そのために、プレーンなHTMLフォームを介してユーザーデータを収集するnaive UserServletクラスを実装します。
まず、フォームをレンダリングするJSPファイルを見てみましょう。
<!DOCTYPE html>
<html>
<head>
<title>Context and Initialization Servlet Parameters</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Please fill the form below:</h2>
<form action="${pageContext.request.contextPath}/userServlet" method="post">
<label for="name"><strong>Name:</strong></label>
<input type="text" name="name" id="name">
<label for="email"><strong>Email:</strong></label>
<input type="text" name="email" id="email">
<input type="submit" value="Send">
</form>
</body>
</html>
EL (式言語)を使用して、フォームのaction属性をコーディングしたことに注意してください。 これにより、サーバー内のアプリケーションファイルの場所に関係なく、常に“ / userServlet”パスを指すことができます。
“ $ {pageContext.request.contextPath}” 式は、フォームの動的URLを設定します。これは、常にアプリケーションのコンテキストパスに相対的です。
最初のサーブレットの実装は次のとおりです。
@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"}, initParams={
@WebInitParam(name="name", value="Not provided"),
@WebInitParam(name="email", value="Not provided")}))
public class UserServlet extends HttpServlet {
// ...
@Override
protected void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
forwardRequest(request, response, "/WEB-INF/jsp/result.jsp");
}
protected void processRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", getRequestParameter(request, "name"));
request.setAttribute("email", getRequestParameter(request, "email"));
}
protected void forwardRequest(
HttpServletRequest request,
HttpServletResponse response,
String path)
throws ServletException, IOException {
request.getRequestDispatcher(path).forward(request, response);
}
protected String getRequestParameter(
HttpServletRequest request,
String name) {
String param = request.getParameter(name);
return !param.isEmpty() ? param : getInitParameter(name);
}
}
この場合、 initParamsと@WebInitParamアノテーションを使用して、nameとemailの2つのサーブレット初期化パラメーターを定義しました。
HttpServletRequestのgetParameter()メソッドを使用してHTMLフォームからデータを取得し、 getInitParameter()メソッドを使用してサーブレットの初期化パラメーターにアクセスしていることに注意してください。
getRequestParameter()メソッドは、nameおよびemail要求パラメーターが空の文字列であるかどうかを確認します。
空の文字列の場合、一致する初期化パラメータのデフォルト値が割り当てられます。
doPost()メソッドは、最初に、ユーザーがHTMLフォーム(存在する場合)に入力した名前と電子メールを取得します。 次に、リクエストパラメータを処理し、リクエストを“ result.jsp”ファイルに転送します。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Data</title>
</head>
<body>
<h2>User Information</h2>
<p><strong>Name:</strong> ${name}</p>
<p><strong>Email:</strong> ${email}</p>
</body>
</html>
サンプルWebアプリケーションをApacheTomcat、 Oracle GlassFish 、 JBoss WidlFly などのアプリケーションサーバーにデプロイして実行すると、最初にHTMLフォームページ。
ユーザーがnameおよびemailフィールドに入力してフォームを送信すると、データが出力されます。
User Information
Name: the user's name
Email: the user's email
フォームが空白の場合は、サーブレット初期化パラメータが表示されます。
User Information
Name: Not provided
Email: Not provided
この例では、アノテーションを使用してサーブレット初期化パラメーターを定義する方法と、getInitParameter()メソッドを使用してそれらにアクセスする方法を示しました。
2.2. 標準デプロイメント記述子の使用
このアプローチは、構成とソースコードを互いに分離しておくことができるため、注釈を使用するアプローチとは異なります。
“ web.xml” ファイルを使用して初期化サーブレットパラメータを定義する方法を紹介するために、最初に[X174X]UserServletからinitParamおよび@WebInitParamアノテーションを削除しましょう。 クラス:
@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"})
public class UserServlet extends HttpServlet { ... }
次に、“ web.xml”ファイルでサーブレット初期化パラメータを定義しましょう。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<servlet>
<display-name>UserServlet</display-name>
<servlet-name>UserServlet</servlet-name>
<init-param>
<param-name>name</param-name>
<param-value>Not provided</param-value>
</init-param>
<init-param>
<param-name>email</param-name>
<param-value>Not provided</param-value>
</init-param>
</servlet>
</web-app>
上に示したように、サーブレット初期化パラメータを使用して定義する 「web.xml」 ファイルは、要約すると、
さらに、上記の標準構造に固執する限り、必要な数のサーブレットパラメータを定義することができます。
アプリケーションをサーバーに再デプロイして再実行すると、アノテーションを使用するバージョンと同じように動作するはずです。
3. コンテキストパラメータの初期化
Webアプリケーション全体でグローバルに共有およびアクセスする必要がある不変のデータを定義する必要がある場合があります。
データのグローバルな性質により、対応するサーブレットに頼るのではなく、アプリケーション全体のコンテキスト初期化パラメーターを使用してデータを格納する必要があります。
アノテーションを使用してコンテキスト初期化パラメーターを定義することはできませんが、「web.xml」ファイルで定義できます。
アプリケーションが実行されている国と州のデフォルトのグローバル値を提供するとします。
これは、いくつかのコンテキストパラメータを使用して実現できます。
それに応じて“ web.xml”ファイルをリファクタリングしましょう。
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<context-param>
<param-name>province</param-name>
<param-value>Mendoza</param-value>
</context-param>
<context-param>
<param-name>country</param-name>
<param-value>Argentina</param-value>
</context-param>
<!-- Servlet initialization parameters -->
</web-app>
今回は、
もちろん、 UserServlet クラスをリファクタリングして、これらのパラメーターをフェッチして結果ページに渡すことができるようにする必要があります。
サーブレットの関連セクションは次のとおりです。
@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"})
public class UserServlet extends HttpServlet {
// ...
protected void processRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", getRequestParameter(request, "name"));
request.setAttribute("email", getRequestParameter(request, "email"));
request.setAttribute("province", getContextParameter("province"));
request.setAttribute("country", getContextParameter("country"));
}
protected String getContextParameter(String name) {-
return getServletContext().getInitParameter(name);
}
}
getContextParameter()メソッドの実装に注意してください。は最初にgetServletContext()を介してサーブレットコンテキストを取得し、次にgetInitParameter()メソッドを使用してコンテキストパラメータをフェッチします。
次に、“ result.jsp” ファイルをリファクタリングして、サーブレット固有のパラメーターとともにコンテキストパラメーターを表示できるようにする必要があります。
<p><strong>Name:</strong> ${name}</p>
<p><strong>Email:</strong> ${email}</p>
<p><strong>Province:</strong> ${province}</p>
<p><strong>Country:</strong> ${country}</p>
最後に、アプリケーションを再デプロイして、もう一度実行できます。
ユーザーがHTMLフォームに名前と電子メールを入力すると、コンテキストパラメーターとともにこのデータが表示されます。
User Information
Name: the user's name
Email: the user's email
Province: Mendoza
Country: Argentina
それ以外の場合は、サーブレットとコンテキストの初期化パラメータを出力します。
User Information
Name: Not provided
Email: Not provided
Province: Mendoza
Country: Argentina
この例は考案されていますが、コンテキスト初期化パラメーターを使用して不変のグローバルデータを格納する方法を示しています。
データは特定のサーブレットではなくアプリケーションコンテキストにバインドされているため、 getServletContext()および getInitParameter()メソッドを使用して、1つまたは複数のサーブレットからデータにアクセスできます。
4. 結論
この記事では、コンテキストとサーブレットの初期化パラメータの主要な概念と、それらを定義し、アノテーションと「web.xml」ファイルを使用してそれらにアクセスする方法を学びました。
かなり長い間、JavaではXML構成ファイルを削除し、可能な場合はいつでもアノテーションに移行する傾向が強くなっています。
CDI 、 Spring 、 Hibernate は、いくつか例を挙げると、この明白な例です。
それでも、コンテキストとサーブレットの初期化パラメータを定義するために“ web.xml”ファイルを使用することに本質的に問題はありません。
サーブレットAPIはこの傾向に向かってかなり速いペースで進化しましたが、コンテキスト初期化パラメーターを定義するためにデプロイメント記述子を使用する必要があります。
いつものように、この記事に示されているすべてのコードサンプルは、GitHubでから入手できます。