リクエストの処理

サーブレットのリクエストはさまざまな方法で到着します。サーブレットは、それらのリクエストの受け取り、クライアント入力の解析、そしてレスポンスの生成に責任があります。データをサーブレットに渡すメソッドには次のものがあります。

使用できるリクエスト処理メソッドを判断するには、まず HTTP 仕様で定義されているさまざまなリクエストメソッドの違いを理解する必要があります。

GET と POST

クライアントが HTTP GET リクエストを JRun に送信すると、JRun はサーブレットの doGet メソッドを呼び出します (このメソッドをオーバーライドしていた場合)。ユーザーが URL を入力、リンクをクリック、または method=GET を指定するフォームを送信すると、Web ブラウザにより HTTP GET リクエストが送信されます。GET メソッドは、ページをリクエストするために呼び出す最も一般的なメソッドです。リクエストパラメータは、GET リクエストメッセージのリクエストメソッドヘッダーに保管されます。これにより、GET メソッドのサイズと構造が制限されます。

クライアントが JRun に HTTP POST リクエストを送信すると、JRun は doPost メソッドを呼び出します。ユーザーが method=POST を指定するフォームを送信すると、Web ブラウザにより HTTP POST リクエストが送信されます。POST リクエストメッセージの本文に、リクエストパラメータが保管されます。このために、POST メソッドには、GET メソッドより多くの情報が保管できます。

クエリ文字列パラメータの使用

HTTP リクエストでクライアントからサーバに渡されるクエリ文字列。これは、color=red などの名前/値のペアです。これは URL の一部になるか、HTTP リクエストに付加されます。次の URL では、クエリ文字列パラメータ color が red に設定され、クエリ文字列パラメータ name が danger に設定されています。

http://localhost:8100/servlet/myservlet/?name=danger&color=red

最近のほとんどの Web サーバでは、クエリ文字列の長さが 4K (4000 文字) に制限されています。しかし、この制限が原因でパフォーマンス上の問題が発生することがあります。クエリ文字列が長くなりすぎる場合は、POST メソッドを使用してクライアントからサーバにデータを送信します。これは、FORM タグを使用すると可能です。

URL 書き換えでは、クエリ文字列パラメータを使用して、複数のリクエスト間でセッションデータを維持します。URL 書き換えの詳細については、 「URL 書き換えの使用」 を参照してください。

クエリ文字列へのアクセス

次の例に示すように、request オブジェクトの getParameter メソッドを使用してクエリ文字列パラメータにアクセスします。

String name = request.getParameter("param-name");

次の行では、getParameter メソッドの署名が示されています。

public abstract String getParameter(String name)

たとえば、次の URL をリクエストする場合を考えます。

http://localhost:8100/servlet/myservlet/?name=danger&color=red

次のコードを使用すると、name と color の値を抽出できます。

String bgcolor = request.getParameter("color");
String first_name = request.getParameter("name");

次の例に示すように、getParameterNames メソッドを使用すると、すべてのクエリ文字列パラメータにアクセスできます。

...
Enumeration eParmNames = req.getParameterNames();
while (eParmNames.hasMoreElements()) {
  String parm = (String) eParmNames.nextElement();
  out.println(" " + parm + " = " + req.getParameter(parm) + "<br>");
}
...

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

配列を使用する作業

パラメータは複数の値を持つことができます。次の例に示すように、getParameterValues メソッドを使用すると、リクエストされたパラメータのすべての値の配列を取得できます。

...
String[] state = req.getParameterValues("state");
for (int i = 0; i<state.length; i++) {
  out.println("<BR> あなたの家がある地域:" + state[i]);
}
...

クエリ文字列のキャスト

クエリ文字列パラメータは String ですが、getParameter メソッドの結果は自由にキャストできます。たとえば、UserID を int で取得するには、次の行を使用します。

int id = (int)(Integer.parseInt(req.getParameter("id")));

クエリ文字列パラメータが付加された URL を構築することで、そうしたパラメータを response オブジェクトに設定します。

フォーム入力の使用

HTML の FORM タグを使用して、ユーザーが記入して送信できるフォームを作成します。 FORM メソッドは通常 POST に設定されているために、サーブレットはこの種類のデータを通常 doPost メソッドで処理します。

次の例では、ユーザー情報の入力を促す HTML フォームを表示します。

...
out.println("<html><head><title>サンプルフォーム</title>");
out.println("</head><body>");
out.println("<h1>サンプルフォーム</h1>");
out.println("<FORM METHOD=¥"POST¥" ACTION=¥"SampleForm¥">");
out.println("姓: ");
out.println("<INPUT TYPE=¥"text¥" NAME=¥"lastname¥" 
SIZE=40>");out.println("<INPUT TYPE=¥"text¥" 
NAME=¥"lastname¥" SIZE=40>");
out.println("<BR>名: ");
out.println("<INPUT TYPE=¥"text¥" NAME=¥"firstname¥" SIZE=40>");
out.println("<INPUT TYPE=¥"Submit¥" VALUE=¥"Submit¥"></FORM>");
out.println("</body></html>");
...

この後、次の例に示すように、request.getParameter メソッドを使用すると、POST メッセージからパラメータを抽出できます。

...
public void doPost(HttpServletRequest req, HttpServletResponse resp) 
throws IOException, ServletException {
...
String fname = req.getParameter("firstname");
String lname = req.getParameter("lastname");
...

次の例に示すように、getParameter メソッドの結果を使用すると、出力を判断するロジックをサーブレットに組み込むことができます。

...
if (fname != null) {
  out.println(lname + fname "さん、こんにちは");
} else {
  out.println("次のフォームに記入してください。");
}
...

このサンプルではフォームをそれ自体にポストして、リクエストパラメータの存在を調べます。パラメータが null でない場合はサーブレットはウェルカムメッセージをユーザーに表示し、パラメータが null の場合はサーブレットは姓名の入力を促がします。

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

フォーム送信でのさまざまな文字セットの処理については、 「外国語フォームの送信処理」 を参照してください。