В предыдущем посте о новой 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 .
| Ссылка: | Java EE 8 MVC: Работа с параметрами запроса от нашего партнера по JCG Майкла Шархага в блоге mscharhag, Programming and Stuff . |