サーブレットとは

サーブレットとはブラウザからのリクエストによって実行され、その実行結果をHTMLで出力します。出力されたHTMLは、アプリケーションサーバによってブラウザにレスポンスされます。

主にサーブレットは、動的なWEBプログラムを提供する技術でJava、データベース+サーブレット・JSPを組み合わせて利用します。

 

サーブレットクラスのルール

サーブレットクラスは、通常のクラスと同様にクラス定義を行って作成します。ただし、サーブレットクラスを定義するには、いくつか守らなければならないルールが存在します。

HelloServlet.java
// ルール3
import java .io.IOException;
import javax.servlet.ServletException;
import javax.servlet.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// ルール1
public class HelloServlet extends HttpServlet {
// ルール2
  protected void doGet (HttpServletRequest request,
       HttpServletResponse response) 
       throws ServletException, IOException {
    
  }
}

””
ルール1) javax.servlet.http.HttpServletクラスを継承します

HttpServletクラスはサーブレットクラスの「もと」となるクラスです。このクラスを継承することで、サーブレットクラスという特別なクラスを一から作成する必要がなくなります。このメソッドはスーパークラスであるHttpServletクラスのメソッドをオーバライドして作成します。長いですが、基本的にはこの形で利用します。

ルール2) doGet()メソッドをオーバーライドする

doGet()メソッドは、サーブレットクラスがリクエストされると実行されるメソッドです。
このメソッドはHttpServletクラスをオーバーライドして作成するので、宣言部分が非常に長くなりますが、基本的な形はこの形で覚えておきます。

ルール3) サーブレット関係のクラスをインポートする

サーブレット関係のクラスは、主に「java.servlet」と「javax.servlet.http」の両パッケージに入っています。この2つも基本形として、覚えておきます。

 

HttpServletRequest、HttpServletResponse

ブラウザからリクエストが届くと、アプリケーションサーバはサーブレットクラスのdoGet()を呼び出します。この時引数として渡されるHttpServletRequestはブラウザから届いた「リクエスト」、HttpServletResponse はサーバーから送り出すレスポンスに関連するインスタンスです。

サーブレットクラスでは基本的にHttpServletRequestインスタンスに格納されているリクエストの詳細情報を取り出し、計算などの様々な処理を行い、結果画面のHTML情報をHttpServletResponseインスタンスを用いてブラウザに送り返します。

WEBアプリケーション特有の処理のほとんどは、この2つのインスタンスを用いて実現することができます。

HTMLを出力

doGet()メソッド内には以下のようなコードを書きます。

protected void doGet(HttpServletRequest request,
  HttpServletResponse response) 
  throws ServletException, IOException {
  // 処理1
  response.setContentType("text/html; charset=UTF-8");
  // 処理2
  PrintWriter out = response.getWriter();
  out.println("");;
  out.println("…");
  out.println("");
} 

””
 処理1.Content-type ヘッダの設定

HttpServletResponseのsetContentType()メソッドを使用して、レスポンスのContent-Typeヘッダを指定する。指定する内容は、サーブレットクラスが出力するデータ内容に合わせます。HTMLを出力する場合は、「”text/html; charset=UTF-8″」などとします。

処理2.HTMLを出力

実行結果を出力する処理です。この処理はContent-typeヘッダの設定後にしなければなりません。

HttpServletResponseのgetWriter()メソッドで取得できるjava.io.PrinterWriterインスタンスの、println()メソッドで行ないます。

サーブレットクラスのコンパイルとインスタンス化

開発環境にEclipseを、そしてサーブレット&JSPを使っていれば、コンパイルとインスタンス化は特に気にする必要はありません。自動的にやってくれます。

サーブレットクラスの実行方法

サーブレットクラスのURL

http;.//<サーバー名>/<アプリケーション名>/<URLパターン>

URLパターンの設定方法

サーブレットクラスのURLパターンは「@WebServletアノテーション」で設定します。アノテーションはクラスやメソッドなどに関連情報を付加することができます。アノテーションで付加された情報は、外部ツールに読み込ませることが可能です。

サーブレットクラスに@WebServletアノテーションを加えると、アプリケーションサーバがそれを読み取り、URLパターンの設定を行います。

実行方法

方法1

ブラウザにURLを入力する

””
方法2

Eclipse内で「実行する」

””
方法3

サーブレットクラスへのリンクをクリックする

””

実行されると、doGet() もしくは doPost()など、指定したメソッドが実行されます。

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

/**
 * Servlet implementation class SampleServlet
 */
@WebServlet("/SampleServlet")
public class SampleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

        protected void doGet(HttpServletRequest request,
        		HttpServletResponse response)
        		throws ServletException, IOException {
        	// 運勢をランダムで決定する
        	String[] luckArray = {"超すっきり", "すっきり", "最悪"};
        	int index = (int) (Math.random() * 3);
        	String luck = luckArray[index];

        	// 実行日を取得
        	Date date = new Date();
        	SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日");
        	String today = sdf.format(date);

        	//HTMLを実行
        	response.setContentType("text/html; charset=UTF-8");
        	PrintWriter out = response.getWriter();
        	out.println("<html>");
        	out.println("<head>");
        	out.println("<title>すっきり占い</title>");
        	out.println("</head>");
        	out.println("<body>");
        	out.println("<p>" + today + "の運勢は「" + luck + "」です</p>" );
        	out.println("</body>");
        	out.println("</html>");
    }
}

 

実行すると、当日の日付、「超すっきり」or「すっきり」or 「最悪」のいずれかが出力されます。

もう一度実行してもまた異なる結果が出て、これが「動的」という意味合いですね。

 

今日は以上となります。

おすすめ: