springboot @Controller和@RestController的區別及應用詳解

@Controller和@RestController的區別及應用

@Controller和@RestController區別

在springboot開發中控制層使用註解@Controller時,加有@GetMapping(@PostMapping或@RequestMapping)註解的方法返回值對應的是一個視圖,而使用@RestController返回值對應的是json數據,而@Controller+@ResponseBody的作用相當於@RestController。

@Controller的應用

先在application.properties配置文件中配置

spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html

然後在控制層CustomerController類的代碼為

@Controller
public class CustomerController {
    @Resource
    CustomerServiceI customerServiceI;
    @GetMapping("/")
    public String index() {
        return "redirect:/list";
    }
    @GetMapping("/list")
    public String list(Model model) {
        List<Customer> users = customerServiceI.getUserList();
        model.addAttribute("users",users);
        return "list";
    }
}

啟動程序後在瀏覽器輸入localhost:8080/list訪問頁面即為templates文件夾下的list.html

這裡寫圖片描述

@RestController的應用

控制層CustomerController類的代碼為

@RestController
public class CustomerController {
    @Resource
    CustomerServiceI customerServiceI;
    @GetMapping("/")
    public String index() {
        return "redirect:/list";
    }
    @GetMapping("/list")
    public List<Customer> list(Model model) {
        List<Customer> users = customerServiceI.getUserList();
        model.addAttribute("users",users);
        return users;
    }
}

啟動程序後在瀏覽器輸入localhost:8080/list訪問效果如下

這裡寫圖片描述

@Controller和@RestController區別的小坑

這兩個的區別其實是個很簡單的問題,但是對於初學者可能遇到瞭會掉坑裡。

@RestController註解相當於@ResponseBody + @Controller合在一起的作用。

1.如果註解Controller使用@RestController

則Controller中的方法無法返回jsp頁面,或者html,配置的視圖解析器 InternalResourceViewResolver不起作用,返回的內容就是Return 裡的內容。

代碼如圖:

結果如圖:

2.如果需要返回到指定頁面(jsp/html)

則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行。

代碼如圖:

結果如圖:

如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。

代碼如圖:

結果如圖:

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: