doGetとdoPostの関係
サーブレットの基本は、doGetかdoPostで処理を行うようになっていました。次は、この両者の違いについて考えてみましょう。
この2つは、それぞれGETとPOSTで送信された場合に呼び出されるものです。では、GETとPOSTとは何でしょうか? これは、HTTPプロトコルで規定されているコマンドのことです。GETはサーバから情報を受け取る要求をするものであり、POSTはサーバに情報を送信するためのものです。
こう説明すると、中には「あれ? そうなのか?」と疑問に思う人もいるかも知れません。なぜなら、<form>タグで送信をする場合、methodにGETを指定して送信することだってあるはずです。GETでも情報は送れるのです。ならば、どちらも「情報を送信する」ためのものでは? そう思う人もいるはずです。
では、フォームの送信などでなく、普通にそのページにアクセスした場合には、どのようなHTTPコマンドで要求が送られるのでしょうか。実は、「GET」なのです。要するに、GETは、フォームの送信などとは無関係に、「サーバにページを要求する」と言うとき常に使われるものなのです。フォームをGETで送信するときには、「ページ要求」にクエリー文字を使って送信内容をつけて送っているだけです。つまり、あくまで行っているのは「ページの要求」なのです。
では、両者の関係が分かるように、両方のメソッドを実装した簡単なサーブレットのサンプルを動かしてみましょう。先ほどのMyServletを修正して使うことにします。
package jp.codezine; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class MyServlet extends HttpServlet implements Servlet { private static final long serialVersionUID = 1L; public MyServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Shift_JIS"); response.setContentType("text/html;charset=Shift_JIS"); ServletOutputStream out = response.getOutputStream(); this.writeHtmlHeader(out); out.println("※GETによる送信<br><br>"); this.writeHtmlFooter(out); out.flush(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Shift_JIS"); response.setContentType("text/html;charset=Shift_JIS"); ServletOutputStream out = response.getOutputStream(); this.writeHtmlHeader(out); out.println("※POSTによる送信<br><br>"); String s = (String)request.getParameter("text1"); s = this.getSanitizedString(s); out.println("送信されたテキスト:" + s + "<br><br>"); this.writeHtmlFooter(out); out.flush(); } // HTMLのヘッダー部分の出力 public void writeHtmlHeader(ServletOutputStream out) throws IOException { out.println("<html><head><title>MyServlet</title>"); out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-31j\"></head>"); out.println("<body>"); } // フォームなどの後半の出力 public void writeHtmlFooter(ServletOutputStream out) throws IOException { out.println("<form action=\"./myserv\" method=\"post\">"); out.println("<input type=\"text\" name=\"text1\">"); out.println("<input type=\"submit\">"); out.println("</form>"); out.println("</body></html>"); } // サニタイズ処理 public String getSanitizedString(String s){ String str = s; str = str.replace("<","<"); str = str.replace(">",">"); str = str.replace("\"","""); str = str.replace(" "," "); return str; } }


作成したら、「http://localhost:8080/myweb/myserv」にアクセスをしてみてください。「※GETによる送信」という表示がされるはずです。ここで、適当にテキストを書いて送信をすると、今度は「※POSTによる送信」という表示に変わるはずです。POSTは、フォームでPOST送信した場合にのみ用いられ、普通のページアクセスでは常にGETが使われていることが確認できるでしょう。
ここでは、送信されたフォームの内容を取り出すのに、次のようなやり方をしています。
String s = (String)request.getParameter("text1");
なんだか、どこかで見たことありませんか? そうです、JSPで送信されたフォームの情報を取り出すのにも、暗黙オブジェクトrequestを使って、request.getParameterとやっていましたね。サーブレットの場合は、メソッドの引数として渡されるHttpServletRequestのgetParameterになりますが、まったく同じ感覚で処理していることが分かります。

\"text/html; charset=windows-31j\"></head>");
out.println(