役に立ちましたか?

解決

オプションのパラメータをOption[String](またはOption[java.util.Date])としてエンコードしますが、独自のQueryStringBindable[Date]を実装する必要があります):

def birthdays(from: Option[String], to: Option[String]) = Action {
  // …
}
.

と次の経路を宣言する:

GET   /birthday       controllers.Application.birthday(from: Option[String], to: Option[String])
.

他のヒント

A Javaユーザーにとってこれを行うことのきれいな方法は、デフォルト設定の設定です。

GET  /users  controllers.Application.users(max:java.lang.Integer ?= 50, page:java.lang.Integer ?= 0)
.

とコントローラ

public static Result users(Integer max, Integer page) {...}
.

もう1つの問題は、テンプレートのページにリンクしているときはいつでもデフォルトを繰り返す必要があります

@routes.Application.users(max = 50, page = 0)
.

ジュリアンの答えに加えて。 routes ファイルに含めたくない場合は、

RequestHeader を使用してコントローラメソッドでこの属性を取得できます。

String from = request().getQueryString("from");
String to = request().getQueryString("to");
.

これはあなたに望ましい要求パラメータを加え、あなたの routes ファイルのクリーンを維持します。

ここにJulienの例は、F.Optionを使用してJavaで書き換えられました。(Play 2.1以降で動作する)

import play.libs.F.Option;
public static Result birthdays(Option<String> from, Option<String> to) {
  // …
}
.

経路:

GET   /birthday       controllers.Application.birthday(from: play.libs.F.Option[String], to: play.libs.F.Option[String])
.

文字列として任意のクエリパラメータを選択するだけで(タイプ変換自分自身を実行する必要があります):

public static Result birthdays(Option<String> from, Option<String> to) {
  String blarg = request().getQueryString("blarg"); // null if not in URL
  // …
}
.

オプションのクエリパラメータの場合は、このようにすることができます

routesファイル、宣言API

GET   /birthdays     controllers.Application.method(from: Long, to: Long)
.

デフォルト値を指定することもできます.APIにはこれらのクエリパラメータが含まれていない場合は、デフォルト値をこれらのPARAMS に自動的に割り当てます。

GET   /birthdays    controllers.Application.method(from: Long ?= 0, to: Long ?= 10)
.

コントローラアプリケーション内部で書かれた方法では、デフォルト値が割り当てられていない場合は、値nullが発生します。

これを行う私の方法は、カスタムQueryStringBindableを使用することを含みます。このようにして、ルートのパラメータを表現します。

GET /birthdays/ controllers.Birthdays.getBirthdays(period: util.Period)
.

期間のコードはこのように見えます。

public class Period implements QueryStringBindable<Period> {

  public static final String PATTERN = "dd.MM.yyyy";
  public Date start;

  public Date end;

  @Override
  public F.Option<Period> bind(String key, Map<String, String[]> data) {
      SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);

      try {
          start = data.containsKey("startDate")?sdf.parse(data.get("startDate")  [0]):null;
          end = data.containsKey("endDate")?sdf.parse(data.get("endDate")[0]):null;
      } catch (ParseException ignored) {
          return F.Option.None();
      }
      return F.Option.Some(this);
  }

  @Override
  public String unbind(String key) {
      SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
      return "startDate=" + sdf.format(start) + "&amp;" + "endDate=" + sdf.format(end);
  }

  @Override
  public String javascriptUnbind() {
      return null;
  }

  public void applyDateFilter(ExpressionList el) {
      if (this.start != null)
          el.ge("eventDate", this.start);
      if (this.end != null)
          el.le("eventDate", new DateTime(this.end.getTime()).plusDays(1).toDate());
  }

}
.

applyDateFilterは、クエリに日付フィルタリングを適用したい場合は、私のコントローラで使用するコンロベーションの単なる調整方法です。明らかに、ここで他の日付のデフォルトを使用するか、bindメソッドの開始日と終了日にNULLよりも他のデフォルトを使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top