今回は前回作成した「HelloWorldServlet」を基にし、サーブレットの作成方法について詳しく見ていきます。
サーブレットを動作させるためにはそのための実行環境、すなわちTomcatというWebコンテナが必要です。そして、Webコンテナからサーブレットを呼び出すためにはHttpServletクラスを継承する必要があります。
また、Webクライアント(ここではブラウザ)がWebサーバーへのHTTPリクエストにメソッド種類「Get」を指定した場合、、そのリクエストを受けると、最初にdoGetメソッドが呼び出されます。
サーブレットからWebクライアントへ結果を送信する場合は、PrintWriterクラスのprintlnメソッドで行います。
これらを前提に、もう一度前回作成した「HelloWorldServlet」のJavaソースファイルを見ていきます。
package sample_pkg01; 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; /** * Servlet implementation class HelloWorldServlet */ @WebServlet("/HelloWorldServlet") public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloWorldServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("<p>First Servlet</p>"); out.println("</body></html>"); } }
パッケージのインポート
サーブレットを作成する上で必要となるクラスは「javax.servlet.http」に含まれています。
インポート部分は基本的にEclipseにより自動生成されるため実際に記述する必要はないところではありますが、サーブレットを作成していく上で、何をインポートする必要があるのかを理解しておく必要があります。
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;
まずサーブレットを作成する上で大前提となるのがHttpServletクラスとなります。
前述しましたが、作成するクラスをサーブレットとして定義するためには、HttpServletクラスを継承する必要があります。
HttpServletRequestクラスとHttpServletResponseクラスは、doGetメソッドの引数として受け渡されます。上記サンプルではそれぞれ「request」と「response」という変数名で定義しています。(Javaではそれらの変数のことをインスタンスと呼びます。)
HttpServletRequestクラスのインスタンス(オブジェクト)にはサーブレットに対して送られてきたリクエストに含まれる、フォームなどで設定されたパラメータやクッキーなどの情報が格納されています。今回の例では特に使用していませんが、必要に応じて使用します。
HttpServletResponseクラスのインスタンスは、サーブレットからWebクライアントへデータを返信するために使用します。
HttpServletクラスの例外処理準備として、ServletExceptionクラスとIOExceptionクラスをインポートします。
PrintWriterクラスは、Webクライアントへデータを返信する際に、HttpServletResponseクラスとともに使用します。
doGetメソッドの実装
これも前述しましたが、WebクライアントがWebサーバーへのHTTPリクエストのメソッド種類が「Get」であれば、リクエストを受けると、最初にdoGetメソッドが呼び出されます。もし、メソッド種類が「Post」であれば、doPostメソッドが呼び出されます。
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("<p>First Servlet</p>"); out.println("</body></html>"); }
本サンプルでは、doGetメソッド内で、「HelloWorld!」文字列を含んだHTML文を出力しています。
そのHTML文がWebクライアント(ブラウザ)に返され、クライアントの画面上に「HelloWorld!」文字列が表示されます。
PrintWriter out = response.getWriter();
上記のように、doGetメソッドの引数で受け取ったHttpServletResponseクラスのインスタンス(response)をPrintWriterクラスに委譲※することで、Webクライアントへ送信できるようになります。
※委譲とは、ある処理を別のオブジェクトに委ねることで別のオブジェクトの処理を再利用する手法のことです。
あとは、printlnメソッドの引数に出力したい文字列を指定します。
out.println("<html>");
本サンプルでは、HTMLタグを順番に出力しており、Webクライアントには下記HTMLが返されます。
<html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> <p>First Servlet</p> </body></html>