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
请求的表单。
还有一个链接,它会将用户转发到下一页,在那里我们将从会话属性中显示提交的参数。
接着,创建第二个页面:
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,用于在会话属性中设置值。在原始的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上找到。