Skip to main content
 首页 » 编程设计

介绍Spring WebUtils 和 ServletRequestUtils

2022年07月19日142zhenyulu

介绍Spring WebUtils 和 ServletRequestUtils

文本我们介绍spring mvc内置的web request工具WebUtils 和 ServletRequestUtils。

场景

在大多数应用中,我们经常遇到从输入http request中取一些参数场景,通常实现代码如下:

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

如果使用Spring WebUtils 和 ServletRequestUtils工具类,仅一行代码足够。

示例页面代码

我们创建一个示例页面增加链接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"/>

使用Spring WebUtils 和 ServletRequestUtils

我们已经创建好了页面,下面开会创建controller并能使用ServletRequestUtils获取request参数:

@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 方法取得请求惨数param的值,如果没有值则取默认值。当然WebUtils类的方法setSessionAttribute 用于设置session的属性。我们无须显示检查session是否存在,也不要清除地链接servlet,spring会自动配置。

同样,我们可以创建另一个处理器用于展示session属性:

@GetMapping("/other") 
public String other(HttpServletRequest request, Model model) { 
 
    String param = (String) WebUtils.getSessionAttribute( 
      request, "parameter"); 
 
    model.addAttribute("parameter", param); 
 
    return "other"; 
}

上面完成了我们的示例应用。另外ServletRequestUtils还有一个内置特性是基于我们的需求对请求参数值进行自动类型转换。

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(); 
}

下面代码可以测试我们的应用:

@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()); 
}

总结

在这篇文章中,我们可以看到使用WebUtils和ServletRequestUtils可以大大减少大量的样板编码开销。然而这必须增加依赖Spring框架。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/80873994