5.doGetとHtml出力

doGetは GETリクエスト(普通にブラウザからURLを指定されてアクセスされた場合や、フォームなどのActionにGETが指定されてリクエスト場合など)がきた場合の処理を記述します。

(1) doGet メソッドの構文


doGet メソッドの構文は次のとおりです。

protected void doGet(HttpServletRequest req,
                      HttpServletResponse resp)
              throws ServletException, java.io.IOException

HttpServletRequest req : クライアントがServletへ要求したリクエスト内容 HttpServletResponse resp : Servletがクライアントに返すレスポンス内容等 ServletException : GETに相当するリクエストが処理できない場合 IOException : ServletがGETリクエストの処理中に入出力エラーが発生


(2) ブラウザからURL指定時の確認


 特定のポートを見張っていて、アクセスがあった際にそのアクセス内容を表示する例から、ブラウザからどのようにコマンドが送られてくるか確認してみます。 ( Java アプリケーションとして作成 )

// PortCheck.java
import java.io.*;
import java.net.*;

public class PortCheck{
 public static void main(String argv[]) throws IOException{
    String gyo;
    ServerSocket ss = new ServerSocket(5555);

    while(true){
      Socket s = ss.accept();
      BufferedReader br = new BufferedReader(
        new InputStreamReader(s.getInputStream()));
      PrintWriter pw = 
        new PrintWriter(s.getOutputStream(),true);
      pw.println("<html><head></head><body>");
      pw.println("Access port 5555!");
      pw.println("</body></html>");
      while(!(gyo = br.readLine()).equals("")){
        System.out.println(gyo);
      }
      s.close();
    }
  }
}


 実際に実行させてみます。

C:\java_test>javac PortCheck.java
C:\java_test>java PortCheck
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg,
                          image/pjpeg, application/vnd.ms-
excel,application/msword,application/vnd.ms-powerpoint,*/*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent:Mozilla/4.0(compatible;MSIE 5.5;Windows NT 5.0)
Host: 127.0.0.1:5555
Connection: Keep-Alive



 ブラウザを開いて作成したサブレットのプログラムを、次のようにURLで指定してください。 画面に「Access port 5555! 」が表示され、同時に、MS-DOS には、GET / HTTP/1.1 以下が表示されます。

  http://127.0.0.1:5555/

 ブラウザからアクセスした時には"GET / HTTP/1.0"というGETコマンドが送られているのが分かります。Servletに対してアクセスする場合も同様で、 GETコマンドを使ってデータの要求がありますので、GETコマンドが送られてきた時に、doGet メソッドが実行されて要求を読み取り結果を返すといった処理が行われます。

※Servletでは「GET」の要求があった時に、 doGetメソッドを呼び出すようです。


(3) Html 文書の送出

 サーブレットで処理した結果は HttpServletResponse resp に返します。その使い方について説明します。

protected void doGet(HttpServletRequest req, 
                      HttpServletResponse resp)
              throws ServletException, java.io.IOException

引数  HttpServletResponse resp  サーブレットで処理した結果


※HttpServletResponse は、その親であるServletResponseインターフェースの方で定義されています。

 (3)-1.ContentTypeを指定します
ServletResponseクラスのsetContentTypeメソッドを使ってMIMEタイプと文字符号化方法(Charset)を指定します。

構文 :  public void setContentType(java.lang.String type)

引数 : type - a String specifying the MIME type of the content


例 : resp.setContentType("text/html; charset=Shift_JIS");



MIMEタイプとCharset には、次のような種類(一部)があります。

シフトジス"text/html;charset=Shift_JIS"
一般的なJIS"text/html;charset=ISO-2022-JP"
EUC"text/html;charset=EUC-JP"
テキスト形式"text/plain"
GIFイメージ形式"image/gif"



 (3)-2.Writer を取得します
次に実際にデータを書き出すためのWriterを取得します。文字を書きだすのであれば getWriter()メソッドを使ってPrintWriterを取得します。

構文   :  public java.io.PrintWriter getWriter()
                            throws java.io.IOException
引数   :  なし
戻り値 :  a PrintWriter object 
             that can return character data to the client


例 : PrintWriter out = resp.getWriter();



画像などのバイナリを書き出すのであればgetOutputStream()を使ってServletOutputStreamを取得します。

この取得したPrintWriterなりServletOutputStreamなりに対してデータを書き出すことで、呼び出し元にデータを返すことができます。


 (3)-3.データを書き出します
HTML文書を返す場合には、先ほどのgetWriterメソッドで取得したPrintWriterに対して"println"メソッドでデータを書きだしてあげます。今までの説明を含めて、実際には次のようになります。

// 例  SanServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SanServlet extends HttpServlet {

  public void doGet(HttpServletRequest req, 
                     HttpServletResponse resp)
              throws ServletException, java.io.IOException{

    resp.setContentType("text/html;charset=Shift_JIS");
    PrintWriter out = resp.getWriter();

    out.println("<html>");
    out.println("<head><title>タイトル</title></head>");
    out.println("<body>");
    out.println("Hello World!");
               :
    out.println("</body></html>");

    out.close();
  }
}



書き出しが終わったら、PrintWriterをcloseします。

以上が基本的なdoGetが呼び出されたときにHTML文書を返す場合の手順となります。


次の章(4.サーブレットの構造)  次の章(6.doPostとForm処理)