Перейти к основному содержимому

Руководство по Spring WebUtils и ServletRequestUtils

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

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 и 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 ; параметру запроса будет присвоено значение по умолчанию, если в контроллер не поступает никакого значения.

И, конечно же, обратите внимание на setSessionAttribute API из WebUtils , используемый для установки значения в атрибуте сеанса. Нам не нужно явно проверять, существует ли сеанс или ссылка в ванильном сервлете. Spring настроит его на лету.

Таким же образом создадим другой обработчик, который будет отображать следующий атрибут сеанса:

@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, о чем следует помнить, если это вас беспокоит.

Как всегда, исходный код доступен на GitHub .