Play frameworkのいろいろなモジュール3 – router-head
PlayのHTTPルーティング
Play frameworkではHTTPルーティングを定義する際に、デフォルトではconf/routesファイルを使用して定義します。 アプリケーション生成時のroutesファイルは以下のとおりです。
# Routes # This file defines all application routes (Higher priority routes first) # ~~~~ # Home page GET / Application.index # Ignore favicon requests GET /favicon.ico 404 # Map static resources from the /app/public folder to the /public path GET /public/ staticDir:public # Catch all * /{controller}/{action} {controller}.{action}
ルート(/)へアクセスされたらApplication.indexメソッドの実行。 それ以外は静的ファイルへのアクセスと/コントローラー名/アクション名にマッチしたURLを定義しています。 また、このファイルは柔軟な記述が可能で、
GET /clients/{id} Clients.show
のようにして変数をバインドすることもできるし、
GET /clients/{<[a-z]{4,10}>id} CLients.show
のようにして正規表現を使用することもできます。
このように、routesファイルを使用するのが基本ですが、今回ご紹介するrouter-headモジュールを使用すれば Javaのコントローラークラスで アノテーションによってHTTPルーティングが定義できます。 では、動作を確認してみましょう。 今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.2
- Java :1.6.0_2
- Play framework:1.2.3
インストール
まずはプロジェクトを作成します。
% play new routerHead
次にconf/dependencies.ymlファイルを編集します。
# Application dependencies require: - play # The router module - play -> router head
router-headへの依存を追記しています。 そしてplay depsコマンドを実行してください。
%play deps ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.2.3, http://www.playframework.org ~ Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 ~ Resolving dependencies using /Users/routerHead/conf/dependencies.yml, ~ ~ play->router head (from playContributedModules) ~ ~ Installing resolved dependencies, ~ ~ modules/router-head ~ lib/slf4j-api.jar ~ ~ Done! ~
では実装していきましょう。まずはconf/routesファイルを開き、中身をすべて削除します。 ※routesファイル自体を削除しないでください。Playが起動するのにroutesファイルが必要です そして、app/Application.javaを下記のようにして、play runで起動してください。
package controllers; import play.*; import play.mvc.*; import play.modules.router.Any; import play.modules.router.Post; import play.modules.router.Put; import play.modules.router.Get; import play.modules.router.ServeStatic; import play.modules.router.StaticRoutes; import java.util.*; import models.*; @ServeStatic(value = "/public/", directory = "public") public class Application extends Controller { @Get("/") public static void index() { render(); } }
クラスについているアノテーションはroutesファイルにあった
GET /public/ staticDir:public
と同じ意味です。このアノテーションにはカンマ区切りで複数の要素が記述できます。 メソッドについているアノテーションはroutesファイルの
GET / Appication.index
と同じ意味です。localhost:9000にアクセスすると、いままでと同じように動作します。
もうひとつ試してみましょう。下記のメソッドをApplication.javaに追加してください。
@Post("/post/{name}") public static void post(String name) { System.out.println("name=" + name); render(); }
app/views/Apllicationディレクトリにpost.htmlという名前でindex.htmlをコピーし、curlコマンドで動作確認してみましょう。
%curl -X POST -v http://localhost:9000/post/yourName
routesファイルと同じように使用できます。
まとめ
router-headを使用して、アノテーションベースでのルーティング定義をできるのがわかったかと思います。 必要に応じroutesファイルと使い分けてください。
参考サイトなど
- ※1 router head