1. 概述

在这篇简短的文章中,我们将探讨Spring MVC中内置的web请求工具——WebUtilsServletRequestUtils

2. WebUtilsServletRequestUtils

在几乎所有的应用程序中,我们都会遇到需要从接收的HTTP请求中获取参数的情况。

过去,我们可能需要编写复杂的代码段来实现这一点,例如:

HttpSession session = request.getSession(false);
if (session != null) {
    String foo = session.getAttribute("parameter");
}

String name = request.getParameter("parameter");
if (name == null) {
    name = "DEFAULT";
}

使用WebUtilsServletRequestUtils,我们可以用一行代码轻松完成。

为了了解这些工具的工作原理,让我们创建一个简单的web应用。

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";
}

注意我们在ServletRequestUtilsgetStringParameter API中如何获取名为param的请求参数;如果请求参数没有值传入控制器,它将自动分配一个默认值。

当然,也请注意WebUtils中的setSessionAttribute API,用于在会话属性中设置值。在原始的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. 总结

通过使用WebUtilsServletRequestUtils,我们可以大大减少大量冗余的编码工作。然而,这也增加了对Spring框架的依赖性,这是需要考虑的问题,特别是当这成为关注点时。

一如既往,源代码可以在GitHub上找到。