6.doPostとForm処理

doPostは POSTリクエスト(フォームなどのActionにPOSTが指定されてリクエスト場合など)がきた場合の処理を記述します。

(1) doPost メソッドの構文


 doPost メソッドの構文は次のとおりです。

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
              throws ServletException, java.io.IOException

HttpServletRequest  req  : クライアントがServletへ要求したリクエスト内容
HttpServletResponse resp : Servletがクライアントに返すレスポンス内容等

ServletException : POSTに相当するリクエストが処理できない場合
IOException      : ServletがPOSTリクエストの処理中に入出力エラーが発生


(2) フォームの例


 次のような「フォームからテキストを入力して送信ボタンを押す」Html文書( post.html )を作成します。


<html><head><title>フォーム側</title></head><body>

<form action="http://localhost:5555/" method="post">
NAME : <input type="text" size="30" name=name value=" name!">
  AGE  : <input type="text" size="3" name=age ><br><br>
<input type="submit" value="送信"> 
<input type="reset" value="reset">
</form>

</body></html>
フォーム側 NAME :   AGE :

     (※便宜上、クリックしても動作しないようにしてあります)


 doGet の説明で使用した「PortCheck」で実際に実行させてみます。

C:\java_test>javac PortCheck.java
C:\java_test>java PortCheck
POST / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg,
                             image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Referer: http://localhost/post.html
Accept-Language: ja
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Host: 127.0.0.1:5555
Content-Length: 0
Connection: Keep-Alive


 先ほど作成した post.html をブラウザで開いて、実行してみます。画面に「Access port 5555! 」が表示され、同時に、MS-DOS には、POST / HTTP/1.1 以下が表示されます。

 ブラウザからアクセスした時には"POST / HTTP/1.0"というPOSTコマンドが送られているのが分かります。Servletに対してアクセスする場合も同様で、 POSTコマンドを使ってデータの要求がありますので、POSTコマンドが送られてきたときに、doPost メソッドが実行されて要求を読み取り結果を返すといった処理が行われます。

※Servletでは「POST」の要求があった時に、 doPostメソッドを呼び出すようです。


(3) FORM の入力処理

 サーブレットで処理する呼び出し元の情報は HttpServletRequest req より取得します。その情報の処理の仕方について説明します。

protected void doPost(HttpServletRequest req,
                        HttpServletResponse resp)
              throws ServletException, java.io.IOException

引数  HttpServletRequest req  呼び出し元の情報


 ※HttpServletRequest は、その親であるServletRequestインターフェースの方で定義されています。

先ほどの「post.html」のaction にサーブレット(FormServlet)を指定して、説明します。

  action="http://127.0.0.1:8080/examples/servlet/FormServlet"


 (3)-1.名前と値の取得
処理側のFormServletを作ります。取り合えず送られてきたフォームのデータから"名前"と"名前"に対応する"値"の一覧だけを取り出して表示してみます。

"名前"を得るには、getParameterNames()を使います。

"値" を得るには、getParameterValues()を使います。

// 例  FormServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class FormServlet extends HttpServlet {

  public void doPost(HttpServletRequest req,
                      HttpServletResponse resp)
              throws ServletException, IOException{

    resp.setContentType("text/html;charset=Shift_JIS");
    PrintWriter out = resp.getWriter();

    out.println("<html>");
    out.println("<head><title>タイトル</title></head>");
    out.println("<body>");

    Enumeration enum = req.getParameterNames();

    while(enum.hasMoreElements()){
       String name = (String)enum.nextElement();
       out.println("Name = " + name);
       out.println(",Value = " + 
              req.getParameterValues(name)[0]);
       out.println("<br>");
    }

    out.println("</body></html>");

    out.close();
  }
}



※(name)[0])の部分は、一つの名前に値が一つしかないという前提です。複数については、次項(4)-1を参照。


 (3)-2.実際に確認
作成した FormServlet.java をコンパイルし、その作成クラスをサーブレット用のフォルダーに移動します(2.サーブレットの実行を参照)。

先ほど作成した post.html をブラウザで開いて実行してみます。NAME欄に「sample」、AGE欄に「30」を入力し、送信します。

FormServlet が呼び出され、画面に次の内容が表示されます。

Name = age ,Value = 30 
Name = name ,Value = sample 


(4) getParameterNames()とgetParameterValues()


  getParameterNames()  ・・・  FORM 入力項目の名前

構文   :  public Enumeration getParameterNames()

引数   :  なし
戻り値 :  Servlet の初期化パラメータの名前を含む String オブジェクト
          からなる Enumeration。パラメータが無い場合は空の Enumeration。


例 : Enumeration enum = req.getParameterNames(); String name = (String)enum.nextElement(); out.println("Name = " + name);



  getParameterValues()  ・・・  FORM 入力項目の値

構文   : public String[] getParameterValues(String name)

引数   : name - 取得したいパラメータの名前を指定する String

戻り値 : パラメータの値が入っている String オブジェクトの配列


例 : if((req.getParameterValues("name"))!=null){ String[] vals = request.getParameterValues("name"); out.println("Value = " + vals[0]); }



  getParameter()  ・・・  FORM 入力項目の値(単一)

構文   : public String getParameter(String name)

引数   : name - 取得したいパラメータの名前を指定する String

戻り値 : 単一のパラメータの値を表す String

※パラメータに確実に一つの値だけがある場合に限って使用するべきです。


例 : val = req.getParameter("name"); out.println("Value = " + val);



 (4)-1.複数の値の取り出し方
1つの"名前"で複数の"値"がある場合はその複数の値がまとめてStringの配列に格納されます。チェックボックスでは複数選択ができ 、1つの"名前"で複数の"値"となるので、この場合に使用されます。

// 例  FormServlet.java
import java.io.*;
            :
public class FormServlet extends HttpServlet {
  public void doPost(HttpServletRequest req,
                      HttpServletResponse resp)
              throws ServletException, IOException{
            :
     Enumeration enum = req.getParameterNames();
        while(enum.hasMoreElements()){
          String name = (String)enum.nextElement();
          String vals[] = req.getParameterValues(name);

          for( int i = 0 ; i < vals.length ; i++){
            out.println("Name = " + name);
            out.println(",Value = " + vals[i]);
            out.println("<br>");
          }

        }
  }
}



以上が基本的なdoPostが呼び出されたときのFORMの入力処理です。フォームのメソッドで"POST"ではなく"GET"を指定した場合には、doGet()が呼び出されます。値の取得方法はdoPostの場合と同じです。


次の章(5.doGetとHtml出力)  次の章(7.. doPut,do... )