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. 使用方法
現在我們已經完成了視圖的構建,接下來我們創建控制器並使用 <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. 結論
在本文中,我們看到使用 WebUtils 和 ServletRequestUtils 可以極大地減少大量的樣板代碼開銷。然而,另一方面,它也肯定增加了對 Spring 框架的依賴,如果這是您的關注點,則需要注意。