文字出力用のストリームの取得(getWriter)

広告

コンテンツタイプを設定したら、クライアントに対してデータ本文を送ります。データを送信するには出力用のストリームを取得し、そのストリームに書き出していきます。

出力ストリームを取得するには「HttpServletResponse」インターフェースの親インターフェースである「ServletResponse」インタフェースで定義されている「getWriter」メソッドを使います。

Returns a PrintWriter object that can send character text to the client. 
The PrintWriter uses the character encoding returned by 
getCharacterEncoding(). If the response's character encoding has not been 
specified as described in getCharacterEncoding (i.e., the method just 
returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1. 

Calling flush() on the PrintWriter commits the response. 

Either this method or getOutputStream() may be called to write the body, 
not both. 

Returns:
  a PrintWriter object that can return character data to the client 
Throws: 
  UnsupportedEncodingException - if the character encoding returned 
    by getCharacterEncoding cannot be used 
  java.lang.IllegalStateException - if the getOutputStream method 
    has already been called for this response object 
  java.io.IOException - if an input or output exception occurred

このメソッドによってクライアントに対して文字を出力するための「PrintWriter」クラスのオブジェクトを取得出来ます。使い方としては次の通りです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();

    /* ... */
  }
}

「PrintWriter」クラスのオブジェクトは、文字を出力する時にコンテンツタイプに設定されている文字セットを使ってエンコーディングしていきます。そのため「getWriter」メソッドを実行する前に「setContentType」メソッド又は「setCharacterEncoding」メソッドで文字コードを設定しておく必要があります。

文字コードが設定されていない場合は「ISO-8859-1(Latin1)」が設定されているものとしてエンコードします。

文字データを出力するためのストリームではなくバイナリデータの出力するためのストリームを取得する場合は「getOutputStream」メソッドを使います。詳しい使い方は別のページで見ていきますが、同じ「HttpServletResponse」インターフェースのオブジェクトに対して「getWriter」メソッドと「getOutputStream」メソッドの両方のメソッドを実行することは出来ません。(例外「IllegalStateException」が発生します)。

文字コードを設定しなかった場合はデフォルトの値として「ISO-8859-1」いわゆるLatin1が設定されます。日本語を扱うデータの場合デフォルトの文字コードのままでは文字化けしますので注意して下さい。

PrintWriterクラス

「PrintWriter」クラスについても簡単に見ておきます。クラス定義は下記のようになっています。

  • java.lang.Object
  • java.io.Writer
  • java.io.PrintWriter
  • public class PrintWriter extends Writer

主なメソッドは「print」メソッドと「println」メソッドです。この2つのメソッドの違いは文字を出力した後に改行するかどうかです。それぞれのメソッドの引数には各データ型に対応したものがそれぞれ用意されていますので、データ型を意識することなく利用できます。

メソッド説明
void println(boolean x)boolean 値を出力して、行を終了します。
void println(char x)文字を出力して、行を終了します。
void println(char[] x)文字の配列を出力して、行を終了します。
void println(double x)倍精度の浮動小数点数を出力して、行を改行します。
void println(float x)浮動小数点数を出力して、行を改行します。
void println(int x)整数を出力して、行を終了します。
void println(long x)long 整数を出力して、行を終了します。
void println(Object x) Object を出力して、行を終了します。
void println(String x)String を出力して、行を終了します。
void println()改行文字列を書き込むことによって、現在の行を改行します。

またその他のメソッドとして「close」メソッドや「flush」メソッドなどがあります。

「close」メソッド:

ストリームを閉じます。

「flush」メソッド:

ストリームをフラッシュします。

使い方としては今までのサンプルでも使っていますが次のようになります。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ResponseSample2 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

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

    out.println("<html>");
    out.println("<head>");
    out.println("<title>サンプル</title>");
    out.println("</head>");
    out.println("<body>");

    out.println("<p>Sample Page</p>");
    out.println("<p>サンプルページ</p>");

    out.println("</body>");
    out.println("</html>");

    out.close();
  }
}

( Written by Tatsuo Ikura )