連載
» 2003年06月20日 00時00分 公開

基礎から学ぶサーブレット/JSP(6):JSPの基本「暗黙オブジェクト」をさらに極める (2/3)

[山田祥寛,@IT]

クライアントへの応答を制御する−responseオブジェクト−

 outオブジェクトがコンテンツ本体の出力を制御する役割を担っていたのに対し、responseオブジェクトはむしろコンテンツ本体に付随するヘッダ情報やステータスを制御する際に用います。

 一見、outもresponseも「クライアントへの出力手段を制御するための手段」を提供するオブジェクトですので区別がつきにくいかもしれませんが、ざっくりと区分するならば、前者は可視的な情報を、後者は不可視の情報を制御するものであると思っていただければよいでしょう。

ヘッダ情報の発行

 先のrequest_header.jspでは、クライアントから送信された一連のヘッダ情報を取得してみました。ここでは、サーバ側での処理結果にカスタムのヘッダ情報を付加することで、クライアント側をコントロールしてみることにします。

 以下サンプルは、クライアント側の「キャッシュ」を無効化するためのものです。クライアント側ではパフォーマンスを向上させるために、一度読み込んだページをキャッシュと呼ばれる領域に保存し、2度目以降のアクセスで使用するというようなことが行われます。が、時として、そのキャッシュが邪魔をして最新の状態が表示されないというケースが起こり得ます。そこで、データの変動が激しいページにおいては、クライアント側のキャッシュを無効にすることで、そうしたデータの不整合を未然に防ぎます。

response_header.jsp
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<%
Calendar objCal1=Calendar.getInstance();
Calendar objCal2=Calendar.getInstance();
objCal2.set(1970,0,1,0,0,0);
response.setDateHeader("Last-Modified",objCal1.getTime().getTime());
response.setDateHeader("Expires",objCal2.getTime().getTime());
response.setHeader("pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
%>

 Last-Modifiedヘッダ(コンテンツの最終更新日)には常に今日の日付(Calendarクラスの初期値)を、Expiresヘッダ(有効期限)には「1970/01/01」(過去日)をセットすることで、クライアントに対して常に新しいコンテンツを読み込ませることができます。

 pragma、Cache-ControlヘッダはそれぞれHTTP 1.0/1.1仕様のキャッシュ制御用ヘッダです。両ヘッダには「no-cache(キャッシュ無効)」をセットすることで、キャッシュを無効化することが可能です。

 クライアントやネットワークの経由に設置されたキャッシュサーバなど、さまざまなキャッシュの仕組みがありますので、これらをすべて無効化するためには、これだけの制御ヘッダを送信しなければならないわけです。

 なお、以下にリクエスト/レスポンスに際して主に使用されるヘッダをいくつか挙げておきます。

表3 HTTPで使用される主なヘッダ
ヘッダ 概要
Accept-Language 対応言語
Connection 接続の方法
Content-Type コンテンツタイプ(MIME)
Date コンテンツの発行日
If-Modified-Since キャッシュの最終更新日
Referer リンク元
User-Agent クライアントの種類
WWW-Authenticate 認証ID/パスワード

クッキーの発行

 以下のサンプルは、先のrequest_cookie.jspで使用します。request_cookie.jspから送信されたフォーム情報をクッキーに保存し、再びrequest_cookie.jspにリダイレクトします。

 クッキーに関する詳細は、requestオブジェクトの項を参照してください。

response_cookie.jsp
<%@ page contentType="text/html;charset=Shift_JIS" 
%>
<%
Cookie objCok=new Cookie("email",request.getParameter("email"));
objCok.setMaxAge(60*60*24*180);
response.addCookie(objCok);
response.sendRedirect("request_cookie.jsp");
%>

 クッキーデータを表し、制御する一連のメソッドを提供するのは、Cookieクラスの役割です。クッキーは、以下の構文で生成することができます。

Cookie 変数=new Cookie(クッキー名,クッキー値);

 Cookieクラスの主要なメソッドは以下のとおりです。クッキー名だけは最初に設定した値を変更できない点に注意してください。

表4 Cookieクラスの主要なメソッド
メソッド 概要
getComment()/setComment(str) コメントの取得/設定
getDomain()/setDomain(str) 対象ドメインの取得/設定
getMaxAge()/setMaxAge(int) 有効期限の取得/設定(秒)
getName() クッキー名の取得
getPath()/setPath(str) 対象パスの取得/設定
getSecure()/setSecure(bln) SSL通信要否の取得/設定
getValue()/setValue(str) クッキー値の取得/設定
getVersion()/setVersion(int) バージョン値の取得/設定

 生成されたクッキーを実際にクライアントに出力するのは、addCookieメソッドの役割です。addCookieメソッドを介して初めて、生成されたクッキーは有効になります。ちなみに、クッキーの有効期限が0の場合、クッキーはブラウザ終了時に削除されます。負数の場合、指定された既存のクッキーは削除されます。

 クッキーをクライアントに送信した後、sendRedirectメソッドは指定されたURLにページをリダイレクトします。

responseオブジェクトのそのほかのメソッド

 以下に、ここまで紹介したaddCookie、setHeaderメソッドなどのほか、responseオブジェクトに用意されている主なメソッドを挙げておきます。

表5 responseオブジェクトの主なメソッド
メソッド 概要
addHeader(name,value) 指定されたヘッダnameを値valueで追加
containsHeader(name) 指定されたヘッダ名nameがすでに発行されているかどうか
encodeURL URLにセッションIDを付加
encodeRedirectURL URLにセッションIDを付加(sendRedirectメソッド対応)
isCommited() ヘッダが出力済みかどうか
setContentLength(length) コンテンツ長lengthをセット
setStatus(code) HTTPステータスコードcodeを出力
setError(code,msg) エラーステータスcodeを、エラーメッセージmsgとともに出力

responseオブジェクトは、クライアント出力時のヘッダ情報やHTTPステータス、クッキーなどを制御する際に用います。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。