引言
在 Java Web 開發中,SpringMVC 作為 Spring 框架的重要模塊,提供了強大的請求和響應處理機制。本文將深入探討 SpringMVC 中請求和響應的處理方式,結合實際案例,幫助開發者更好地理解和應用這些功能。
一、SpringMVC 請求處理
1. RequestMapping 注解
RequestMapping 注解用于建立請求 URL 和處理方法之間的映射關系,可以作用在類或方法上。
-
作用在類上:作為一級請求路徑。
-
作用在方法上:作為二級請求路徑。
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")public String save() {return "success";}
}
訪問路徑為:http://localhost:8080/項目名/user/save
屬性說明
-
path/value:指定請求路徑的 URL。
-
method:指定允許的 HTTP 請求方法,如 RequestMethod.GET、RequestMethod.POST。
-
params:指定請求參數的條件。
@RequestMapping(value = "/save", method = RequestMethod.POST, params = "age=18")
public String save(@RequestParam("age") int age) {// 處理邏輯
}
2. 請求參數綁定
SpringMVC 支持多種類型的數據綁定,包括基本數據類型、字符串、實體類和集合類型。
基本數據類型和字符串
表單提交的參數名稱需與方法參數名稱一致。
@RequestMapping("/save")
public String save(String username, Integer age) {System.out.println("Username: " + username + ", Age: " + age);return "success";
}
對應的表單:
<form action="/user/save" method="post"><input type="text" name="username"><input type="text" name="age"><input type="submit" value="Submit">
</form>
預覽
實體類綁定
表單參數名稱需與實體類屬性名稱一致。
public class User {private String username;private Integer age;// getter 和 setter
}@RequestMapping("/save1")
public String save1(User user) {System.out.println(user);return "success";
}
對應的表單:
<form action="/user/save1" method="post"><input type="text" name="username"><input type="text" name="age"><input type="submit" value="Submit">
</form>
預覽
集合類型綁定
支持 List 和 Map 類型的參數綁定。
@RequestMapping("/save2")
public String save2(@RequestParam("users") List<User> users) {System.out.println(users);return "success";
}
對應的表單:
<form action="/user/save2" method="post"><input type="text" name="users[0].username"><input type="text" name="users[0].age"><input type="text" name="users[1].username"><input type="text" name="users[1].age"><input type="submit" value="Submit">
</form>
預覽
3. 使用 Servlet API
在控制器中可以直接使用 HttpServletRequest 和 HttpServletResponse 對象。
@RequestMapping("/save3")
public String save3(HttpServletRequest request, HttpServletResponse response) {String username = request.getParameter("username");int age = Integer.parseInt(request.getParameter("age"));System.out.println("Username: " + username + ", Age: " + age);return "success";
}
4. RequestParam 注解
用于綁定請求參數到方法參數。
@RequestMapping("/save4")
public String save4(@RequestParam("username") String name, @RequestParam("age") int age) {System.out.println("Username: " + name + ", Age: " + age);return "success";
}
二、SpringMVC 響應處理
1. 使用 ModelAndView
通過 ModelAndView 對象返回視圖和模型數據。
@RequestMapping("/save5")
public ModelAndView save5() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("msg", "保存成功");modelAndView.setViewName("result");return modelAndView;
}
對應的視圖 result.html
:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Result</title>
</head>
<body>
<h1 th:text="${msg}"></h1>
</body>
</html>
預覽
2. 使用 Servlet API 進行輸出
直接通過 HttpServletResponse 輸出內容。
@RequestMapping("/save6")
public void save6(HttpServletResponse response) throws IOException {response.getWriter().println("保存成功");
}
3. 重定向與轉發
請求轉發
請求轉發 本身是一種服務器端行為?? 瀏覽器的地址欄不發生變化 從始至終都是一個請求 request信息在servlet當中是共享的 只能在網站內部資源之間進行轉發
@RequestMapping("/test1")
public String test1() {return "forward:/otherPage";
}
請求重定向
重定向? 本身是一種客戶端行為? 地址欄是發生改變的? 瀏覽器會發起兩次請求 request域當中的信息是不共享的? 可以訪問網站外部資源
@RequestMapping("/test2")
public String test2() {return "redirect:/otherPage";
}
4. 返回 JSON 數據
使用 @ResponseBody 注解將 Java 對象轉換為 JSON 響應。
@RequestMapping("/find")
@ResponseBody
public User find() {return new User("張三", 25, '男');
}
需要引入 Jackson 相關依賴:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
三、總結
本文詳細介紹了 SpringMVC 中請求和響應的處理方式,包括 RequestMapping 注解的使用、參數綁定、Servlet API 的應用、重定向與轉發、JSON 響應、文件上傳下載以及異常處理等內容。通過這些技術點的講解和示例,開發者可以更高效地使用 SpringMVC 構建功能完善的 Web 應用。