サーブレットの基本ソースコード
では、作成された「MyServlet.java」のソースコードがどうなっているか、確認してみましょう。コメント類を省略すると、大体こんなものが生成されているはずです。
package jp.codezine; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { public MyServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ここにGET時の処理を書く } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // ここにPOST時の処理を書く } }
サーブレットは、HttpServletクラスを継承する形で作成されます。このHttpServletが、サーブレットの基本クラスとなります。またサーブレットクラスにはServletインターフェイスが実装されます。
ここでは「doGet」「doPost」という2つのメソッドが用意されていますが、これらがそれぞれGET/POSTでアクセスされた際に呼び出される処理を記述するものになります。これらは、必要なければ必ずしも両方定義する必要はありませんが、最低どちらか1つはないといけません(GETもPOSTもできないのでは、サーブレットにアクセスする方法がありませんので)。
ここではいろいろと新しいクラスなどが登場していますが、これらについては後述するとして、まずは簡単なサンプルを作成してみることにしましょう。ここでは、GETで呼び出されるdoGetメソッドを修正してみることにします。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Shift_JIS"); response.setContentType("text/html;charset=Shift_JIS"); ServletOutputStream out = response.getOutputStream(); out.println("<html><head><title>MyServlet</title>"); out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-31j\"></head>"); out.println("<body>※送信されたテキスト</body></html>"); out.flush(); }
メソッドを修正したら、サーバを起動しましょう。そして、以下のURLを直接アドレスバーに書いてアクセスしてみます。
- http://localhost:8080/myweb/myserv

これで、「※送信されたテキスト」と表示されましたか? これが、サンプルで作成したサーブレットの実行結果です。このサーブレットでは、次のようなHTMLテキストを送信する働きをしています。
<html><head><title>MyServlet</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"></head> <body>※送信されたテキスト</body></html>
サーブレットの3大オブジェクト
このサーブレットでは、3つの非常に重要なオブジェクトが登場します。doGetの引数をよく見てみましょう。次のような2つのオブジェクトが引数として渡されていますね。
HttpServletRequest request, HttpServletResponse response
またメソッド内では、この中のresponseというオブジェクトから、クライアント側へ出力するためのストリームを取得しています。以下の部分です。
ServletOutputStream out = response.getOutputStream();
このHttpServletRequest、HttpServletResponse、ServletOutputStreamの3つが、サーブレットで使われる最も重要なオブジェクトといってよいでしょう。サーブレットでの基本的な処理は、この3つのオブジェクトさえ理解していれば大抵行うことができます。では、これらの役割について整理しておきましょう。
- HttpServletRequest
- HttpServletResponse
- ServletOutputStream
では、この3つのオブジェクトの役割を念頭に置いた上で、doGetで実行している処理について見てみることにしましょう。
request.setCharacterEncoding("Shift_JIS");
まず、送られてきた情報(リクエスト)のキャラクタエンコーディングを設定しています。今回は、送られてきた情報は何もないので実は必要ないのですが、「サーブレットで行う処理の基本」として一応用意しておきました。実際には、リクエストから何かの情報を取り出したりしない場合は不要です。
response.setContentType("text/html;charset=Shift_JIS");
続いて、クライアントへの送信する情報のコンテンツタイプを設定します。これは重要です。これによって、「これからクライアントに返されるのは、HTMLのテキストデータですよ」ということをブラウザに伝えるのですから。これをきちんと行わないと、ブラウザによっては、どんな情報が送られてくるのかわからなくなり正しく送信情報を受け取れなくなってしまうこともあります。
ServletOutputStream out = response.getOutputStream();
response.getOutputStream()は、先に触れましたね。レスポンスから、クライアントへの出力を行うためのストリームを取り出します。ここまでが、実際の送信を行う前の下準備といっていいでしょう。
out.println("<html><head><title>MyServlet</title>");
後は、取得したServletOutputStreamのメソッドを使ってHTMLのテキストを出力します。ServletOutputStreamはOutputStreamを継承したクラスですから、おなじみのprintやprintlnといったメソッドが用意されています。これらを使ってテキストを出力すれば、それがそのままクライアントへと送られるわけです。必要なだけこれらの出力用メソッドを呼び出して、情報を送り出します。
out.flush();
最後に、ストリームをflushして作業終了です。flushは、出力ストリームを使う場合の基本マナーとして行っていますが、省略しても問題が起こることはまずありません。実際には、これは省略して書いている人も多いでしょう。
ここで行っているのは、クライアントへの送信で必要となる最も基本的な処理だけです。「requestのキャラクタエンコーディングを設定する」「responseのコンテンツタイプを設定する」「出力ストリームを得る」「outを使って出力を行う」――これらは、一連の手続きをセットとして覚えておくとよいでしょう。

html; charset=windows-31j\"></head>");
out.println(