サーブレットのリクエストはさまざまな方法で到着します。サーブレットは、それらのリクエストの受け取り、クライアント入力の解析、そしてレスポンスの生成に責任があります。データをサーブレットに渡すメソッドには次のものがあります。
使用できるリクエスト処理メソッドを判断するには、まず HTTP 仕様で定義されているさまざまなリクエストメソッドの違いを理解する必要があります。
クライアントが 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)
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 を開きます。
フォーム送信でのさまざまな文字セットの処理については、 「外国語フォームの送信処理」 を参照してください。