在Spring MVC框架中,@ResponseBody
註解和HttpServletResponse
物件都扮演著將處理結果傳送回客戶端的重要角色,但它們的使用方式和目的有所不同。
@ResponseBody
@ResponseBody
註解用於將方法的返回值繫結到web響應體(response body)上。當你使用@ResponseBody
註解一個方法的返回值時,Spring會自動選擇一個合適的HttpMessageConverter
,將返回值轉換為對應的格式(如JSON、XML等),並寫入HTTP響應體中。這通常用於RESTful Web服務中,當你需要直接返回資料(如JSON或XML)給客戶端時。
使用示例
@RestController
public class MyController {
@GetMapping("/greeting")
@ResponseBody // 通常與@RestController一起使用時可以省略
public String greeting() {
return "Hello, World!";
}
// 使用@RestController時,下面的@ResponseBody可以省略
@GetMapping("/jsonGreeting")
public MyResponseObject jsonGreeting() {
MyResponseObject response = new MyResponseObject();
response.setMessage("Hello in JSON");
return response; // Spring將自動使用HttpMessageConverter轉換為JSON
}
}
HttpServletResponse
HttpServletResponse
是Servlet API的一部分,它代表了Servlet對客戶端的響應。你可以透過它來直接控制HTTP響應的各個方面,包括狀態碼、響應頭以及響應體。當你需要更細粒度的控制響應時(比如設定特定的響應頭、傳送二進位制檔案等),HttpServletResponse
就顯得非常有用。
使用示例
@Controller
public class MyServletController {
@GetMapping("/customResponse")
public void customResponse(HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("Custom response using HttpServletResponse");
}
@GetMapping("/fileDownload")
public void fileDownload(HttpServletResponse response) throws IOException {
// 設定響應頭
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"example.pdf\"");
// 假設你有一個獲取檔案輸入流的方法
InputStream inputStream = getFileAsStream("path/to/example.pdf");
// 使用ServletOutputStream將檔案內容寫入響應
ServletOutputStream outputStream = response.getOutputStream();
IOUtils.copy(inputStream, outputStream); // 使用Apache Commons IO庫來複制流
outputStream.flush();
}
}
總結
@ResponseBody
主要用於將方法的返回值自動轉換為JSON、XML等格式,並寫入HTTP響應體中,適用於RESTful Web服務。HttpServletResponse
提供了對HTTP響應的細粒度控制,適用於需要直接操作響應頭、響應體等場景。- 在Spring MVC中,
@RestController
註解已經隱式地為所有處理方法的返回值應用了@ResponseBody
註解,因此在@RestController
註解的控制器中,你可以省略@ResponseBody
。