■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |