1. Обзор
В этой быстрой статье мы рассмотрим встроенные утилиты веб-запросов в Spring MVC - WebUtils , ServletRequestUtils .
** 2. WebUtils и ServletRequestUtils
**
Практически во всех приложениях мы сталкиваемся с ситуациями, когда нам нужно извлечь некоторые параметры из входящего HTTP-запроса .
Чтобы сделать это, нам нужно было создать несколько действительно беспокойных сегментов кода, таких как:
HttpSession session = request.getSession(false);
if (session != null) {
String foo = session.getAttribute("parameter");
}
String name = request.getParameter("parameter");
if (name == null) {
name = "DEFAULT";
}
Используя WebUtils и ServletRequestUtils , мы можем сделать это всего одной строкой кода.
-
Чтобы увидеть, как работают эти утилиты, давайте создадим простое веб-приложение. **
** 3. Образцы страниц
**
Нам нужно создать образцы страниц, чтобы иметь возможность связывать URL-адреса. Мы будем использовать Spring Boot и https://search.maven.org/classic/#search % 7Cga% 7C1% 7Ca% 3A% 22thymeleaf% 22[ Thymeleaf ]в качестве нашего механизма шаблонов. Нам нужно добавить необходимые зависимости для них.
Давайте создадим страницу с простой формой:
<form action="setParam" method="POST">
<h3>Set Parameter: </h3>
<p th:text="${parameter}" class="param"/>
<input type="text" name="param" id="param"/>
<input type="submit" value="SET"/>
</form>
<br/>
<a href="other">Another Page</a>
Как мы видим, мы создаем форму для запуска запроса POST .
Существует также одна ссылка, которая будет перенаправлять пользователей на следующую страницу, где мы покажем представленный параметр из атрибута сеанса.
И давайте создадим вторую страницу:
Parameter set by you: <p th:text="${parameter}" class="param"/>
** 4. использование
**
Теперь, когда мы завершили построение представлений, давайте создадим наш контроллер и используем ServletRequestUtils и получим параметр запроса:
@PostMapping("/setParam")
public String post(HttpServletRequest request, Model model) {
String param
= ServletRequestUtils.getStringParameter(
request, "param", "DEFAULT");
WebUtils.setSessionAttribute(request, "parameter", param);
model.addAttribute("parameter", "You set: " + (String) WebUtils
.getSessionAttribute(request, "parameter"));
return "utils";
}
Обратите внимание, как мы используем API getStringParameter в ServletRequestUtils для получения имени параметра запроса param ; параметру запроса будет присвоено значение по умолчанию, если в контроллер не поступает никакого значения.
И, конечно же, обратите внимание на API setSessionAttribute из WebUtils , используемый для установки значения в атрибуте сеанса. Нам не нужно явно проверять, существует ли уже сессия или нет ссылки в ванильном сервлете. Весна настроит это на лету.
Таким же образом, давайте создадим другой обработчик, который будет показывать следующий атрибут сеанса:
@GetMapping("/other")
public String other(HttpServletRequest request, Model model) {
String param = (String) WebUtils.getSessionAttribute(
request, "parameter");
model.addAttribute("parameter", param);
return "other";
}
Это все, что нам нужно для создания нашего приложения.
Здесь следует отметить один быстрый момент: ServletRequestUtils имеет несколько замечательных встроенных функций, которые автоматически настраивают параметр запроса в зависимости от наших потребностей.
Вот как мы можем преобразовать параметр запроса в Long :
Long param = ServletRequestUtils.getLongParameter(request, "param", 1L);
Точно так же мы можем преобразовать параметр запроса в другие типы:
boolean param = ServletRequestUtils.getBooleanParameter(
request, "param", true);
double param = ServletRequestUtils.getDoubleParameter(
request, "param", 1000);
float param = ServletRequestUtils.getFloatParameter(
request, "param", (float) 1.00);
int param = ServletRequestUtils.getIntParameter(
request, "param", 100);
Еще один момент, на который следует обратить внимание: у ServletRequestUtils есть другой метод getRequiredStringParameter (запрос ServletRequest, имя строки) для извлечения параметра запроса. Разница в том, что если параметр не найден во входящем запросе, он выдаст ServletRequestBindingException . Это может быть полезно, когда нам нужно играть с критическими данными.
Ниже приведен пример кода:
try {
ServletRequestUtils.getRequiredStringParameter(request, "param");
} catch (ServletRequestBindingException e) {
e.printStackTrace();
}
Мы также могли бы создать один простой тестовый пример JUnit для тестирования приложения:
@Test
public void givenParameter__setRequestParam__andSetSessionAttribute()
throws Exception {
String param = "testparam";
this.mockMvc.perform(
post("/setParam")
.param("param", param)
.sessionAttr("parameter", param))
.andExpect(status().isOk());
}
5. Заключение
В этой статье мы увидим, что использование WebUtils и ServletRequestUtils может значительно сократить множество накладных расходов на кодирование. Однако, с другой стороны, это, безусловно, увеличивает зависимость от среды Spring - что нужно учитывать, если это вызывает озабоченность.
Как всегда, исходный код доступен на over на GitHub .