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

HelloWorld Servletの作成 (1)

Servletプログラムの基本構造を理解しよう (1)

次のプログラム HelloWorld0.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 HelloWorld0 extends HttpServlet {
    public void doGet(HttpServletRequest request, 
         HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // HTMLを出力するので、setContentTypeメソッドで
        // CONTENT-TYPEにtext/htmlを指定
        response.setContentType("text/html;charset=UTF-8");

        // setContentTypeメソッドで設定した後、getWriterメソッドを
        // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト
        // を取得
        PrintWriter out = response.getWriter();

        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("Hello World!");
        out.println("</body>");
        out.println("</html>");
        // closeメソッドを呼び出すと出力終了
        out.close();
    }
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納されているコンパイル済みのServletファイルHelloWorld0.class(テキストファイルはHelloWorld0.java)を実行する。そうすると、ブラウザ上に"Hello World"というテキストが表示される。

プログラム HelloWorld0.java の説明

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;
では、HelloWorld.javaにおいて、Java APIとServlet APIを構成する クラスライブラリ(パッケージ)を使えるように宣言している。

クラス定義は、次のようにおこなわれる。

public class HelloWorld0 extends HttpServlet {
ここでは、HelloWorld0クラスが定義される。通常のServletは、 HttpServletクラスを拡張して定義することが多く、HelloWorld0.java でも、HttpServletクラスを拡張する。

HelloWorld0.javaでは、クライアントからの要求をGETメソッドで 受け取るために、doGetメソッドに処理を記述する。 POSTメソッドの場合には、doPostメソッドに処理を記述する。

    public void doGet(HttpServletRequest request, 
         HttpServletResponse response)
    throws ServletException, java.io.IOException {
        // HTMLを出力するので、setContentTypeメソッドで
        // CONTENT-TYPEにtext/htmlを指定
        response.setContentType("text/html;charset=UTF-8");

        // setContentTypeメソッドで設定した後、getWriterメソッドを
        // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト
        // を取得
        PrintWriter out = response.getWriter();

        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("Hello World!");
        out.println("</body>");
        out.println("</html>");
        // closeメソッドを呼び出すと出力終了
        out.close();
    }
以下では、doGetメソッドの内容を説明する。 doGetメソッドは、ServletにHTTPのGETメソッドで アクセス時に、Servletコンテナから呼び出されるメソッドである。 ブラウザから普通にアクセスすると、このメソッドが呼び出される。 doGetメソッドは、引数にHttpServletRequest オブジェクトとHttpServletResponseオブジェクトをとる。前者の オブジェクトには、Servletの入力が格納され、後者のオブジェクト には、Servletからの出力が格納される。  
    public void doGet(HttpServletRequest request, 
         HttpServletResponse response)
         throws ServletException, java.io.IOException {

このメソッドの処理を以下で説明する。 まず、Servletからの出力データ(ここでは、HTML文書)の形式を 指定するために、以下のように、HttpServletResponseオブジェクト のsetContentTypeメソッドを呼び出す。

        response.setContentType("text/html;charset=UTF-8");

次に、setContentTypeメソッドで設定した後、以下のように、 getWriterメソッドを呼び出して、ブラウザへの表示に使う PrintWriterオブジェクトを取得する。

        PrintWriter out = response.getWriter();

そして、以下では、上記で取得したPrintWriterオブジェクトの printlnメソッドが呼び出され、引数で渡したメッセージが ブラウザに表示される。

        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("Hello World!");
        out.println("</body>");
        out.println("</html>");

出力が終わると、PrintWriterオブジェクトのcloseメソッドを呼び出し て、Servletからの出力を終了する。

このServletは、以下のようなHTML文を出力する。

<!DOCTYPE html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World!
</body>
</html>

Servletプログラムの基本構造を理解しよう (2)

次のプログラム HelloWorld1.java は、HelloWorld0.javaと同様に、指定したWebサーバ下のディレクトリ (アプリケーションのルートディレクトリ/ソースパッケージ/パッケージ名)下に 格納されており、ブラウザ上にテキストを表示するプログラムである。

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 HelloWorld1 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");
        // setContentTypeメソッドで設定した後、getWriterメソッドを
        // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト
        // を取得
        PrintWriter out = response.getWriter();
        // PrintWriterオブジェクトのprintlnメソッドの引数で渡した
        // メッセージがブラウザに表示される
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");  
        out.println("</head>");
        out.println("<body>");
        out.println("Hello World!");
        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";
    }
    
}

プログラム HelloWorld1.java の説明

以下では、HelloWorld0.javaと異なる部分のみ説明する。 processRequestメソッドは、doGetメソッドとdoPostメソッドで 呼び出されるメソッドを定義している。両者のメソッドでおこなう 処理を共通にするために、processRequestメソッドとしてひとつの メソッドとして実装している。

    protected void processRequest(HttpServletRequest request, 
      HttpServletResponse response)
    throws ServletException, java.io.IOException {

processRequestメソッドの処理の詳細は、上述したHelloWorld0.javaの doGetメソッドの処理の定義と同様である。

通常、Servletでは、doGetメソッドとdoPostメソッドのどちら かは必ず存在すると考えられる。HelloWorld1.javaでは、 Servletでおこなう処理の内容を共通化して、同じ処理が doGetメソッドとdoPostメソッドでおこなわれるように している。

doGetメソッドは、上述したHelloWorld0.javaのdoGetメソッドと 同様に、引数にHttpServletRequestオブジェクトとHttpServletRequest オブジェクトを取る。前者のオブジェクトには、Servletへの入力が、 後者のオブジェクトにはServletからの出力が格納される。doGetメソッド の処理では、上述したprocessRequestメソッドを呼び出す。

    protected void doGet(HttpServletRequest request, 
             HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

doPostメソッドは、ServletにHTTPリクエストのPOSTメソッドで アクセスされた時に、Servletコンテナから呼び出される。 通常、HTMLフォームを使ってブラウザからアクセスする時に、 このメソッドが呼び出される。doPostメソッドの処理でも、doGet メソッドと同様に、上述したprocessRequestメソッドを呼び出す。

    protected void doPost(HttpServletRequest request, 
             HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }

getServletInfoメソッドは、Servletに関する説明を表示する 場合に用いる。

    public String getServletInfo() {
        return "Short description";
    }

問題-1

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

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

問題-2

上のプログラム HelloWorld0.java で、ブラウザに出力 するテキストを"Hello Servlet!"、それからブラウザのタイトルを "Servlet exercise”としたプログラムをHelloServlet.javaとして 実行してみよ。

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

問題-3

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

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

問題-4

変数に1と3と10を代入して、これらの合計を計算して、「Ans= ?」 と出力するServletプログラムSumServlet.javaを作成し、 実行せよ。

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

問題-5

変数に0以上1未満の乱数を代入して、「random=?」と表示する ServletプログラムRandServlet.javaを作成し、 実行せよ。

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

問題-6

変数に1から100までの乱数整数を代入して、「random integer=?」 を表示するServletプログラムRandServlet1.javaを作成し、 実行せよ。

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

問題-7

100以上1000未満までの偶数整数(100,102,....,996,998)の合計を計算して、 「even sum = ?」を表示する ServletプログラムEvenSumServlet.javaを作成し、 実行せよ。

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

問題-8

while文を使って100以上1000未満までの奇数整数(101,103,....,997,999) の合計を計算して、「odd sum = ?」を表示する ServletプログラムOddSumServlet.javaを作成し、 実行せよ。

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

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


nagai