§カスタムルーティング
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の拡張
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したいですか?コミュニティフォーラムでコミュニティとの会話を開始してください。