ドキュメント

§カスタムルーティング

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と同様に、抽象メソッドbindunbindを定義します。

次のようなクラスの場合

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の拡張


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