astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

そうだAsta4dでWebアプリケーションを作ろう(第5回)

Global Handlerとattribute

今回はHandlerの話の続きです。 Handlerの簡単な役割については前回書きましたので、そちらをご覧になってから読んでいただくと理解が深まると思います。 たぶん。

で、今回書く話は個別のルール毎にコントロールを行うHandlerではなく、サイト全体や特定の属性のコントロールを行うHandlerのお話です。

今回のURLルール

package com.astamuse.blog_sample.rules;

import static com.astamuse.asta4d.web.dispatch.HttpMethod.GET;

import com.astamuse.asta4d.web.dispatch.mapping.UrlMappingRuleInitializer;
import com.astamuse.asta4d.web.dispatch.mapping.ext.UrlMappingRuleHelper;
import com.astamuse.blog_sample.handler.DefaultHandler;
import com.astamuse.blog_sample.handler.Handler;
import com.astamuse.blog_sample.handler.LoginCheckHandler;

public class UrlRules implements UrlMappingRuleInitializer{
    private static final String LOGIN_CHECK = "LOGIN_CHECK";

    public void initUrlMappingRules(UrlMappingRuleHelper rules) {
        rules.addDefaultRequestHandler(DefaultHandler.class);
        rules.addDefaultRequestHandler(LOGIN_CHECK, LoginCheckHandler.class);
        rules.add(GET, "/").forward("/html/index.html");
        rules.add(GET, "/{id:[0-9]+}").attribute(LOGIN_CHECK).handler(Handler.class);
    }
}

前回から追加した点を説明していきます。

rules.addDefaultRequestHandler(DefaultHandler.class);
rules.addDefaultRequestHandler(LOGIN_CHECK, LoginCheckHandler.class);

まずはURLルールに今回必要なルールを追加しています。 全体や属性のコントロールなので、個別のルール対してHandlerを設定するのではなくaddDefaultRequestHandlerを使ってルール全体へのコントロールを追加します。

引数1つの場合は、全てのリクエストに対してのルールに対しての処理になり、2つ場合は1つ目の引数に属性を入れてあげて属性が付与されているルールのリクエストに対してのみ処理が行われます。 属性に関してはString型です。定数を作ってあげると管理が楽です。 被ると大惨事が発生してしまうので気を付けなければなりません。 (先に書いた方の処理しか走りません)

rules.add(GET, "/{id:[0-9]+}").attribute(LOGIN_CHECK).handler(Handler.class);

属性を付与する際は個別のルールに対してattibuteで付与します。 こうすることで独自のHandlerの前にaddDefaultRequestHandlerで指定した処理を行ってくれます。

Handlerの実装

package com.astamuse.blog_sample.handler;

import com.astamuse.asta4d.web.dispatch.request.RequestHandler;
import com.astamuse.asta4d.web.dispatch.response.provider.RedirectTargetProvider;

public class LoginCheckHandler {

    @RequestHandler
    public RedirectTargetProvider handle() {
        System.out.println("call LoginCheckHandler");
        return new RedirectTargetProvider("/");
    }
}
package com.astamuse.blog_sample.handler;

import com.astamuse.asta4d.web.dispatch.request.RequestHandler;

public class DefaultHandler {

    @RequestHandler
    public void handle() {
        System.out.println("call DefaultHandler");
    }
}

今回は本題と関係ないので適当です(動けばいいというダメな精神)。 本来であればここで適切なコントロールをすることになります。 Handlerの書き方についてはどんなやり方の時も特に違いはありません。

Global Handlerの実使用例

それでは、実際のケースにおいてどのように使用されているか見ていきましょう。

  • ログイン必須ページのログインチェック
  • レスポンスにヘッダを設定(主にキャッシュコントロールで使用しています)
  • WebAPIの共通チェック

みたいな使い方が例となります。

特定のObjectがHandlerから返却された場合のGlobal処理について

Handlerより特定のObjectが返却された際に表示するページのコントロールを行う方法を合わせて紹介します。 Asta4dでは、Global Forwardの機能が提供されており、特定のObjectが返却された場合、レスポンスステータスと返却するhtmlファイルを指定することが可能となっています。

rules.addGlobalForward(TemplateNotFoundException.class, "/html/error/404.html", 404);

ここではforward先がなかった時にasta4d内で発生するTemplateNotFoundExceptionが発生した場合に404を返すルールを追加しています。

使用例としてはException発生時のエラーコントロールが主となっている。

終わりに

この仕組みを使うことでルールに属性を付与することが可能となり、どのような処理が必要かが一目で分かりやすく表現することが可能になります。

次回予告

最終回はFormを簡単に作れちゃうForm Flowについて説明しようと思います。

関連URL

第1回:環境構築して静的ページを表示するまで
第2回:Snippetを使って動的ページを作ろう
第3回:少し複雑なSnippet
第4回:Handlerの役割と使い方
第5回:Global Handlerとattribute(今ここ)
第6回:Form Flowを使おう

Copyright © astamuse company, ltd. all rights reserved.