
Play frameworkのいろいろなモジュール3 – router-head
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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










