Print Friendly, PDF & Email

サーブレットとは?

サーブレットの概念を図に表すと以下のようになります。

ブラウザからアプリケーションサーバにリクエストが送られると初回のみServletコンテナがJavaのクラスファイルを実行してサーブレットのインスタンスを作り、レスポンスを返します。

サーブレットのインスタンスはそれ以降アプリケーションサーバのメモリに常駐し、リクエストに対してレスポンスを返します。

リクエストはメソッドの違いに応じてサーブレットのdoGetメソッド、または、doPostメソッドを呼び出します。

サーブレットでHello World

ここでは、ひとまずサーブレットだけを単体で実行してみることにします。

JavaSEでも一番最初に学んだ「Hello World」をやってみましょう。

以下のようなサーブレットだけを作成して実行してみてください。

package p03;

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


@WebServlet(urlPatterns = {"/AdditionServlet"})
public class AdditionServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("Hello World");
    }
}

すると真っ白なブラウザの画面が表示されました。

(1回目は先述の通りサーブレットのインスタンスを作ったり、あるいはまたグラスフィッシュを立ち上げていますので時間がかかりますが、2回目以降は早くなるはずです。試してみてください。)

「Hello World」 はどこに表示されているのでしょうか?

実は、「出力」のタブに「GlassFish Server x.x.x」というタブがあり、このログとして表示されているのでした。

GlassFishのログ

このログは、JavaSEで言うところのプリントデバッグを行うことができ、また、各種エラーが表示されるところですから今後も頻繁に目にすることになるはずです。

ここでは決り文句は省略して、urlPatternsとdoGetメソッドという2つのポイントを解説します。

urlPatterns

11行目を再掲します。

@WebServlet(urlPatterns = {"/AdditionServlet"})

ここで注目は、urlPatterns です。

urlPatterns はこのサーブレットがどのようなURLの指定で呼び出せるかを規定しています。

アドレスバーを見ると以下のようになっています。

感の良い方は、 urlPatterns と複数形になっていることに気づかれた方もいらっしゃるかもしれません。

複数のURLのパターンを指定できるようになっています。

以下のように書き足してみましょう。

@WebServlet(urlPatterns = {"/AdditionServlet","/sample"})

そうすると以下のURL指定でこのサーブレットが実行できたはずです。

即ち、 urlPatternはクラス名とは無関係に付けることができます。

なお、同じプロジェクトの中に同じurlPatternを指定するとサーブレットも、JSPもHTMLさえも実行できなくなります

サーブレットをコピーして、うっかり urlPattern を書き換えるのを忘れていると起こります。

一度経験しておけば安心ですので、ぜひ、試してみてください。

コンテキストルート

なお、先頭の“/”を忘れるとGlassFishサーバーのログにエラーが出るはずですので試してみてください。

これは、コンテキストルートといいます。

サーブレットが呼び出される際のURLは以下のようになっています。

http://ホスト名:ポート番号/プロジェクト名/urlPattern

この時の、プロジェクト名と urlPattern の間の “/”がコンテキストルートです。

プロジェクト名はコンテキスト名と呼ばれることもあります。

contextとは英語で文脈という意味です。

文脈が変われば言葉の意味が変わるように、プロジェクトが変われば呼び出されるサーブレットも変わります。

Servletクラス

サーブレットはHttpServletクラスを継承して宣言されます。

この点に関してはルールですので特に深入りはしません。

doGetメソッド

次にdoGetメソッドを見ていきます。

doGetメソッドは HttpServletクラスのdoGetメソッドをオーラーライドしているためアノテーションを付けています。

このメソッド内で起きる可能性のある例外を呼び出し元に投げるためにthrowsキーワードが使われていますが、決り文句ですので深入りはしません。

doGetメソッドの引数は、HttpServletRequest型の変数名requestというインスタンスとHttpServletResponse型の変数名responseというインスタンスです

それぞれ、リクエストとレスポンスでやり取りされるオブジェクトのフィールドやメソッドが含まれています。

requestとresponseについては、今回の新人エンジニア研修で折に触れて紹介することになります。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    System.out.println("Hello World");
}

では「Hello World」をブラウザに表示するにはどうすればよいでしょうか?

それには、JSPにデータを渡す方法とJSPのEL式を使って表示する方法を学ぶ必要があります。

※本当はサーブレットでもHTMLの出力は可能ですが、MVCを学ぶという本研修の趣旨からは外れますので興味のある方はご自分で調べてください。

ブラウザでHello World

あるサーブレットからJSPへデータを渡すにはスコープというデータ領域を使います

scope(範囲)という名前の通り、データの有効範囲の異なる4種類のスコープがあるのですが、今回はそのうちの狭い方から2番めのrequestスコープを使います。

サーブレットではrequestのsetAttributeメソッドを使い値をスコープに保存します。

attributeには文字列はもちろん、オブジェクトであれば何でも入ります

そして、requestのforwardメソッドを使って指定のJSPにフォワード処理をします。

ちょうどサッカーのフォワードがボールを前に前に運ぶイメージです。

JSPでは、EL式を使ってその値をスコープから取り出して表示します。

次のようなサーブレットを作成して実行してみましょう。

ポイントは、17、18行目です。

まず、17行目でrequestスコープという保存領域にmessageという名前で"Hello World"という文字列のインスタンスを格納しています。

そして、18行目でrequestのgetRequestDispatcherメソッドを使いJSPにフォワード処理をしています。

メソッドチェーンを使い1行で書いています。

2行で書くこともできますが、シンプルですからこの書き方に慣れてください。

package p03;

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

@WebServlet(urlPatterns = {"/Hello"})
public class HelloServlet2 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setAttribute("message", "Hello World");
        request.getRequestDispatcher("03Servlet/result.jsp").forward(request, response);
    }
}

JSPには、論点を明確にするためにHTMLをすべて消して、EL式だけを記述することにします。

EL式は下記のように$で始めて波括弧の中にスコープで付けた名前(この例では”message")を書けば表示されます。

 ${message}

このとき、もちろんJSPだけを実行しても何も表示されません。

サーブレットからJSPにフォワードしないとHello Worldが表示されないことを確認してください。