Javaの常識を変えるらしいPlay Framework~チュートリアルの3~

!これはJavaの常識を変えるらしいPlay Framework~チュートリアルの3~の続きです。

httpルーティング

だいぶチュートリアルらしくなってまいりました。ルーティングとはなんぞやとかはおググりください。

Playでは/project/conf/routesなるファイルにルーティングを追加していくらしいです。では実際にみてよう。

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                          controllers.Application.index()

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

ほーん、なるほど。

/にGETリクエストが飛んできたら controllersパッケージのApplicationクラスのindexっていうメソッドを呼び出すらしい。

では該当ファイル(/project/app/controllers/Applicationを見てよう

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

public class Application extends Controller {

    public static Result index() {
        return ok(index.render("Your new application is ready."));
    }

}

対応するメソッドがあった。

index.render()はよくわかりませんが、引数のStringを何かしらで描画するんでしょう。

じゃあなんか適当なの追加してみよう。GETで/testにリクエストしたら同じものが表示されるようにするにはroutesファイルに

GET     /test                      controllers.Application.index()

で行ける気がする。

実際できるのでお試しを

ほかにも引数とか渡したいときはこんなふうにしてみればいい routesファイル

GET     /show/:id                      controllers.Application.show(id: Int)

Application.java

    public static Result show(int id) {
        return ok(index.render("Your new application is ready." + id));
    }

わかりやすい。癖で型をIntではなくintにしそうになるのは気をつけねば、ここらへんはScalaにならっているらしい。

あとこの引数は正規表現でも行けるみたい 優先順位とかは先に宣言されたものになるらしいので気をつけていきたい

リバースルーティング

リバースルーティング・・・?なんぞ?Web初心者にはわからないことがいっぱいだ。

redirectさせたいときとかPlayではredirect(String uri)を使うんだけど、このURIが変更されたらめんどくさい。 そんなときにリバースルーティングを使えば柔軟に行けそう。 一言で言えば逆引き、コントローラーに対応するURI返してくれる便利なやつ。

さっきの例で/look/:idにGETリクエストしたら/show/:idにリダイレクトしたいって場合を考える。

まずroutesファイルに

GET     /look/:id                      controllers.Application.look(id: Int)

でもってApplication.javaに対応するメソッド

    public static Result look(int id) {
        return redirect("/play/show/" + id);
    }

で、要求は満たせるんだけど、showがリファクタリングとかされると動かなくなるのでApplication.javaをリバースルーティング使って

    public static Result look(int id) {
        return redirect(controllers.routes.Application.show(id));
    }

ってすることで/show/:idが/hoge/:idになったとしてもURIを逆引きしてくれる感じ。

ここでcontrollers.routes.Application.show(id)ってなってるのはおまじないって書いてもいいんだけど、公式を見るといいと思います。

やっぱJavaはたのしいなあ