문제

고 말할 수 있습니다 내가 이미 기능을 재생 2.0 프레임워크 기반 응용 프로그램에서 스칼라를 제공하는 같은 URL 을:

http://localhost:9000/birthdays

는 응답을 알려진 모든 생일

내가 지금 이를 강화하기 위해 할 수있는 기능을 추가하여를 제한하는 결과를 선택"에서"(날짜)및"을"요청 params 등

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

(여기에 날짜로 해석 yyyyMMdd)

나의 질문은 처리하는 방법을 요청 파라미터 바인딩 및 해석에 놀 2.0 와 스칼라 특히,주어진 이들 모두 params 선택적이어야 합니다.

해야 하는 이러한 매개 변수있게 표현에서"노선"specification?그 대안으로 응답 컨트롤러한 방법을 따로 따로 선택 params 요청으로부터 개체에게?할 수 있는 다른 방법이 있을까요?

도움이 되었습니까?

해결책

옵션 매개 변수를 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])
.

다른 팁

Java 사용자 가이 작업을 수행하는 데 덜 깨끗한 방법은 기본값입니다.

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)
.

줄리앙의 답변 이외에. routes 파일에 포함시키지 않으려면

RequestHeader 를 사용하여 컨트롤러 메소드 에서이 속성을 얻을 수 있습니다.

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

이렇게하면 원하는 요청 매개 변수를 제공하고 경로 파일을 깨끗하게 유지합니다.

여기에 F.Option : (Play 2.1의 작동) Java에서 재 작성된 Julien의 예입니다.

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
  // …
}
.

선택적 쿼리 매개 변수의 경우이 방법을 수행 할 수 있습니다

라우트 파일에서 API를 선언

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

일부 기본값을 제공 할 수도 있습니다. API에는 이러한 쿼리 매개 변수가 포함되지 않으면 자동으로 기본값을 이러한 params 에 할당합니다.

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

컨트롤러 응용 프로그램 내부에 기록 된 방법에서 이러한 params는 기본값이 지정된 기본값이 지정되지 않은 경우 값 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 그냥 편 방법에서 사용 컨트롤러고 싶은 경우에는 적용일 필터링을 쿼리가 있습니다.분명히 당신이 사용할 수 있는 다른 여기에 날짜가 기본값으로 사용하거나 일부 다른 기본 null 을 위해 시작과 끝 날짜 bind 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top