Servlet サーバー HTTP レスポンス

前の章で説明したように、Web サーバーが HTTP リクエストに応答するとき、レスポンスには通常、ステータス行、いくつかのレスポンスヘッダー、空行、ドキュメントが含まれます。典型的なレスポンスは次のようになります。

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

ステータス行には、HTTP バージョン(この例では HTTP/1.1)、ステータスコード(この例では 200)、およびステータスコードに対応する短いメッセージ(この例では OK)が含まれます。

次の表は、Web サーバー側からブラウザに返される最も有用な HTTP 1.1 レスポンスヘッダーをまとめたものです。Web プログラミングで頻繁に使用することになります。

ヘッダー情報説明
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(Multipurpose Internet Mail Extension)タイプを提供します。
Expiresこのヘッダーは、コンテンツの有効期限を指定します。この期限を過ぎるとコンテンツはキャッシュされません。
Last-Modifiedこのヘッダーは、ドキュメントの最終更新日時を示します。その後、クライアントはファイルをキャッシュし、以後のリクエストでIf-Modified-Sinceリクエストヘッダー情報に日付を提供します。
Locationこのヘッダーは、ステータスコードを含むすべてのレスポンスに含める必要があります。300 番台のステータスコードでは、ブラウザにドキュメントのアドレスを通知します。ブラウザは自動的にこの場所に再接続し、新しいドキュメントを取得します。
Refreshこのヘッダーは、ブラウザが更新されたページをどのくらい早くリクエストすべきかを指定します。ページを更新する秒数を指定できます。
Retry-Afterこのヘッダーは、503(Service Unavailable サービス利用不可)レスポンスと組み合わせて使用できます。これにより、クライアントにどのくらいの時間が経過したらリクエストを再試行できるかが通知されます。
Set-Cookieこのヘッダーは、ページに関連付けられた cookie を指定します。

HTTP レスポンスヘッダーを設定する方法

以下のメソッドは、Servlet プログラムで HTTP レスポンスヘッダーを設定するために使用できます。これらのメソッドは、HttpServletResponseオブジェクトを通じて利用できます。

番号メソッド & 説明
1String encodeRedirectURL(String url)
sendRedirect メソッドで使用される指定された URL をエンコードします。エンコードが不要な場合は、変更されていない URL を返します。
2String encodeURL(String url)
session セッション ID を含む指定された URL をエンコードします。エンコードが不要な場合は、変更されていない URL を返します。
3boolean containsHeader(String name)
名前付きレスポンスヘッダーが設定されているかどうかを示すブール値を返します。
4boolean isCommitted()
レスポンスがすでにコミットされているかどうかを示すブール値を返します。
5void addCookie(Cookie cookie)
指定された cookie をレスポンスに追加します。
6void addDateHeader(String name, long date)
指定された名前と日付値を持つレスポンスヘッダーを追加します。
7void addHeader(String name, String value)
指定された名前と値を持つレスポンスヘッダーを追加します。
8void addIntHeader(String name, int value)
指定された名前と整数値を持つレスポンスヘッダーを追加します。
9void flushBuffer()
バッファ内のすべてのコンテンツを強制的にクライアントへ書き込みます。
10void reset()
バッファ内のデータ(ステータスコードとヘッダーを含む)をすべてクリアします。
11void resetBuffer()
レスポンスの基盤となるバッファのコンテンツをクリアし、ステータスコードとヘッダーはクリアしません。
12void sendError(int sc)
指定されたステータスコードを使用してエラーレスポンスをクライアントに送信し、バッファをクリアします。
13void sendError(int sc, String msg)
指定されたステータスを使用してエラーレスポンスをクライアントに送信します。
14void sendRedirect(String location)
指定されたリダイレクト先 URL を使用して、一時的なリダイレクトレスポンスをクライアントに送信します。
15void setBufferSize(int size)
レスポンス本文の推奨バッファサイズを設定します。
16void setCharacterEncoding(String charset)
クライアントに送信されるレスポンスの文字エンコーディング(MIME 文字セット)を設定します。例: UTF-8。
17void setContentLength(int len)
HTTP Servlet レスポンス内のコンテンツ本文の長さを設定します。このメソッドは HTTP Content-Length ヘッダーを設定します。
18void setContentType(String type)
レスポンスがまだコミットされていない場合、クライアントに送信されるレスポンスのコンテンツタイプを設定します。
19void setDateHeader(String name, long date)
指定された名前と日付値を持つレスポンスヘッダーを設定します。
20void setHeader(String name, String value)
指定された名前と値を持つレスポンスヘッダーを設定します。
21void setIntHeader(String name, int value)
指定された名前と整数値を持つレスポンスヘッダーを設定します。
22void setLocale(Locale loc)
レスポンスがまだコミットされていない場合、レスポンスのロケールを設定します。
23void setStatus(int sc)
このレスポンスにステータスコードを設定します。

HTTP ヘッダーレスポンスの例

以前の例で setContentType() メソッドを確認しました。次の例でも同じメソッドを使用します。さらに、setIntHeader()メソッドを使用してRefreshヘッダーを設定します。

//导入必需的 java 库
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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("/Refresh")

//扩展 HttpServlet 类
public class Refresh extends HttpServlet {

    // 处理 GET 方法请求的方法
      public void doGet(HttpServletRequest request,
                        HttpServletResponse response)
                throws ServletException, IOException
      {
          // 设置刷新自动加载时间为 5 秒
          response.setIntHeader("Refresh", 5);
          // 设置响应内容类型
          response.setContentType("text/html;charset=UTF-8");
         
          //使用默认时区和语言环境获得一个日历  
          Calendar cale = Calendar.getInstance();  
          //将Calendar类型转换成Date类型  
          Date tasktime=cale.getTime();  
          //设置日期输出的格式  
          SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
          //格式化输出  
          String nowTime = df.format(tasktime);
          PrintWriter out = response.getWriter();
          String title = "自动刷新 Header 设置 - サンプル实例";
          String docType =
          "<!DOCTYPE html>\n";
          out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n"+
            "<body bgcolor=\"#F0F0F0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<p>当前时间是:" + nowTime + "</p>\n");
      }
      // 处理 POST 方法请求的方法
      public void doPost(HttpServletRequest request,
                         HttpServletResponse response)
          throws ServletException, IOException {
         doGet(request, response);
      }
}

上記のテスト例は TomcatTest プロジェクトにあり、対応する web.xml の設定は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
  <servlet>  
     <!-- 类名 -->  
    <servlet-name>Refresh</servlet-name>  
    <!-- 所在的包 -->  
    <servlet-class>com.サンプル.test.Refresh</servlet-class>  
  </servlet>  
  <servlet-mapping>  
    <servlet-name>Refresh</servlet-name>  
    <!-- 访问的网址 -->  
    <url-pattern>/TomcatTest/Refresh</url-pattern>  
    </servlet-mapping>  
</web-app> 

では、上記の Servlet を呼び出すと、5 秒ごとに現在のシステム時刻が表示されます。Servlet を実行してしばらく待つだけで、次のような結果が表示されます。

その他の拡張