SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

WTPではじめるサーバサイドJava入門

サーバサイドJava入門 サーブレットの実装とWARファイルの作成

第5回 JSPとサーブレットの仕組み


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("<","&lt;");
        str = str.replace(">","&gt;");
        str = str.replace("\"","&quot;");
        str = str.replace(" ","&ensp;");
        return str;
    }
}
ページにアクセスすると、「※による送信」と表示される。
ページにアクセスすると、「※による送信」と表示される。
フォームを送信すると、「※POSTによる送信」となる。
フォームを送信すると、「※POSTによる送信」となる。

 作成したら、「http://localhost:8080/myweb/myserv」にアクセスをしてみてください。「※GETによる送信」という表示がされるはずです。ここで、適当にテキストを書いて送信をすると、今度は「※POSTによる送信」という表示に変わるはずです。POSTは、フォームでPOST送信した場合にのみ用いられ、普通のページアクセスでは常にGETが使われていることが確認できるでしょう。

 ここでは、送信されたフォームの内容を取り出すのに、次のようなやり方をしています。

String s = (String)request.getParameter("text1");

 なんだか、どこかで見たことありませんか? そうです、JSPで送信されたフォームの情報を取り出すのにも、暗黙オブジェクトrequestを使って、request.getParameterとやっていましたね。サーブレットの場合は、メソッドの引数として渡されるHttpServletRequestのgetParameterになりますが、まったく同じ感覚で処理していることが分かります。

次のページ
JSPとサーブレットの関係

この記事は参考になりましたか?

WTPではじめるサーバサイドJava入門連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1464 2008/08/19 20:44

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー