1、概述
在这篇快速文章中,我们将探索 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和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请求。
还有一个链接,它将用户转发到下一页,我们将在其中显示 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. 结论
在本文中,我们看到使用WebUtils和ServletRequestUtils可以大大减少大量样板代码的开销。然而,另一方面,它肯定会增加对 Spring 框架的依赖——如果这是一个问题,请记住这一点。
与往常一样,源代码可在 GitHub 上获得。