Статьи

Java EE 8 MVC: работа с параметрами запроса

В предыдущем посте о новой Java EE MVC Framework мы подробно рассмотрели контроллеры . В этой и следующих статьях мы увидим, как получить доступ к различным типам данных запроса в контроллерах MVC.

Java EE MVC интенсивно использует JAX-RS, и большинство вещей, которые мы увидим в этом и следующих постах, — это функции JAX-RS. Итак, если вы знакомы с JAX-RS, вы, вероятно, не узнаете много нового в этом посте.

Параметры запроса

Этот пост посвящен параметрам запроса. Если вы прочитаете мою @QueryParam о @QueryParam Java EE MVC , возможно, вы уже знаете аннотацию @QueryParam . Наиболее распространенный вариант использования @QueryParam — сопоставление параметра запроса с параметром метода контроллера.

Например:

1
2
3
4
5
6
7
8
9
@Controller
@Path("query-params")
public class QueryParamsController {
 
  @GET
  public String queryParams(@QueryParam("name") String name) {
    ...
  }
}

Если мы сейчас отправим HTTP-запрос GET по адресу:

1
/query-params?name=john

строка « john » будет передана в качестве параметра имени методу queryParams() .

Тип преобразования

С @QueryParam параметры запроса могут автоматически преобразовываться в различные типы.

Например:

1
2
3
public enum Role {
  admin, reporter, accountant
}
01
02
03
04
05
06
07
08
09
10
11
12
13
@Controller
@Path("query-params")
public class QueryParamsController {
 
  @GET
  public String queryParams(
      @QueryParam("id") long id,
      @QueryParam("name") String name,
      @QueryParam("role") Role role) {
 
    ...
  }
}

Теперь мы можем отправить запрос следующим образом:

1
/query-params?id=42&name=john&role=admin

Параметр запроса может автоматически преобразовываться в тип, если целевой тип соответствует одному из следующих правил:

  • Это примитивный тип
  • Тип имеет конструктор, который принимает один аргумент String
  • Тип имеет статический фабричный метод с именем valueOf() или fromString() с одним аргументом String
  • Тип List<T> , Set<T> ; или SortedSet<T> где T соответствует одному из предыдущих правил

В предыдущем примере id параметра запроса автоматически преобразуется в long . Если параметр id отсутствует или преобразование в long невозможно, будет сгенерировано исключение. Также возможно использовать Long вместо long . В этом случае мы получаем null переданное методу контроллера, если параметр id отсутствует.

У перечислений есть метод valueOf() по умолчанию. Таким образом, role параметра запроса может быть автоматически преобразована в соответствующее значение перечисления.

Использование @QueryParam для полей и методов

@QueryParam не ограничивается параметрами метода. Также возможно сопоставить параметры запроса с полями или методами, как показано в следующем примере:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
@Controller
@Path("query-params-fields")
public class QueryParamsFieldController {
 
  @QueryParam("id")
  private Long id;
 
  @QueryParam("role")
  private Role role;
 
  private String name;
 
  @QueryParam("name")
  public void setName(String name) {
    this.name = name;
  }
   
  @GET
  public String queryParams() {
    // use id, role and name
  }
}

Если мы сейчас отправим запрос HTTP GET по адресу:

1
/query-params-fields?name=john&id=42&role=reporter

параметры устанавливаются в поля id , role и name (через setName() ) перед queryParams() .

Не забывайте, что новый экземпляр класса создается для каждого запроса, поэтому безопасно иметь поля, содержащие информацию о запросе.

Краткое резюме

Аннотацию @QueryParam можно использовать для получения параметров запроса. @QueryParam можно использовать для полей, методов и параметров метода. Параметры запроса могут автоматически преобразовываться в различные типы, если целевой тип является примитивным типом, содержит конструктор String или содержит фабричные методы valueOf() или fromString() .

  • Вы можете найти исходный код для всех показанных примеров на GitHub .