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

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 .