Статьи

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

В последних статьях мы увидели, как получить доступ к параметрам запроса , пути и формы в контроллерах MVC. Этот пост показывает, как несколько параметров могут быть сопоставлены с объектом с помощью аннотации @BeanParam.

Давайте снова используем простую HTML-форму из поста о параметрах формы :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<form action="submit" method="post">
  <label>ID:</label>
  <input type="text" name="id" />
 
  <label>Name:</label>
  <input type="text" name="name" />
 
  <label>Role:</label>
  <select name="role">
    <option value="admin">Admin</option>
    <option value="reporter">Reporter</option>
    <option value="accountant">Accountant</option>
  </select>
 
  <input type="submit"/>
</form>

Это определяет простую форму, содержащую два поля ввода текста и меню выбора с тремя опциями.

В предыдущем посте о параметрах формы мы узнали, что мы можем получить доступ к этим параметрам, пометив параметры контроллера с помощью @FormParam.

Однако такой подход обременителен, если форма имеет несколько параметров. В этих ситуациях мы обычно хотим отобразить параметры формы на отдельный объект. @BeanParams помогает нам в этом.

С @BeanParam мы можем написать:

1
2
3
4
5
6
@POST
@Path("submit")
@Controller
public String submit(@BeanParam User user) {
  // use user ..
}

Класс User выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
public class User {
 
  @FormParam("id")
  private long id;
 
  @FormParam("name")
  private String name;
 
  @FormParam("role")
  private Role role;
  
  // getters and setters
}

Когда вызывается метод контроллера, автоматически создается новый экземпляр User. Поля созданного объекта будут заполнены переданными параметрами формы.

@BeanParam и другие аннотации параметров

Классы, используемые с @BeanParam, не ограничиваются параметрами формы. Все аннотации параметров, показанные в предыдущих сообщениях в блоге ( @QueryParam , @PathParam и т. Д.), Могут использоваться внутри параметров компонента.

Например:

1
2
3
4
5
@GET
@Path("/date/{year}/{month}")
public String get(@BeanParam RequestData data) {
  ...
}
01
02
03
04
05
06
07
08
09
10
11
12
13
public class RequestData {
 
  @PathParam("year")
  private int year;
 
  @PathParam("month")
  private int month;
 
  @QueryParam("name")
  private String name;
 
  // getters and setters
}

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

1
/date/2016/02?name=john

значения 2016, 2 и john будут введены в поля year, month и name RequestData.

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

С @BeanParam вы можете вводить параметры запроса в бины. Это особенно полезно, если у вас есть несколько параметров. Внутри параметров бина могут использоваться все остальные аннотации параметров.

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