■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2007年10月08日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.073

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■



[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.Tomcatのアプリケーション開発
========================================================


では、TestServletのソース・コードを解説します。

--------------------------------------------------------
package jp.flsi.lecture.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<HTML>");
      out.println("<HEAD>");
      out.println("<TITLE>Servlet Test Page</TITLE>");
      out.println("</HEAD>");
      out.println("<BODY bgcolor=\"#77ffff\" text=\"#fa5a00\">");
      out.println("<H1>vol.072 Test Page</H1>");
      out.println("This page is the output of TestServlet.");
      out.println("</BODY>");
      out.println("</HTML>");
   }

}
--------------------------------------------------------

以前(vol.067)にもお話しましたが、サーブレットはCGIのプログラム
と同じように、Webブラウザーからの要求に応じてプログラムを実行し、
結果(応答)をWebブラウザーに返すものです。

CGIのプログラムがWebブラウザーから要求を受け取る方法としては、GET
とPOSTという2種類の方式があります。
使い分けとしては、URLの中に組み込まれたデータを受け取るにはGETを、
HTMLのFORM(後述)を使ってデータを受け取る場合(FORMでmethod="POST"
を指定したとき)はPOSTを使用します。

そして、このGET方式をサーブレットのメソッドにしたものがdoGet()メソッ
ドで、POST方式をサーブレットのメソッドにしたものがdoPost()メソッド
です。

TestServletのソース・コードではdoGet()メソッドを使っていますが、
doGet()メソッドのシグネチャーは
--------------------------------------------------------
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException
--------------------------------------------------------
になります。(reqとresは引数の変数名ですから、この通りにする必要は
ありません。上記のソース・コードでは、もっとわかりやすくrequestと
responseにしています。)

この第一引数(HttpServletRequest型)はWebブラウザーから受け取った
要求を表現するオブジェクトです。(ただし、HttpServletRequestはイン
ターフェースです。)これについては、後でdoPost()の説明のときに解説
します。

また、第二引数(HttpServletResponse型)はWebブラウザーに返す応答を
表現するオブジェクトです。(ただし、HttpServletResponseはインター
フェースです。)
このオブジェクトのgetWriter()メソッドを呼び出すと、PrintWriter型の
オブジェクトを返してくれます。
上記のソース・コードでは、
--------------------------------------------------------
PrintWriter out = response.getWriter();
--------------------------------------------------------
として、そのオブジェクトを変数outに代入しています。

このPrintWriterのprint()メソッドまたはprintln()メソッドを使って、
応答内容を書き込んでやれば、それがWebブラウザーに返されるようになっ
ています。

そこで、上記のソース・コードでは、
--------------------------------------------------------
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Servlet Test Page</TITLE>");
out.println("</HEAD>");
out.println("<BODY bgcolor=\"#77ffff\" text=\"#fa5a00\">");
out.println("<H1>vol.072 Test Page</H1>");
out.println("This page is the output of TestServlet.");
out.println("</BODY>");
out.println("</HTML>");
--------------------------------------------------------
というふうにして、HTMLの文書を書き込んでいます。
これは結局のところ、
--------------------------------------------------------
<HTML>
<HEAD>
<TITLE>Servlet Test Page</TITLE>
</HEAD>
<BODY bgcolor="#77ffff" text="#fa5a00">
<H1>vol.072 Test Page</H1>
This page is the output of TestServlet.
</BODY>
</HTML>
--------------------------------------------------------
というHTML文書をWebブラウザーに返すことを意味しますね。

ところで、上記ソース・コード中の
--------------------------------------------------------
response.setContentType("text/html");
--------------------------------------------------------
は、何を意味するのでしょうか。

Webブラウザーに応答を返すには、まずどういう形式の応答なのか
(ただのテキスト文を返すのか、それともHTMLで書かれた文書
(Webページ)を返すのか、文字コードは何か等)をWebブラウザー
に知らせておく必要があります。
そのために使うのが、上記のsetContentType()メソッドで、
--------------------------------------------------------
response.setContentType("text/html");
--------------------------------------------------------
という指定をすると、HTMLで書かれた文書(Webページ)であることを、
Webブラウザーに知らせることになります。

具体的には、この情報はHTTPプロトコルにおける、コンテンツ・タイプ・
ヘッダー(Content-Type header)と呼ばれる領域に書き込まれてWebブ
ラウザーに送られることになるのですが、ただし、このsetContentType()
メソッドは、サーブレット・コンテナー(サーブレットを動かすエンジン
のようなもので、当メールマガジンではTomcatを使っている)経由でこの
情報を送ります。(サーブレット・コンテナーはWebサーバーとサーブレッ
トの間の情報の仲介役のような仕事をします。)

実は、上のrequestやresponseのオブジェクトを用意してくれるのはサーブ
レット・コンテナーなのです。
上のgetWriter()メソッドによって取り出されるPrintWriterオブジェクト
(outに代入されたオブジェクト)を用意してくれるのもサーブレット・
コンテナーです。

ここで注意しなければならないことは、HTML文書で日本語の文字コードを
使うときです。

このPrintWriterオブジェクトで書き込みを行うときに使われるデフォルト
の文字コードはサーブレット・コンテナーによって異なり、Tomcatのデフォ
ルトは西洋の文字コードです。したがって、Tomcatの場合は、デフォルトの
ままでは日本語の文字は使えません。

そこで、日本語の文字を含む場合は、たとえば文字コードとしてShift_JISを
使いたいのであれば、
--------------------------------------------------------
response.setContentType("text/html; charset=Shift_JIS");
--------------------------------------------------------
というようにして文字コードを明示しておきます。

たとえば、TestServletを下記のように書き換えて試してみてください。
--------------------------------------------------------
package jp.flsi.lecture.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

   public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
      response.setContentType("text/html; charset=Shift_JIS");
      PrintWriter out = response.getWriter();
      out.println("<HTML>");
      out.println("<HEAD>");
      out.println("<TITLE>サーブレットのテストのページ</TITLE>");
      out.println("</HEAD>");
      out.println("<BODY bgcolor=\"#77ffff\" text=\"#fa5a00\">");
      out.println("<H1>vol.072 テスト・ページ</H1>");
      out.println("このページは、TestServletの出力です。");
      out.println("</BODY>");
      out.println("</HTML>");
   }

}
--------------------------------------------------------
すると、PrintWriterオブジェクトはShift_JISで書き出しを行ってくれます
ので、日本語の文字がちゃんと表示できるようになります。


(続く)



========================================================
◆ 02.演習問題
================================================

上のソース・コードのうち、

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

を、

response.setContentType("text/html");

に書き換えると、日本語の文字が正しく表示できなくなる(いわゆる
文字化けする)ことを確認してください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2007 Future Lifestyle Inc. 不許無断複製