ブラウザキャッシュを使わせようぜ!

 DB のテーブルの項目に「更新日時」なんてあるくせにブラウザキャッシュをうまく使わせていない Web アプリケーションをよく見かけます。もったいない!

ブラウザキャッシュを考慮した Cubby の Action クラスの例

// S2Containerの機能でリクエストがインジェクションされる。
public HttpServletRequest request;
// 同じくレスポンスがインジェクションされる。
public HttpServletResponse response;

public ActionResult index() {
    // ブラウザが送ってよこすキャッシュの時刻を取得
    long cacheTime = request.getDateHeader("If-Modified-Since");

    // ここでテーブルの更新日時を取得
    // java.sql.Timestamp 型の updateDate 変数に入ったことにする

    // java.sql.Timestamp 型から long 型にする
    long updateTime = updateDate.getTime();

    // キャッシュ時刻と更新日時を比較
    if (updateTime <= cacheTime) {
        // キャッシュより更新日時のほうが古い場合
        // HTTP ステータスコード 304 Not Modified を設定
        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        
        // ブラウザキャッシュを使わせるので実体の送信はしない
        return new Direct();
    }

    // ここでページ出力用の処理を行う。

    // レスポンスヘッダに最終更新日を付加する。
    response.setDateHeader("Last-Modified", updateTime);

    return new Forward("main.jsp");
}

 HTML を返す場合は JavaScript なんかとの兼ね合いがあることもあるので何でもかんでもこうすればいいというわけではないですが、HTML 以外を返すようなときにはぜひ実装したい機能だと思います。こうすれば、ネットワーク帯域とコンテンツ生成の負荷の節約になりますしね。