知識庫 / Spring / Spring MVC RSS 訂閱

Spring WebUtils 和 ServletRequestUtils 使用指南

Spring MVC
HongKong
6
02:40 PM · Dec 06 ,2025

 

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 請求的表單。

此外,還有一個鏈接,它會將用户轉發到下一頁,該頁將顯示從會話屬性中提交的參數。

讓我們創建一個第二個頁面:

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

4. 使用方法

現在我們已經完成了視圖的構建,接下來我們創建控制器並使用 <em >ServletRequestUtils</em> 獲取請求參數:

@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";
}

請注意我們如何使用 getStringParameter API 在 ServletRequestUtils 中獲取請求參數名 param;如果請求參數沒有值,控制器將分配一個默認值。

當然,請注意 setSessionAttribute API 出自 WebUtils 用於在會話屬性中設置值。我們不需要顯式檢查會話是否存在,也不需要鏈接到純 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 框架的依賴,如果這是您的關注點,則需要注意。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.