В предыдущем посте о новой 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 . |