Spring WebUtils 和 ServletRequestUtils 指南

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 BootThymeleaf作为我们的模板引擎。我们需要为它们添加所需的依赖项。

让我们用一个简单的表单创建一个页面:

<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请求。

还有一个链接,它将用户转发到下一页,我们将在其中显示 session 属性中提交的参数。

让我们创建第二个页面:

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. 结论

在本文中,我们看到使用WebUtilsServletRequestUtils可以大大减少大量样板代码的开销。然而,另一方面,它肯定会增加对 Spring 框架的依赖——如果这是一个问题,请记住这一点。

与往常一样,源代码可在 GitHub 上获得。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值