トップ «前の日記(2009-02-22) 最新 次の日記(2009-02-26)» 編集

Ussy Diary


2009-02-23

[Java]Cubby

さらっとページを JSP で用意して、 API を使っているだけで特にハマっていることはありません。難しいことをしているわけでないので当たり前なんでしょうか。というぐらい分かりやすいフレームワークです。もちろん最低限の Seasar の知識があったこともあると思います。

SAStruts は実際に使ったことがないのですが、 Action の戻り値は Cubby のほうが拡張しやすい印象です。 SAStruts は Ajax 時には Action で null を返し、その前にレスポンスに直接書き込むようです。一方 Cubby は ActionResult を返す必要があります。例えば標準で用意してくれている SendError クラスはステータスコードとメッセージを返すだけですが、認証エラー時にヘッダーに情報を詰め込みたい場合がありました。そこで以下のようなクラスをつくりました。 ActionResult を実装すればいいんだなというのが目に見て分かるのはプログラマーに優しいなあと個人的に感じます。その実装が軽く済むというのも大きいです。

public class SendHeaderError implements ActionResult {

    private int statusCode;

    private String message;

    private Map<String, String> headers = new HashMap<String, String>();

    /**
     * インスタンスを生成します。
     *
     * @param statusCode
     *            ステータスコード
     */
    public SendHeaderError(int statusCode) {
        this(statusCode, null);
    }

    /**
     * インスタンスを生成します。
     *
     * @param statusCode
     *            ステータスコード
     * @param message
     *            メッセージ
     * @see HttpServletResponse#sendError(int, String)
     */
    public SendHeaderError(int statusCode, String message) {
        this.statusCode = statusCode;
        this.message = message;
    }

    /**
     * ヘッダーを追加します。
     *
     * @param name
     *            キー
     * @param value
     *            値
     * @return 自身のインスタンス
     */
    public SendHeaderError addHeader(String name, String value) {
        this.headers.put(name, value);
        return this;
    }

    /**
     * {@inheritDoc}
     */
    public void execute(Action action, Class<? extends Action> actionClass, Method method, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        for (Map.Entry<String, String> e : this.headers.entrySet()) {
            response.setHeader(e.getKey(), e.getValue());
        }

        if (this.message == null) {
            response.sendError(this.statusCode);
        } else {
            response.sendError(this.statusCode, this.message);
        }
    }
}

利用側

return new SendHeaderError(HttpServletResponse.SC_UNAUTHORIZED).addHeader(
            "WWW-Authenticate",
            "BASIC realm=\"Authentication User\"");

実際に response に書き込んで行っていることには変わりませんので、このあたりは個々のスタイルに合うかどうかだと思います。