JSP サーバーレスポンス

Response レスポンスオブジェクトは、主に JSP コンテナで処理された結果をクライアントに返します。response 変数を使用して、HTTP のステータスを設定したり、Cookie や HTTP ファイルヘッダー情報などのデータをクライアントに送信したりできます。

典型的なレスポンスは次のようになります:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (空行)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>

ステータス行には、HTTP/1.1 などの HTTP バージョン情報、200 などのステータスコード、そしてそのステータスコードに対応する OK などの非常に短いメッセージが含まれます。

次の表は、HTTP 1.1 レスポンスヘッダーの中で最も有用な部分をまとめたものです。ネットワークプログラミングでは、これらを頻繁に目にするでしょう。

レスポンスヘッダー 説明
Allow サーバーがサポートするリクエストメソッド(GET、POST など)を指定します。
Cache-Control レスポンスドキュメントが安全にキャッシュされる状況を指定します。通常の値は、public,private 或no-cacheなどです。Public はドキュメントがキャッシュ可能であることを意味し、Private はドキュメントが単一ユーザー専用であり、プライベートキャッシュのみ使用できることを意味します。No-cache はドキュメントがキャッシュされないことを意味します。
Connection ブラウザに永続的な HTTP 接続を使用するかどうかを指示します。close值ブラウザに永続的な HTTP 接続を使用しないよう指示します。keep-alive は永続的な接続を使用することを意味します。
Content-Disposition ブラウザに、応答を指定された名前でディスクに保存するようユーザーに要求させます。
Content-Encoding 転送時のページのエンコーディング規則を指定します。
Content-Language ドキュメントで使用される言語を表します。例:en、en-us、ru など。
Content-Length レスポンスのバイト数を示します。ブラウザが永続的 (keep-alive) HTTP 接続を使用している場合にのみ有効です。
Content-Type ドキュメントが使用する MIME タイプを示します。
Expires いつ期限切れになり、キャッシュから削除されるかを示します。
Last-Modified ドキュメントの最終更新日時を示します。クライアントはドキュメントをキャッシュし、後続のリクエストで If-Modified-Since を提供できます。If-Modified-Sinceリクエストヘッダー
Location 300秒以内に、ステータスコードが付いたすべてのレスポンス URL が含まれます。ブラウザーは自動的に再接続して新しいドキュメントを取得します。
Refresh ブラウザがどのくらいの頻度でページを更新要求するかを指定します。
Retry-After 503 (Service Unavailable) とともに使用され、どのくらい後にリクエストが応答されるかをユーザーに伝えます。
Set-Cookie 現在のページに対応する Cookie を指定します。

HttpServletResponse クラス

response オブジェクトは javax.servlet.http.HttpServletResponse クラスのインスタンスです。サーバーがリクエストオブジェクトを作成するのと同様に、クライアントレスポンスも作成します。

response オブジェクトは、HTTP 情報ヘッダーを作成するためのインターフェースを定義します。このオブジェクトを使用することで、開発者は新しい Cookie やタイムスタンプ、HTTP ステータスコードなどを追加できます。

次の表は、HTTP レスポンスヘッダーを設定するために使用されるメソッドを示しています。これらは HttpServletResponse クラスによって提供されます。

S.N. メソッド & 説明
1 String encodeRedirectURL(String url)sendRedirect() メソッドで使用する URL をエンコードします。
2 String encodeURL(String url)URL をエンコードし、Session ID を含む URL を返します。
3 boolean containsHeader(String name)指定されたレスポンスヘッダーが存在するかどうかを返します。
4 boolean isCommitted()レスポンスがすでにクライアントに送信されたかどうかを返します。
5 void addCookie(Cookie cookie)指定された Cookie をレスポンスに追加します。
6 void addDateHeader(String name, long date)指定された名前のレスポンスヘッダーと日付の値を追加します。
7 void addHeader(String name, String value)指定された名前のレスポンスヘッダーと値を追加します。
8 void addIntHeader(String name, int value)指定された名前のレスポンスヘッダーと int 値を追加します。
9 void flushBuffer()キャッシュ内のすべての内容をクライアントに書き込みます。
10 void reset()ステータスコードや各種レスポンスヘッダーを含む、キャッシュ内のすべてのデータをクリアします。
11 void resetBuffer()レスポンスヘッダーとステータスコードを除く、基本的なキャッシュデータをクリアします。
12 void sendError(int sc)指定されたステータスコードを使用してクライアントにエラーレスポンスを送信し、キャッシュをクリアします。
13 void sendError(int sc, String msg)指定されたステータスコードとメッセージを使用してクライアントにエラーレスポンスを送信します。
14 void sendRedirect(String location)指定された URL を使用してクライアントに一時的な間接レスポンスを送信します。
15 void setBufferSize(int size)レスポンスボディのバッファサイズを設定します。
16 void setCharacterEncoding(String charset)レスポンスのエンコーディングセット(MIME 文字セット)を指定します。例:UTF-8。
17 void setContentLength(int len)HTTP サーブレットにおけるレスポンスコンテンツの長さを指定します。このメソッドは HTTP Content-Length 情報ヘッダーを設定するために使用されます。
18 void setContentType(String type)レスポンスがまだ送信されていない場合、レスポンスのコンテンツタイプを設定します。
19 void setDateHeader(String name, long date)指定された名前と日付を使用して、レスポンスヘッダーの名前と日付を設定します。
20 void setHeader(String name, String value)指定された名前と値を使用して、レスポンスヘッダーの名前と内容を設定します。
21 void setIntHeader(String name, int value)int 型の値を name ヘッダーに指定します。
22 void setLocale(Locale loc)レスポンスがまだ送信されていない場合、レスポンスのロケールを設定します。
23 void setStatus(int sc)レスポンスのステータスコードを設定します。

HTTP レスポンスヘッダーのプログラム例

次の例では、setIntHeader() メソッドと setRefreshHeader() メソッドを使用してデジタル時計をシミュレートします。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル(example.com)</title>
</head>
<body>
<h2>自动刷新实例</h2>
<%
   // 设置每隔5秒自动刷新
   response.setIntHeader("Refresh", 5);
   // 获取当前时间
   Calendar calendar = new GregorianCalendar();
   String am_pm;
   int hour = calendar.get(Calendar.HOUR);
   int minute = calendar.get(Calendar.MINUTE);
   int second = calendar.get(Calendar.SECOND);
   if(calendar.get(Calendar.AM_PM) == 0)
      am_pm = "AM";
   else
      am_pm = "PM";
   String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
   out.println("当前时间: " + CT + "\n");
%>
</body>
</html>

上記のコードを main.jsp として保存し、ブラウザでアクセスします。5秒ごとにシステムの現在時刻が表示されます。

次の Gif デモ画像をご覧ください。

ご自身で上記のコードを変更し、他のメソッドを試してみることもできます。より深く理解できるでしょう。

その他の拡張