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




스프링 미래 (6)

스칼라에서 이미 작동하는 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"사양에서 어떻게 표현되어야합니까? 또는 응답 컨트롤러 메서드가 요청 개체의 매개 변수를 어떻게 든 분리해야합니까? 이것을 할 또 다른 방법이 있습니까?


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)

줄리안의 대답 외에도. 라우트 파일에 포함시키지 않으려는 경우.

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

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

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


이 작업을 수행하는 내 방식은 사용자 지정 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 이외의 다른 기본값을 사용할 수 있습니다.


다음은 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
  // …
}

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

경로 파일에서 API 선언

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

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

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

컨트롤러 응용 프로그램 내부에 작성된 메소드에서 기본값 이외의 다른 기본값을 지정하지 않으면이 매개 변수의 값은 null 입니다.


PlayApps.net의 기본 호스팅 서비스는 64MB RAM 만 가지고 있으며 잘 작동합니다. 이미 지적했듯이, 이것은 playframework 사이트를 실행하는 것이며, 하루에 10 만 건의 요청을 처리합니다.

또한 Google App Engine을 실행했으며 약 60-70Mb를 사용하는 경향이 있습니다. 그러나 Glashfish에서 WAR 파일을 실행하는 경우 필요없는 오버 헤드가 추가 될 것입니다 (모든 J2EE 사용 가능 항목은 필요하지 않음).

표준 재생 서버 앞에 앉아있는 경량 HTTP 서버를 사용하는 것이 좋습니다. 이렇게하면 메모리 사용을 최소화 할 수 있습니다.





scala playframework playframework-2.0