SpringMVC:@ResponseBody註解與HttpServletResponse物件

cydestiny發表於2024-07-17

在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

相關文章