ひとつのサーブレットでGETとPOST、両方に対応する事は可能なのだろうか。ここではその方法について説明する
GETとPOST両方に対応する方法
GETリクエストとPOSTリクエストの両方をひとつのサーブレットで処理することは可能である。Webコンテナは、GETを受け付けた時はサーブレットのdoGet()メソッドを呼び出し、POSTの時はdoPost()メソッドを呼び出す。このサーブレットの親クラスのHttpServletメソッドをオーバーライドすればよい。
GETとPOST両方に対応するサンプルプログラム
このサンプルプログラムは、クライアントからリクエストメソッドのGETとPOSTの両方を受け付ける。
リクエストでGETをdoGet()で受けた時は、現在の番号の値を表示し、同じ画面で新規の番号の入力を行う。この画面で変更ボタンが押されると、リクエストがPOSTで新規の番号とともにサーブレットに送られる。サーブレットは、doPost()によって新規の番号で現在の番号を更新し、更新された番号を表示する。
サーブレットの配置とプログラムのコードは次のようになっている。
ひとつのサーブレットにGETリクエストとPOSTリクエストの両方の処理が入ったコードを以下に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/GetAndPostServlet")//[1] public class GetAndPostServlet extends HttpServlet {//[2] static String number = "1234";//[3] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[4] response.setContentType("text/html; charset=Shift_JIS");//[5] PrintWriter out=response.getWriter();//[6] out.println("<head><title>Input</title></head>");//[7] out.println("<body>");//[8] out.println("<form method=\"POST\">");//[9] out.println("<h2>新規の番号を入力してください</h2>");//[10] out.println("<p></p>");//[11] out.println("現在の番号:" + number);//[12] out.println("<p></p>");//[13] out.println("新規の番号:");//[14] out.println("<input title=\"新規の番号:\" type=\"text\" name=\"number\" size=\"25\">");//[15] out.println("<p></p>");//[16] out.println("<input type=\"submit\" value=\"変更\">");//[17] out.println("</form>");//[18] out.println("</body></html>");//[19] } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[40] number = request.getParameter("number");//[41] response.setContentType("text/html; charset=Shift_JIS");//[42] PrintWriter out=response.getWriter();//[43] out.println("<head><title>Join</title></head>");//[44] out.println("<body>");//[45] out.println("<form method=\"GET\">");//[46] out.println("<h2>更新された番号:" + number + "</h2>");//[47] out.println("<input type=\"submit\" value=\"完了\">");//[48] out.println("</form>");//[49] out.println("</body></html>");//[50] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/GetAndPostServlet を入力し、Enterを押す。
表示されるブラウザ画面:
「新規の番号:」の入力フィールドに「5678」と入力する。そして、変更ボタンを押すと、次の画面が表示される。
表示されるブラウザ画面:
更新された新規の番号が表示される。完了ボタンを押すと、新規の番号入力画面が表示される。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] @WebServletアノテーションでurlPatternの宣言をする。
- [2] HttpServletを継承して、GetAndPostServletクラスを定義する。
- [3] 文字列変数numberを、初期値:1234で宣言する。
- [4] doGet()メソッドをオーバーライドして定義する。
- [5] Content Typeに「text/html; charset=Shift_JIS」を設定する。
- [6] HTMLを出力するためのoutオブジェクトを取得する。
- [7]-[8] 現在の番号の値を表示する。
- [9] 画面フォームからの入力が、リクエストのPOSTメソッドとして送られるように設定する。
- [10]-[19] 同じ画面で新規の番号の入力を行う画面のHTMLをoutオブジェクトに出力する。
- [40] doPost()メソッドをオーバーライドして定義する。
- [41] パラメータIdがnumberの文字列を取得して、フィールドnumberに設定する。
- [42] Content Typeに「text/html; charset=Shift_JIS」を設定する。
- [43] HTMLを出力するためのoutオブジェクトを取得する。
- [44]-[45] 画面フォームからの入力が、リクエストのGETメソッドとして送られるように設定する。
- [46]-[50] 更新された番号を表示する画面のHTMLをoutオブジェクトに出力する。
まとめ
doGetとdoPostの処理を1つのサーブレットに書くことでWebブラウザからどちらのリクエストが来ても処理できるようになった事がよくわかると思う。応用の利くプログラムなので、サンプルを基に色々と改造してみよう。