복붙노트

[SCALA] 어떻게 플레이 프레임 워크 선택 쿼리 매개 변수를 처리하는

SCALA

어떻게 플레이 프레임 워크 선택 쿼리 매개 변수를 처리하는

나는 URL 등을 제공 스칼라에서 이미 기능을 재생 2.0 프레임 워크 기반 응용 프로그램이 있다고 가정하자 :

에 http : // localhost를 : 9000 / 생일

알려진 모든 생일의 목록에있는 응답

지금 요청과 같은 PARAMS "에" "에서"선택과 결과를 제한 할 수있는 기능을 추가하여 향상 할 (날짜) 및

에 http : // localhost를 : 9000 / 생일 = 20,120,131에서 &에 = 20120229

(날짜는 여기 YYYYMMDD로 해석)

내 질문은, 스칼라와 재생 2.0 특히이 PARAMS 모두 선택해야한다는 주어진 요청 바인딩 PARAM과 해석을 처리하는 방법입니다.

이러한 매개 변수는 어떻게 든 "경로"사양 표현해야 하는가? 또한, 응답 컨트롤러 방법은 어떻게 든 요청 개체에서 PARAMS을 따로 선택해야합니까? 이 작업을 수행하는 또 다른 방법이 있나요?

해결법

  1. ==============================

    1.옵션 [문자열]로 선택적 매개 변수를 인코딩 (또는 옵션 [java.util.Date,하지만 당신은 당신의 자신의 QueryStringBindable [날짜]를 구현해야합니다) :

    옵션 [문자열]로 선택적 매개 변수를 인코딩 (또는 옵션 [java.util.Date,하지만 당신은 당신의 자신의 QueryStringBindable [날짜]를 구현해야합니다) :

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

    그리고 다음과 같은 경로를 선언합니다 :

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

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

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

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

    3.줄리앙의 대답에 추가. 당신은 루트 파일에 포함하지 않으려면.

    줄리앙의 대답에 추가. 당신은 루트 파일에 포함하지 않으려면.

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

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

    이것은 당신에게 원하는 요청 매개 변수를 제공, 플러스 깨끗하게 루트 파일을 유지합니다.

  4. ==============================

    4.(재생 2.1로 작동) : 여기 줄리앙의 예는 F.Option를 사용하여 자바에 다시 것

    (재생 2.1로 작동) : 여기 줄리앙의 예는 F.Option를 사용하여 자바에 다시 것

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

    5.선택 쿼리 매개 변수의 경우, 당신은이 방법을 수행 할 수 있습니다

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

    루트 파일에서 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 값을 가질 것이다.

  6. ==============================

    6.이 일을 내 방법은 사용자 정의 QueryStringBindable을 사용하는 것입니다. 나뿐만 경로의 매개 변수를 표현하는이 방법 :

    이 일을 내 방법은 사용자 정의 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이 아닌 다른 기본값을 사용할 수 있습니다.

  7. from https://stackoverflow.com/questions/9657163/how-to-handle-optional-query-parameters-in-play-framework by cc-by-sa and MIT license