サーブレットの処理結果としてなんらかの文字を出力するにはgetWriterという名称のメソッドを使用する必要がある。ここではその仕組みについて説明する。
文字出力用のストリームの取得の仕方
文字出力用のストリームの取得とは、HttpServletResponseオブジェクトから文字を出力する入れ物を取り出すことである。ストリームというのは文字が順番に連続して並んでいる入れ物のことである。取り出したストリームへ文字を書き出すと、それがクライアントに送られ、画面に表示される。
書き方の基本は簡単だ。
PrintWriterストリームの参照変数 = HttpServletResponseオブジェクト. getWriter();
実際のコードはこうなる。
PrintWriter out = response.getWriter();
ストリームを取り出したら、次に行うことはストリームに文字列を書き込むことである。取り出したストリームに書き込むためにPrintWriterクラスのメソッドが準備されている。
代表的なのがprintlnメソッドである。boolean型、char型、char[]型、int型、long型、float型、double型、String型の値を文字列としてストリームに出力する。その後、文字を出力した行を終了する。
書き方はこうである。
ストリームの参照変数.println(値);
実際のコードはこうなる。
out.println("ABCD");
もし、一行をいくつかに分けて出力する必要があるときは、最後の出力以外のメソッドをprintにすればよい。こうすれば行は終了しない。
ストリームの参照変数.print(値);
もし、上のABCDを連続して書いたprintlnのコードをふたつに分けて書いたとするとコードはこうなる。
out.print("AB");
out.println("CD");
他にも必要に応じて使えるメソッドがある。主要なメソッドとその特徴を挙げておく。詳細はPrintWriterクラスの仕様を参照してください。
文字列出用メソッド |
説明 |
append(値); |
Char型の文字かCharSequence型の文字列の値を、現在の文字列の後に追加する。 |
append(値、開始位置、終了位置); |
CharSequence型の文字列の値の開始位置から終了位置までを、現在の文字列の後に追加する。 |
printf(フォーマット、引数); |
値をフォーマットに従って文字列として出力する。 |
getWriterのAPI仕様
getWriter()
戻り値の型 |
java.io.PrintWriter |
内容 |
文字テキストをクライアントに送ることができるPrintWriterオブジェクトを戻す。PrintWriterは、getCharacterEncoding()メソッドによって戻される文字コードを使用する。もしレスポンスの文字コードが、getCharacterEncodingメソッドの仕様に従って指定されていないならば(すなわち、メソッドはデフォルト値ISO-8859-1だけを戻す)、getWriterメソッドはそれをISO-8859-1へと変更する。 PrintWriterのflush()メソッドと呼ばれるメソッドはレスポンスをコミットする。 このgetWriter()メソッドかgetOutputStream()メソッドのどちらかが、ボディを書くために呼び出されるかもしれないが、両方は呼び出されることはない。 戻り値:文字データをクライアントに戻すことができるPrintWriterオブジェクト 例外: java.io.UnsupportedEncodingException -もしgetCharacterEncoding()メソッドによって戻される文字コードが使用できないならば。 java.lang.IllegalStateException -もしgetOutputStreamメソッドが、このレスポンスオブジェクトのためにすでに呼び出されているならば。 java.io.IOException -もしインプットもしくはアウトプットの例外が起こるならば。 参照: getOutputStream(), setCharacterEncoding(java.lang.String) |
サンプルプログラム
このサンプルプログラムは、getWriterを使って文字出力用のストリームを取得し、そのストリームに様々なメソッドを使って値を出力する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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; @WebServlet("/GetWriter")//[1] public class ServletGetWriter extends HttpServlet {//[2] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] boolean booleanValue = true;//[4] char charValue = 'A';//[5] char[] charValues = {'B', 'C', 'D'};//[6] int intValue = 21;//[7] long longValue = 41L;//[8] double floatValue = 12.8f;//[9] double doubleValue = 56.78;//[10 String stringValue = "EFGHIJ";//[11] CharSequence charSequenceValue = stringValue;//[12] response.setContentType("text/html; charset=Shift_JIS");//[13] PrintWriter out = response.getWriter();//[14] out.println("<html><head></head><body>");//[15] out.println("<p>");//[16] out.print("append(char型の値) = ");//[17] out.append(charValue);//[18] out.println("<br>");//[19] out.print("append(CharSequence型の値) = ");//[20] out.append(charSequenceValue, 1, 3);//[21] out.println("</p>");//[22] out.println("<p>");//[23] out.print("printf(\"intValue = %d\", intValue) => ");//[24] out.printf("intValue = %d", intValue);//[25] out.println("</p>");//[26] out.println("<p>");//[27] out.print("print(booleanValue) = ");//[28] out.print(booleanValue);//[29] out.println("<br>");//[30] out.print("print(charValue) = ");//[31] out.print(charValue);//[32] out.println("<br>");//[33] out.print("print(charValues) = ");//[34] out.print(charValues);//[35] out.println("<br>");//[36] out.print("print(intValue) = ");//[37] out.print(intValue);//[38] out.println("<br>");//[39] out.print("print(longValue) = ");//[40] out.print(longValue);//[41] out.println("<br>");//[42] out.print("print(floatValue) = ");//[43] out.print(floatValue);//[44] out.println("<br>");//[45] out.print("print(doubleValue) = ");//[46] out.print(doubleValue);//[47] out.println("</p>");//[48] out.println("</body></html>");//[49] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/GetWriterを入力し、Enterを押す。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、HelloWorldクラスを定義する。
- [3] doGet()メソッドをオーバーライドして定義する。
- [4]-[12] 表示するために様々な型の変数を宣言する。
- [13] Content Typeを設定する。
- [14] 文字列出力用のストリームを出力するためにPrintWriterオブジェクトを取得する。
- [15] HTMLの画面の開始を宣言する。
- [16]-[22] appendメソッドを使って値を出力する。
- [23]-[26] printfメソッドを使って値を出力する。
- [27]-[48] printメソッドを使って値を出力する。
- [49] HTML画面終了を宣言する。
まとめ
この記事では実際にgetWiter()を使用して様々な文字出力が出来ることを確認した。サンプルプログラムを実際に動作させて確かめてみよう。また、サンプルプログラムを自由に書き換えてそれが出力結果にどう影響するかを確認してみよう。