Play frameworkのコントローラの使い方を理解する:Javaの常識を変えるPlay framework入門(4)(3/3 ページ)
サーブレット/JSPを基にする重厚長大なJavaのWeb開発のイメージを変える軽量フレームワーク「Play」について解説し、Webアプリの作り方を紹介する入門連載。今回は、PlayにおけるMVCパターンのコントローラについて、URIやHTTPメソッドなどの扱い方を含めて解説します。
routesファイル
routesファイルとはWebブラウザからのリクエストを解析し適切なコントローラのメソッドを呼び出すための指標となるファイルです。このファイルからPlay frameworkは受け取ったリクエストをどのControllerクラスのメソッドに渡すのかを決定しています。
routesファイルのフォーマットは、左から以下の構成になっています。
- GETやPOSTなどのHTTPメソッド
- アプリの遷移先のURI
- URIに関連付いたControllerクラスのメソッド
GET /top controllers.Uranai.showTop() POST /name controllers.Uranai.showNameResult() GET /type/:id controllers.Uranai.showType(id :Integer)
では、このroutesファイルが持つHTTPメソッド、URI、Controllerクラスメソッドについて見ていきましょう。
HTTPメソッド
このroutesで許可されているHTTPメソッドはGET、POST、PUT、DELETE、HEADですが、WebブラウザによってはGETおよびPOSTしか許可していない場合がありますので、基本はGETとPOSTのみで実装した方が良いでしょう。WebブラウザによってはAjaxなど使わない限りPUT、DELETE、HEADをGETとして解釈されることがあります。
また、routesにGETで定義しているリンク先にPOSTでアクセスした場合や、その逆の場合はエラーになります。
URIとControllerのメソッド
Play frameworkではURIを指定してそれに関連するControllerクラスのメソッドを定義しています。URIの中には今回の「:id」のように引数として指定でき、それをControllerクラスのメソッド引数として渡すことも可能です。
Controllerのメソッドの引数の型を指定することでURIの引数にある程度の制限をすることもできます。例えば、showTypeの引数はIntegerのため文字列を入れるとエラーになります。
またURIには、正規表現で同じメソッドに対して不特定多数のURIに対応することも可能です。その辺りが気になる方は、英文ですがPlay frameworkの公式サイトの解説を参照してください。
またGETメソッドの場合、URIの「?」以降のパラメータをControllerメソッドの引数として指定することも可能です。例えばroutesを下記のように修正して、Controllerのメソッドにも引数を追加すれば同じ結果を得ることができます。
GET /type/:id controllers.Uranai.showType(id :Integer, name: String)
最後に注意点として、routesファイルではURIの最後にスラッシュ「/」の有無によってリンク先は別物と認識されます。例えば、今回の場合は「http://localhost:9000/top/」でアクセスするとエラーになります。
Controllerクラス
HTTPメソッドとURIが決まれば、最後にControllerクラスを継承したクラスを作成します。そして、routesファイルで定義したメソッドの実装を行います。メソッドの実装の際には以下の規約に従ってください。
- Staticメソッドであること
- 戻り値としてplay.mvc.Resultを返すこと
ここでサンプルを見て気付いた方もいるかと思いますが、すでにControllerクラスには戻り値のResultを返すメソッドが用意されています。
例えば、正常なレスポンスである「200」のステータスを返すメソッドとしてok()メソッドがあります。代表的なものとして下記のものがあります。
メソッド | HTTPレスポンスのステータス | 概要 |
---|---|---|
ok() | 200 | OK |
badRequest() | 400 | BAD REQUEST |
forbidden() | 403 | FORBIDDEN |
notFound() | 404 | NOT FOUND |
internalServerError() | 500 | INTERNAL SERVER ERROR |
これらのメソッドは正確にはControllerクラスの親クラスに当たるplay.mvc.Resultsで定義されています(参照:Play frameworkの公式サイト)。
また、今回のサンプルでは使いませんでしたが、指定したHTMLを描画する以外にもリダイレクトすることも可能です。興味がある方はPlay frameworkの公式サイト(英文)の解説を参照してください。
次回は、Play frameworkのRESTについて
今回まではJavaをメインに使ったPlay frameworkでのMVCパターンについて学びました。次回はPlay frameworkが得意とするソフトウェア・アーキテクチャの概念である「REST」について紹介していく予定なので、楽しみにしてください。
著者プロフィール
長谷川 智之(はせがわ ともゆき)
2008年より、株式会社ビーブレイクシステムズに在籍。
基本的にはどんな問題があるか分からない新しい技術より、問題点をクリアした使い慣れた技術の方を好む保守派。しかし、最近のヤングでナウな新世代の考えに乗り遅れてきたため、新しい技術にも手を出し始める
Copyright © ITmedia, Inc. All Rights Reserved.