この記事は公開されてから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