応答オブジェクトのメソッド一覧
|
|
応答には、ServletResponseと、これをHTTP用にサブクラス化したHttpServletResponseの二つのインターフェイスが存在する。Servlet V2.2仕様書に規定されているこれらのメソッドの一覧を下表に示す。面倒でもひととおり読んで頂きたい。
正確にはhttp://java.sun.com/products/servlet/2.2/javadoc/index.html参照のこと
public interface ServletResponse |
|
public String getCharacterEncoding(); |
この応答に送られるMIMEボディに使われている文字セットの名前を返す。文字セットが指定されていなければ、暗黙的にISO-8859-1
(Latin-1)がセットされているものとする。MIMEと文字エンコーディングに関してはRFC 2047
(http://ds.internic.net/rfc/rfc2045.txt) を参照のこと。コンテナはMIMEボディを指定された文字セットに変換したのちそれをHTTP応答としてクライアントに返す。 |
public ServletOutputStream getOutputStream()
throws IOException; |
バイナリ・データを応答に書くのに適しているServletOutputStreamを返す。このメソッドかgetWriter()のどちらを使っても良いが同時には使用できない。 java.lang.IllegalStateException - getWriterメソッドがすでに使われてしまっている。 java.io.IOException
– 入出力の例外が発生した。 |
public PrintWriter getWriter() throws
IOException; |
クライアントに文字テキストを送るためのPrintWriterオブジェクトを返す。使われる文字エンコードには、setContentType(java.lang.String)
メソッドのcharset= プロパティで指定したものが使われる。従ってこのメソッドを呼ぶ前にsetContentTypeメソッドが呼ばれていなければならない。 必要なら、応答のMIMEタイプは使われている文字エンコーディングに対応して変更してよい。
getOutputStream()のどちらも呼び出し可能であるが同時には使用できない。 java.lang.IllegalStateException – getOutputStreamメソッドがすでに呼ばれている。 java.io.IOException – 入出力の例外が発生した。 |
public void setContentLength(int length); |
応答のコンテント・ボディの長さをセットする。HTTPサーブレットの場合、HTTPのContent-Lengthヘッダをセットする。 |
public void setContentType(String type); |
クライアントに送信される応答のコンテントの形式をセットする。このコンテント・タイプには、text/html;
charset=ISO-8859-4というように、使われている文字エンコーディングも含めることができる。コンテナは指定されたエンコーディングにコンテントを変換したのちHTTP応答としてクライアントにこれを返す。 |
public void setBufferSize(int size); |
応答のボディ部のための欲しいバッファ・サイズをセットする。サーブレット・コンテナは少なくともこの要求されたサイズのバッファを使う。実際に使われているバッファのサイズはgetBufferSizeメソッドを使って知ることができる。より大きなバッファを使えば実際に何かが送信される前にコンテンツを より多く書き込むことができるが、このサーブレットがしかるべきステータスコードや応答ヘッダ行をセットするのに時間を要する。バッファを小さくするとメモリ負荷を低減しクライアントがより速くデータを受信することができる。このメソッドは応答ボディのコンテンツが書き込まれる前に呼ばれなければならない。コンテンツが既に書き込まれている場合はIllegalStateExceptionがスローされる |
public int getBufferSize(); |
この応答の為に実際に使われているバッファ・サイズを返す。バッファリングがされていないときは0を返す。 |
public void reset(); |
現在までにセットされたバッファ中の全てのデータをクリアするとともに、ステータス・コードやヘッダもクリアする。この応答が既にコミットされている(クライアントに送信をはじめている)ときはIllegalStateExceptionをスローする。 |
public Boolean isComitted(); |
この応答がコミットされてしまっているかをブール値で返す。コミットされている応答とはそのステータスコードやヘッダ行が送信済みであることを示す。 |
public void flushBuffer() throws
IOException; |
既に書き込まれているバッファの内容をクライアントに送出する。このメソッドが呼ばれるとこの応答は自動的にコミットされ、ステータスコードやヘッダ行が送出される。 |
public void setLocale(Locale locale); |
この応答のロケールをセットする。しかるべきContent-Typeのcharsetがセットされる。このメソッドはgetWriter()を呼ぶ前に呼ばれなければならない。デフォルトはこのサーバのデフォルトのロケールである。. |
public Locale getLocale(); |
この応答に割り当てられたロケールを返す。 |
public interface HttpServletResponse extends ServletResponse |
|
public void addCookie(Cookie cookie); |
指定されたクッキーを応答に付加する。複数のクッキーをセットするためにこのメソッドを繰り返し呼ぶことが可能である。 |
public Boolean containsHeader(String name); |
指定された応答ヘッダが既にセットされているかどうかを返す。 |
public String encodeURL(String url); |
セッションIDを含める指定されたURLをエンコードする。エンコーディングの必要の無いときはそのままのURLが返る。このメソッドの実装によりセッションIDをURLにエンコードするか否かを決めるロジックを含ませている。例えば、ブラウザがクッキーをサポートしているか、あるいはセッショントラッキングがオフとなっているときはURLエンコーディングは不要である。問題の生じないセッショントラッキングのためにはサーブレットから送出される全てのURLはこのメソッドを通すべきである。でないと、URL再書き込みはクッキーをサポートしないブラウザと一緒に使うことは出来ない。 |
public String encodeRedirectURL(String url); |
SendRedirectメソッドの為に指定したURLをエンコードする。エンコーディングの必要がなければ指定したURLがそのまま返される。 このメソッドの実装はセッションIDがURLにエンコードされるか否かを決めるロジックを含ませている。これの決定のルールは通常のリンクのエンコードをするかどうかを決めるルールと異なるので、このメソッドはencodeURLと別になっている。
HttpServletResponse.sendRedirectメソッドに送る全てのURLはこのメソッドを通すべきである。でないと、URL再書き込みはクッキーをサポートしないブラウザと一緒に使うことは出来ない。 |
public void sendError(int status) throws
IOException; |
指定されたステータスコードのエラー応答をクライアントに返す。一般的にサーバは通常のサーバ・エラーと似たような応答を生成する。応答が既にコミットされていると、IllegalStateException例外をスローする。このメソッドを使った後は、この応答はすでにコミットしたものとしてこれに書き込んではならない。 |
public void sendError(int status, String
message) throws IOException; |
指定されたステータスコードと、それを意味するメッセージからなるエラー応答をクライアントに返す。一般的にサーバは通常のサーバ・エラーと似たような応答を生成する。応答が既にコミットされていると、IllegalStateException例外をスローする。このメソッドを使った後は、この応答はすでにコミットしたものとしてこれに書き込んではならない。 |
public void sendRedirect(String location)
throws IOException; |
指定されたリダイレクト位置のURLで、一時的なリダイレクト応答をクライアントに送出する。このメソッドは相対URLを受理できる。サーブレット・コンテナはこの相対URLをクライアントに応答を送出する前に絶対URLに変換する。応答が既にコミットされているときは、
IllegalStateExceptionがスローされる。このメソッドを使った後は、この応答はすでにコミットしたものとしてこれに書き込んではならない。 |
public void setDateHeader(String headername,
long date); |
指定した名前とdate値をもつヘッダ行をセットする。Dateはこのエポックからのミリ秒で指定する。このヘッダが既にセット済みの場合は、新しい値で書き換えられる。値をセットする前にヘッダの存在を調べるにはcontainsHeaderメソッドを使う。 |
public void setHeader(String headername,
String value); |
指定した名前と値をもつヘッダ行をセットする。このヘッダが既にセット済みの場合は、新しい値で書き換えられる。値をセットする前にヘッダの存在を調べるにはcontainsHeaderメソッドを使う |
public void addHeader(String headername,
String value); |
指定した名前のヘッダに値を付加する。複数の値をもつヘッダに使う。 |
public void addDateHeader(String headername,
long date); |
指定した名前のヘッダにdate値を付加する。複数の値をもつヘッダに使う。 |
public void addIntHeader(String headername,
int value); |
指定した名前のヘッダにint値を付加する。複数の値をもつヘッダに使う。 |
public void setIntHeader(String headername,
int value); |
指定した名前とint値をもつヘッダ行をセットする。このヘッダが既にセット済みの場合は、新しい値で書き換えられる。値をセットする前にヘッダの存在を調べるにはcontainsHeaderメソッドを使う |
public void setStatus(int statuscode); |
この応答にステータス・コードをセットする。このメソッドはエラーがないとき(例えばSC_OKや
SC_MOVED_TEMPORARILY などのステータスコード)のセットに使われる。エラーがある場合はsendErrorメソッドのほうを使わなければならない。 |
以上のメソッドをひととおり読むと、通常の応答を生成するには少なくとも次のような手順を踏む必要があることが判る。
1. SetContentTypeメソッドでボディ部の形式と使用言語を指定する。 2. HTTPボディ部の形式がテキストの場合(この場合が殆どであろう)は出力用にgetWriterメソッドを使ってPrintWriterのオブジェクトを、バイナリデータの場合はgetOutputStreamメソッドを使ってServletOutputStreamのオブジェクトを取得する。 3. 出力用バッファにコンテントを書き込む 4. バイナリデータの場合はsetContentLengthメソッドでHTTPボディ部の長さを指定する。 5. 出力バッファのフラッシュとクローズを行う。(スレッドがサーブレットから出る時に自動的になされるが、明示的に記すことは良い習慣である) |
ブラウザによってはテキストであってもContent-Lengthヘッダを必要とするものもある。この場合は、サーブレット・エンジンのContent-Typeに基づく言語変換でボディ部のバイト長が変わってしまうので、PrintWriterは使えず、ByteArrayOutputStreamを使うべきである。