Handlerの役割と使い方
Hanlerの話です。
Handlerの役割については色々ありますが、詳しくはJavaフレームワークAsta4Dの話に書いてますのでご覧ください。
今回はコードレベルでどのような形で書けば良いかという観点で書いてます。
動的URLに対して適したHTMLを表示させるというお題をもって説明いこうと思います。
今回の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; public class UrlRules implements UrlMappingRuleInitializer{ public void initUrlMappingRules(UrlMappingRuleHelper rules) { rules.add(GET, "/").forward("/html/index.html"); rules.add(GET, "/part4/{id:[0-9]+}").handler(Handler.class); } }
そんな訳で動的なURLを書いてみました。
前回まで使っていたルールに1行、動的URLを追加してるだけですが。
asta4DのURLルールでは、「{}」内に変数を記載すると動的なURLとして認識され、HandlerやSnippet側でその変数が受け取ることが出来ます。
変数部分には正規表現で変数の内容を縛ることも可能です。
見て分かりますが、今回の場合は数字の場合だけ変数「id」に値が入りURLとして効力が発揮されます。
「/part4/1」「/part4/2」のように「id」の部分が数字の場合はこのURLとして認識されるが、「/part4/a」だと認識されないって感じですね。
で、このURLは今までと違ってforwardする処理が入っていません。
今回は「動的URLに対して適したHTMLを表示させる」ということでfoward先をURLに合わせて変更させなければならないので、Handler内でforward先を指定する実装という形で説明したいと思います。
なお、今回は描画部分のお話ではないのでHTMLやSnippet部分は省略します。
Handlerの実装
package com.astamuse.blog_sample.handler; import com.astamuse.asta4d.web.annotation.QueryParam; import com.astamuse.asta4d.web.dispatch.request.RequestHandler; public class Handler { @RequestHandler public String handle(Integer id) { if(id == null) { new RuntimeException(); } return "/html/" + id +".html"; } }
ということでHandlerを実装しました。
今回は変数で入ってきたidを元にforward先を決めるだけなので簡易な実装ですね。
実際はもっと複雑と言いたいところですが、複雑な実装になっているHandlerは実使用上でもあまりありません。
基本的にView Firstでは、View以外の実装については複雑にはしないのです。
それでは、1行ずつ見ていきたいと思います。
@RequestHandler public String handle(Integer id)
@RequestHandler
のアノテーションが記載されたメソッドが最初にコールされます。
引数には、URLルール上に記載された変数を書いておくことで勝手にインジェクションしてくれます。
URLルール以外にも引数に含めておくと勝手にインジェクションしてくれるクラスがあるので、覚えておくと便利です。
HttpServletRequest
やHttpServletRequest
が該当します(他にもあります)。
リクエストパラメータからなんかしたい場合やレスポンスヘッダを自力でいじりたい場合に使ったりします。
インジェクションされないような変数が引数にあってもエラーにはなりませんが、値には何も入りません。
if(id == null) { new RuntimeException(); }
ここはNullpo防止対策なので、ノーコメント。
return "/html/" + id +".html";
Handlerの結果を返却します。
Handlerではreturn値に様々な値を設定することが可能となります。
forwardメソッドにはHandlerから返却されたreturn値をもって振り分ける目的のメソッドがあるので、その値を持ってfoward先を決定することも可能です。
そして、今回のようにforward先のhtmlファイルを直接指定することも可能です。
ルール側だとforward先が多岐に渡る場合に困るので、Handler側でhtmlファイルを返却する方法を使ったりした方が良い場合もあります。
まぁ、使い分けですね。
また、RedirectTargetProviderクラスを返却すると強制的に指定されたURLにリダイレクトしてくれます。
void型のHandlerを作成することも出来、その場合はExceptionが発生していなければ次の処理へ遷移します。
今回のケースでそうすると次の処理がないのでエラーになりますが。
Handlerの実使用例
実装の説明と共に、astamuse.comにて実際に使われているケースをざっくり語ることで理解を深めていただければと思います。
- フォームから送信された内容をDBに保存する
- ページを表示するために必要な最低限のデータが存在しているかのチェック
- ログインが必要なページへのアクセス時のチェック
- 外部サイトからのデータ取得(特許画像の取得や公報PDFの取得)
- URL変更時のリダイレクト処理
起動
接続して思った通り表示されていれば大成功。
htmlファイルを用意してないURLにアクセスした場合はTmplateNotFoundExceptionが起きると思いますが、今回の場合はそれでも問題ありません。
(実際の運用上で起きたらまずいけど・・・)
終わりに
ここまでの回の内容が理解出来ればなんとなくWebアプリケーションを作ることは出来ます。
残り2回はプラスα的な内容をお送りしたいと思ってます。
次回予告
次回は、Handlerについてもう少しつっこんでみようと思います。
関連URL
第1回:環境構築して静的ページを表示するまで
第2回:Snippetを使って動的ページを作ろう
第3回:少し複雑なSnippet
第4回:Handlerの役割と使い方(今ここ)
第5回:Global Handlerとattribute
第6回:Form Flowを使おう