6.doPostとForm処理 |
(1) 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><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> |
(※便宜上、クリックしても動作しないようにしてあります) |
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 |
※Servletでは「POST」の要求があった時に、 doPostメソッドを呼び出すようです。
(3) FORM の入力処理 |
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException 引数 HttpServletRequest req 呼び出し元の情報 |
処理側の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を参照。
作成した FormServlet.java をコンパイルし、その作成クラスをサーブレット用のフォルダーに移動します(2.サーブレットの実行を参照)。
先ほど作成した post.html をブラウザで開いて実行してみます。NAME欄に「sample」、AGE欄に「30」を入力し、送信します。
FormServlet が呼び出され、画面に次の内容が表示されます。
Name = age ,Value = 30 Name = name ,Value = sample
(4) getParameterNames()とgetParameterValues() |
構文 : public Enumeration getParameterNames() 引数 : なし 戻り値 : Servlet の初期化パラメータの名前を含む String オブジェクト からなる Enumeration。パラメータが無い場合は空の Enumeration。 |
構文 : public String[] getParameterValues(String name) 引数 : name - 取得したいパラメータの名前を指定する String 戻り値 : パラメータの値が入っている String オブジェクトの配列 |
構文 : public String getParameter(String name) 引数 : name - 取得したいパラメータの名前を指定する String 戻り値 : 単一のパラメータの値を表す String ※パラメータに確実に一つの値だけがある場合に限って使用するべきです。 |
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の場合と同じです。