Spring中的WebUtils和ServletRequestUtils指南

2023/05/12

一、概述

在这篇简短的文章中,我们将探索 Spring MVC 中的内置 Web 请求实用程序 – 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,我们只需一行代码即可完成。

要了解这些实用程序的工作原理,让我们创建一个简单的 Web 应用程序。

3.示例页面

我们需要创建示例页面以便能够链接 URL。我们将使用[Spring Boot](https://search.maven.org/classic/#search ga 1 a%3A”spring-boot”)和[Thymeleaf](https://search.maven.org/classic/#search ga 1 a%3A”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";
}

请注意我们如何使用ServletRequestUtils中的getStringParameter API来获取请求参数名称param;如果没有值进入控制器,则默认值将分配给请求参数。

当然,请注意WebUtils中用于在会话属性中设置值的setSessionAttribute API 。我们不需要显式检查会话是否已经存在,也不需要在 vanilla servlet 中进行链接。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 request, String name)用于获取请求参数。不同之处在于,如果在传入请求中找不到该参数,它将抛出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上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章