Guide to Spring WebUtils and ServletRequestUtils – Spring WebUtils和ServletRequestUtils指南

最后修改: 2017年 2月 20日

中文/混合/英文(键盘快捷键:t)

 

1. Overview

1.概述

In this quick article, we’ll explore the build-in web request utils in Spring MVC – WebUtils, ServletRequestUtils.

在这篇文章中,我们将探讨Spring MVC中内置的Web请求工具–WebUtilsServletRequestUtils

2. WebUtils and ServletRequestUtils

2、WebUtilsServletRequestUtils

In almost all applications, we face situations where we need to fetch some parameters from an incoming HTTP request.

在几乎所有的应用程序中,我们都会面临这样的情况:我们需要从一个传入的HTTP请求中获取一些参数

To do that, we had to create some really hectic code segments like:

为了做到这一点,我们不得不创建一些非常繁忙的代码段,如。

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

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

Using WebUtils and ServletRequestUtils, we can do it with a just one line of code.

使用WebUtilsServletRequestUtils,我们只需要一行代码就可以做到。

To see how these utilities work, let’s create a simple web application.

为了了解这些实用程序如何工作,让我们创建一个简单的网络应用程序。

3. Sample Pages

3.样本页

We need to create sample pages in order to be able to link the URLs. We would use Spring Boot and Thymeleaf as our template engine. We need to add required dependencies for them.

我们需要创建样本页面,以便能够链接URL。我们将使用Spring BootThymeleaf作为我们的模板引擎。我们需要为它们添加必要的依赖性。

Let’s create a page with a simple form:

让我们创建一个带有简单表单的页面。

<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>

As we can see, we are creating a form for initiating the POST request.

我们可以看到,我们正在创建一个用于发起POST请求的表单。

There is also one link, which will forward users to the next page, where we will show the submitted parameter from the session attribute.

还有一个链接,它将把用户转到下一个页面,在那里我们将显示会话属性中的提交参数。

And let’s create a second page:

让我们创建第二个页面。

Parameter set by you: <p th:text="${parameter}" class="param"/>

4. Usage

4.用法

Now that we’re done building the views, let’s create our controller and use ServletRequestUtils and fetch the request parameter:

现在我们已经完成了视图的构建,让我们创建我们的控制器并使用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";
}

Note how we’re using the getStringParameter API in ServletRequestUtils to fetch the request parameter name param; a default value will be assigned to the request parameter if no value is coming into the controller.

注意我们如何使用ServletRequestUtils中的getStringParameter API来获取请求参数名param;如果没有值进入控制器,将为请求参数分配一个默认值。

And, of course, notice the setSessionAttribute API out of WebUtils used to set a value in the session attribute. We don’t need to explicitly check if a session already exists nor link in vanilla servlet. Spring will configure it on the fly.

当然,注意到setSessionAttribute API 出自WebUtils,用于设置会话属性的值。我们不需要明确地检查一个会话是否已经存在,也不需要在vanilla servlet中进行链接。Spring会在飞行中配置它。

In the same way, let’s create the other handler which would show following session attribute:

以同样的方式,让我们创建另一个处理程序,它将显示以下会话属性。

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

That’s all we need to create our application.

这就是我们创建应用程序所需要的一切。

One quick point to note here is that ServletRequestUtils has some wonderful inbuilt features which will automatically typecast the request parameter based on our need.

这里需要注意的一点是,ServletRequestUtils有一些奇妙的内置功能,它将根据我们的需要自动对请求参数进行类型转换。

Here’s how we can convert the request parameter to Long:

下面是我们如何将请求参数转换为Long

Long param = ServletRequestUtils.getLongParameter(request, "param", 1L);

Similarly, we can convert the request parameter to other types:

同样地,我们可以将请求参数转换为其他类型。

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

Another point to note is that ServletRequestUtils has another method getRequiredStringParameter(ServletRequest request, String name) for fetching the request parameter. The difference is that if the parameter is not found in the incoming request, it would throw ServletRequestBindingException. This might be useful when we need to play with critical data.

另一点需要注意的是,ServletRequestUtils有另一个方法getRequiredStringParameter(ServletRequest request, String name)用于获取请求参数。不同的是,如果在传入的请求中没有找到该参数,它将抛出ServletRequestBindingException。当我们需要玩弄关键数据时,这可能是有用的。

Below is a sample code snippet:

下面是一个示例代码片断。

try {
    ServletRequestUtils.getRequiredStringParameter(request, "param");
} catch (ServletRequestBindingException e) {
    e.printStackTrace();
}

We could also create one simple JUnit test case to test the application:

我们还可以创建一个简单的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. Conclusion

5.结论

In this article, we see that using WebUtils and ServletRequestUtils can greatly reduce plenty of boilerplate coding overhead. However, on the other hand, it certainly increases dependency on the Spring framework – which is something to keep in mind if that’s a concern.

在这篇文章中,我们看到使用WebUtilsServletRequestUtils可以大大减少大量的模板编码开销。然而,另一方面,它肯定会增加对Spring框架的依赖性–如果这是个问题的话,那就得记住了。

As always, the source code is available over on GitHub.

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