SHOEISHA iD

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

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

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

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

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

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


サーブレットの基本ソースコード

 では、作成された「MyServlet.java」のソースコードがどうなっているか、確認してみましょう。コメント類を省略すると、大体こんなものが生成されているはずです。

package jp.codezine;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 public class MyServlet extends javax.servlet.http.HttpServlet
        implements javax.servlet.Servlet {
    
    public MyServlet() {
        super();
    }       
    
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {

        // ここにGET時の処理を書く

    }      
    
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response)
            throws ServletException, IOException {

        // ここにPOST時の処理を書く

    }
}

 サーブレットは、HttpServletクラスを継承する形で作成されます。このHttpServletが、サーブレットの基本クラスとなります。またサーブレットクラスにはServletインターフェイスが実装されます。

 ここでは「doGet」「doPost」という2つのメソッドが用意されていますが、これらがそれぞれGET/POSTでアクセスされた際に呼び出される処理を記述するものになります。これらは、必要なければ必ずしも両方定義する必要はありませんが、最低どちらか1つはないといけません(GETもPOSTもできないのでは、サーブレットにアクセスする方法がありませんので)。

 ここではいろいろと新しいクラスなどが登場していますが、これらについては後述するとして、まずは簡単なサンプルを作成してみることにしましょう。ここでは、GETで呼び出されるdoGetメソッドを修正してみることにします。

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();
    out.println("<html><head><title>MyServlet</title>");
    out.println("<meta http-equiv=\"Content-Type\" content=\"text/
html; charset=windows-31j\"></head>");
    out.println("<body>※送信されたテキスト</body></html>");
    out.flush();
}

 メソッドを修正したら、サーバを起動しましょう。そして、以下のURLを直接アドレスバーに書いてアクセスしてみます。

  • http://localhost:8080/myweb/myserv
アクセスすると、「※送信されたテキスト」と表示される。
アクセスすると、「※送信されたテキスト」と表示される。

 これで、「※送信されたテキスト」と表示されましたか? これが、サンプルで作成したサーブレットの実行結果です。このサーブレットでは、次のようなHTMLテキストを送信する働きをしています。

<html><head><title>MyServlet</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows -31j"></head>
<body>※送信されたテキスト</body></html>

サーブレットの3大オブジェクト

 このサーブレットでは、3つの非常に重要なオブジェクトが登場します。doGetの引数をよく見てみましょう。次のような2つのオブジェクトが引数として渡されていますね。

HttpServletRequest request,
HttpServletResponse response

 またメソッド内では、この中のresponseというオブジェクトから、クライアント側へ出力するためのストリームを取得しています。以下の部分です。

ServletOutputStream out = response.getOutputStream();

 このHttpServletRequest、HttpServletResponse、ServletOutputStreamの3つが、サーブレットで使われる最も重要なオブジェクトといってよいでしょう。サーブレットでの基本的な処理は、この3つのオブジェクトさえ理解していれば大抵行うことができます。では、これらの役割について整理しておきましょう。

  • HttpServletRequest
  • クライアントからサーバへの要求(リクエスト)に関する情報を管理するものです。クライアントから送られた情報などはここから取得できます。
  • HttpServletResponse
  • サーバからクライアントへの送信(レスポンス)に関する情報を管理するものです。送信に関する設定などを行えます。
  • ServletOutputStream
  • 実際にクライアントに出力するためのストリームです。HTMLなどによる情報を送信する際にはこれを使います。

 では、この3つのオブジェクトの役割を念頭に置いた上で、doGetで実行している処理について見てみることにしましょう。

request.setCharacterEncoding("Shift_JIS");

 まず、送られてきた情報(リクエスト)のキャラクタエンコーディングを設定しています。今回は、送られてきた情報は何もないので実は必要ないのですが、「サーブレットで行う処理の基本」として一応用意しておきました。実際には、リクエストから何かの情報を取り出したりしない場合は不要です。

response.setContentType("text/html;charset=Shift_JIS");

 続いて、クライアントへの送信する情報のコンテンツタイプを設定します。これは重要です。これによって、「これからクライアントに返されるのは、HTMLのテキストデータですよ」ということをブラウザに伝えるのですから。これをきちんと行わないと、ブラウザによっては、どんな情報が送られてくるのかわからなくなり正しく送信情報を受け取れなくなってしまうこともあります。

ServletOutputStream out = response.getOutputStream();

 response.getOutputStream()は、先に触れましたね。レスポンスから、クライアントへの出力を行うためのストリームを取り出します。ここまでが、実際の送信を行う前の下準備といっていいでしょう。

out.println("<html><head><title>MyServlet</title>");

 後は、取得したServletOutputStreamのメソッドを使ってHTMLのテキストを出力します。ServletOutputStreamはOutputStreamを継承したクラスですから、おなじみのprintやprintlnといったメソッドが用意されています。これらを使ってテキストを出力すれば、それがそのままクライアントへと送られるわけです。必要なだけこれらの出力用メソッドを呼び出して、情報を送り出します。

out.flush();

 最後に、ストリームをflushして作業終了です。flushは、出力ストリームを使う場合の基本マナーとして行っていますが、省略しても問題が起こることはまずありません。実際には、これは省略して書いている人も多いでしょう。

 ここで行っているのは、クライアントへの送信で必要となる最も基本的な処理だけです。「requestのキャラクタエンコーディングを設定する」「responseのコンテンツタイプを設定する」「出力ストリームを得る」「outを使って出力を行う」――これらは、一連の手続きをセットとして覚えておくとよいでしょう。

次のページ
doGetとdoPostの関係

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

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

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー