Spring 注解之@RestController與@Controller的區(qū)別
開發(fā)RESTful API 時,一般都會在Controller上加上@Controller注解,但是有時候加上@RestController,當(dāng)同事問為什么的時候,我也一臉懵逼,默默的看了資料,現(xiàn)在就說說他們的區(qū)別。
@RestController注解等價(jià)于@ResponseBody + @Controller。@RestController和@Controller的共同點(diǎn)是都用來表示Spring某個類是否可以接收HTTP請求,二者區(qū)別: @RestController無法返回指定頁面,而@Controller可以;前者可以直接返回?cái)?shù)據(jù),后者需要@ResponseBody輔助。下面詳細(xì)分析。
① 是否可以返回頁面
答:@RestController無法返回指定頁面,而@Controller可以。
解析:對于Controller, 如果只是使用@RestController注解,則其方法無法返回指定頁面,此時配置的視圖解析器 InternalResourceViewResolver不起作用,返回的內(nèi)容就是 return 里的內(nèi)容。 如果需要返回到指定頁面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行。
② 返回內(nèi)容
如果需要返回JSON,XML或自定義mediaType內(nèi)容到頁面,@RestController自己就可以搞定,這個注解對于返回?cái)?shù)據(jù)比較方便,因?yàn)樗鼤詣訉ο髮?shí)體轉(zhuǎn)換為JSON格式。而@Controller需要在對應(yīng)的方法加上@ResponseBody注解。
示例:
import java.util.HashMap; import java.util.Map; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/difference") public class DifferenceController { // 跳轉(zhuǎn)到上傳文件的頁面 @RequestMapping(value = "/goToSuccessPage", method = RequestMethod.GET) public String goToSuccessPage() { // 跳轉(zhuǎn)到 視圖層 success.html失敗 return "success"; } @RequestMapping(value = "findAll", method = RequestMethod.GET) public Map<String, String> findAll() { Map<String, String> all = new HashMap<>(); all.put("remark", "可以返回json,xml或自定義mediaType內(nèi)容到頁面"); return all; } }
@Controller @RequestMapping("/login") public class LoginController { @GetMapping(value = "/login") public String login() { // 跳轉(zhuǎn)到 視圖層 login.html return "login"; } @RequestMapping(value = "/getJson", method = RequestMethod.GET) @ResponseBody public Map<String, String> getJson() { Map<String, String> all = new HashMap<>(); all.put("remark", "結(jié)合注解 @ResponseBody 返回接送"); return all; } }
Buy me a coffee. ?Get red packets.
浙公網(wǎng)安備 33010602011771號