Play frameworkのいろいろなモジュール3 – router-head

2011.10.29

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ファイルと使い分けてください。

参考サイトなど