教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

HelloWorld Servletの作成 (2)

HTMLのメッセージを日本語にしたServletプログラム(1)

次のプログラム HelloWorld2.java は、指定したWebサーバ下 のディレクトリ(アプリケーションのルートディレクトリ/build/web/WEB-INF/classes/パッケージ名)下に格納されているコンパイル済みのServletファイルを実行することで、 ブラウザ上にテキストを表示するプログラムである。


import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld2 extends HttpServlet {
        
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // HTMLを出力するので、setContentTypeメソッドでCONTENT-TYPEに
        // text/htmlを指定
        response.setContentType("text/html");
        // setContentTypeメソッドで設定した後、getWriterメソッドを
        // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得
        PrintWriter out = response.getWriter();
        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); 
        // 日本語のメッセージを表示したい
        out.println("</head>");
        out.println("<body>");
        out.println("HELLO!!サーブレットの世界にようこそ"); 
        // 日本語のメッセージを表示したい
        out.println("</body>");
        out.println("</html>");
        // closeメソッドを呼び出すと出力終了
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに格納されている コンパイル済みのServletファイルHelloWorld2.class(テキストファイルはHelloWorld2.java)を実行する。

プログラム HelloWorld2.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // HTMLを出力するので、setContentTypeメソッドでCONTENT-TYPEに
        // text/htmlを指定
        response.setContentType("text/html");
        // setContentTypeメソッドで設定した後、getWriterメソッドを
        // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得
        PrintWriter out = response.getWriter();
        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); 
        // 日本語のメッセージを表示したい
        out.println("</head>");
        out.println("<body>");
        out.println("HELLO!!サーブレットの世界にようこそ"); 
        // 日本語のメッセージを表示したい
        out.println("</body>");
        out.println("</html>");
        // closeメソッドを呼び出すと出力終了
        out.close();
    }
の中の、

        out.println("HELLO!!サーブレットの世界にようこそ"); 

は、HelloWorld1.javaでのメッセージ部分"Hello World"を "HELLO!! サーブレットの世界にようこそ"に置き換えた プログラムである。

しかし、HelloWorld2.javaを実行してみると、日本語の部分 が字化けして"?"になって表示されてしまう。

日本語を表示するServletプログラム(charsetの指定)

次のプログラム HelloWorld3.java は、指定したWebサーバ下 のディレクトリ(アプリケーションのルートディレクトリ/build/web/WEB-INF/classes/パッケージ名)下に格納されているコンパイル済みのServletファイルを実行することで、 ブラウザ上にテキストを表示するプログラムである。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld3 extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // HTMLを出力するので、setContentTypeメソッドでCONTENT-TYPEに
        // text/htmlを指定
        response.setContentType("text/html; charset=UTF-8"); 
    // charsetで表示文字コードにUnicode(UTF-8)を使うことを指定
        // setContentTypeメソッドで設定した後、getWriterメソッドを
    // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得
        PrintWriter out = response.getWriter(); 
        // UTF-8で表示するPrintWriterオブジェクトを取得できる
        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        // printlnを呼び出すと、メッセージがUnicode(UTF-8)で表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); 
        // 日本語のメッセージを表示したい
        out.println("</head>");
        out.println("<body>");
        out.println("HELLO!!サーブレットの世界にようこそ"); 
        // 日本語のメッセージを表示したい
        out.println("</body>");
        out.println("</html>");
        // closeメソッドを呼び出すと出力終了
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに格納されている コンパイル済みのServletファイルHelloWorld3.class(テキストファイルはHelloWorld3.java)を実行する。そうすると、ブラウザ上に"HELLO!!サーブレットの世界にようこそ"というテキストが表示される。

プログラム HelloWorld3.java の説明

processRequestメソッドにおいて、

        response.setContentType("text/html; charset=UTF-8"); 
では、HTMLを出力するために、setContentTypeメソッドでCONTENT-TYPEに "text/html"を指定し、charsetでは表示文字コードにUTF-8 (Unicode) を使うことを指定している。 Javaプログラムの中では、文字をUnicodeという文字コードで表現 している。これをブラウザで表現する場合には、通常のブラウザで 取り扱える文字コードに変換する必要がある。Servletコンテナでは、 デフォルトでは、ISO-8859-1という文字コードに変換することに なっている。 このような理由で、日本語を表示できる文字コードに変換することが 必要になってくる。そのために、setContentTypeメソッドにより、 "charset=文字コード"を追加することで指定する。

テキスト(日本語)を表示するServletプログラム(2) 

次のプログラム PrintText1.java は、指定したWebサーバ下 のディレクトリ(アプリケーションのルートディレクトリ/build/web/WEB-INF/classes/パッケージ名)下に格納されているコンパイル済みのServletファイルを実行することで、 ブラウザ上にテキストを表示するプログラムである。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PrintText1 extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
          HttpServletResponse response)
          throws ServletException, java.io.IOException {
        response.setContentType("text/html; charset=UTF-8"); 
        // text/htmlではHTMLとみなされてしまう
        PrintWriter out = response.getWriter();
        // 普通のテキストを出力する
        out.println("これはテキストです。");
        out.println("  この行はインデントしています。");
        out.println("    ・箇条書きにしてみました。");
        out.println("    ・同じく箇条書きです。");
        out.println("テキスト終わりです。");
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納されているコンパイル済みのServletファイルPrintText1.class(テキストファイルは PrintText1.java)を実行する。そうすると、出力として、ブラウザ上に HTML文章ではなく、普通の日本語テキストテキストが表示される。

プログラム PrintText1.java の説明

processRequestメソッドの

        response.setContentType("text/html; charset=UTF-8"); 
によって、Content-Typeが"text/html"と設定されるので、 出力がHTMLメッセージとみなされる。

出力として、Printerオブジェクトのprintlnメソッドの引数として与えられる メッセージは、

        out.println("これはテキストです。");
        out.println("  この行はインデントしています。");
        out.println("    ・箇条書きにしてみました。");
        out.println("    ・同じく箇条書きです。");
        out.println("テキスト終わりです。");
        out.close();
のように記述され、ブラウザに表示される。

ブラウザは、Servletからテキストデータを受け取り、HTML と解釈して表示をおこなう。

テキスト(日本語)を表示するServletプログラム(2) 

次のプログラム PrintText2.java は、指定したWebサーバ下 のディレクトリ(アプリケーションのルートディレクトリ/WEB-INF/classes) 下に格納されているコンパイル済みのServletファイルを実行することで、 ブラウザ上にテキストを表示するプログラムである。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class PrintText2 extends HttpServlet {
    
    /** Processes requests for both HTTP <code>GET</code> and 
     * <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        response.setContentType("text/plain; charset=UTF-8"); 
        // テキストなので、text/plainを指定する
        PrintWriter out = response.getWriter();
        // 普通のテキストを出力する
        out.println("これはテキストです。");
        out.println("  この行はインデントしています。");
        out.println("    ・箇条書きにしてみました。");
        out.println("    ・同じく箇条書きです。");
        out.println("テキスト終わりです。");
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }  
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納されているコンパイル済みのServletファイルPrintText2.class(テキストファイルは PrintText2.java)を実行する。そうすると、出力として、ブラウザ上に HTML文章ではなく、普通の日本語テキストテキストが表示される。

プログラム PrintText2.java の説明

processRequestメソッドの

        response.setContentType("text/plain; charset=UTF-8"); 
によって、Content-TypeがMIMEタイプである、"text/plain"と設定されるので、 出力が単なるテキストメッセージとみなされる。

出力として、Printerオブジェクトのprintlnメソッドの引数として与えられる メッセージは、

        out.println("これはテキストです。");
        out.println("  この行はインデントしています。");
        out.println("    ・箇条書きにしてみました。");
        out.println("    ・同じく箇条書きです。");
        out.println("テキスト終わりです。");
        out.close();
のように表現され、ブラウザに整形表示される。

ブラウザは、Servletからテキストデータを受け取り、MIMEの テキストデータと解釈して表示をおこなう。

演習

問題-1

上のプログラム HelloWorld2.java をIDEとしてNetBeansを 使って実行して、文字化けしていることを確認せよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-2

上のプログラム HelloWorld3.java をIDEとしてNetBeansを 使って実行して、日本語のテキストがうまく表示していることを確認せよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-3

上のプログラム PrintText1.java をIDEとしてNetBeansを 使って実行してみよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-4

上のプログラム PrintText2.java をIDEとしてNetBeansを 使って実行してみよ。そして、ブラウザの表示結果を、PrintText1.java と比較せよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

システムプログラミング演習


nagai