[scala] Play 프레임 워크에서 선택적 쿼리 매개 변수를 처리하는 방법



2 Answers

아마 자바 사용자를 위해 이렇게하는 덜 깨끗한 방법은 기본값을 설정하는 것입니다 :

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

그리고 컨트롤러에서

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

또 하나의 문제는 템플리트에서 페이지에 링크 할 때마다 기본값을 반복해야한다는 것입니다

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

스칼라에서 이미 작동하는 Play 2.0 프레임 워크 기반 애플리케이션이 있는데 다음과 같은 URL을 제공한다고 가정 해 보겠습니다.

http://localhost:9000/birthdays

알려진 모든 생일 목록으로 응답합니다.

이제는 선택적 "from"(날짜) 및 "to"요청 params를 사용하여 결과를 제한하는 기능을 추가하여이 기능을 향상시키고 자합니다.

http://localhost:9000/birthdays?from=20120131&to=20120229

(yyyyMMdd로 해석되는 날짜)

내 질문은 Scala를 사용하여 Play 2.0에서 요청 param 바인딩 및 해석을 처리하는 방법입니다. 특히 두 매개 변수 모두 선택 사항이어야한다는 점을 감안할 때 그렇습니다.

이러한 매개 변수는 "routes"사양에서 어떻게 표현되어야합니까? 또는 응답 컨트롤러 메서드가 요청 개체의 매개 변수를 어떻게 든 분리해야합니까? 이것을 할 또 다른 방법이 있습니까?




다음은 Julien의 예입니다. F.Option을 사용하여 Java로 다시 작성되었습니다. (연극 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
  // …
}



이 작업을 수행하는 내 방식은 사용자 지정 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 는 날짜 필터링을 쿼리에 적용하려면 컨트롤러에서 사용하는 convienence 메서드 applyDateFilter 입니다. 분명히 여기서 다른 날짜 기본값을 사용하거나 bind 메소드의 시작 및 종료 날짜에 null 이외의 다른 기본값을 사용할 수 있습니다.






Related