§カスタムルーティング
Playは、パスまたはクエリ文字列パラメーターから型をバインドするメカニズムを提供します。
§PathBindable
PathBindableを使用すると、URLパスからビジネスオブジェクトをバインドできます。つまり、次のようなアクションを呼び出すために、` /user/3`のようなルートを定義できます。
§controller
public Result user(User user) {
return ok(user.name);
}
user
パラメーターは、次のルート定義などを使用して、URLパスから抽出されたIDを使用して自動的に取得されます。
§/conf/routes
GET /user/:user controllers.BinderApplication.user(user: javaguide.binder.models.User)
PathBindable
を実装する任意の型T
は、パスパラメーターにバインドできます。
これは、抽象メソッドbind
(パスから値を構築する)とunbind
(値からパスフラグメントを構築する)を定義します。
次のようなクラスの場合
public class User implements PathBindable<User> {
public Long id;
public String name;
バインダーの使用の簡単な例で、:id
パスパラメーターをバインドします。
@Override
public User bind(String key, String id) {
// findById meant to be lightweight operation
User user = findById(Long.valueOf(id));
if (user == null) {
throw new IllegalArgumentException("User with id " + id + " not found");
}
return user;
}
@Override
public String unbind(String key) {
return String.valueOf(id);
}
この例では、findById
メソッドが呼び出されてUser
インスタンスが取得されます。
注記:実際のアプリケーションでは、このようなメソッドは軽量で、DBアクセスなどを含めるべきではありません。コードはサーバーのIOスレッドで呼び出され、完全にノンブロッキングである必要があります。そのため、たとえば、単純なオブジェクト識別子をパスバインド可能として使用し、アクションコンポジションを使用して実際の値を取得します。
§QueryStringBindable
同様のメカニズムがクエリ文字列パラメーターに使用されます。` /age`のようなルートは、次のようなアクションを呼び出すように定義できます。
§controller
public Result age(AgeRange ageRange) {
return ok(String.valueOf(ageRange.from));
}
age
パラメーターは、たとえば` /age?from=1&to=10`などのクエリ文字列から抽出されたパラメーターを使用して自動的に取得されます。
QueryStringBindable
を実装する任意の型T
は、1つ以上のクエリ文字列パラメーターにバインドできます。PathBindable
と同様に、抽象メソッドbind
とunbind
を定義します。
次のようなクラスの場合
public class AgeRange implements QueryStringBindable<AgeRange> {
public Integer from;
public Integer to;
バインダーの使用の簡単な例で、:from
と:to
クエリ文字列パラメーターをバインドします。
@Override
public Optional<AgeRange> bind(String key, Map<String, String[]> data) {
try {
from = Integer.valueOf(data.get("from")[0]);
to = Integer.valueOf(data.get("to")[0]);
return Optional.of(this);
} catch (Exception e) { // no parameter match return None
return Optional.empty();
}
}
@Override
public String unbind(String key) {
return new StringBuilder().append("from=").append(from).append("&to=").append(to).toString();
}
Playが自動的に提供するすべてのバインダーは、それらのunbind
メソッドでフォームURLエンコーディングを適用するため、すべての特殊文字は安全にURLエンコードされます。ただし、カスタムバインダーを実装する場合、これは自動的には行われません。そのため、必要に応じてキー/値部分をエンコードしてください。
@Override
public String unbind(String key) {
String identifierEncoded;
try {
identifierEncoded = URLEncoder.encode(identifier, "utf-8");
} catch (Exception e) {
// Should never happen
identifierEncoded = identifier;
}
return new StringBuilder()
// Key string doesn't contain special characters and doesn't need form URL encoding:
.append("identifier")
.append('=')
// Value string may contain special characters, do encode:
.append(identifierEncoded)
.toString();
}
次:Playの拡張
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したいですか?コミュニティフォーラムでコミュニティとの会話を開始してください。