本质区别
有看过源码的朋友就会发现,其实@RestController比@Controller多了一个注解,就是@ResponseBody,换言之,@RestControler
= @Controller + @ResponseBody
衍生区别
本质区别所派生出来的衍生区别,下面也介绍一下。
-
因为@RestController中多了@ResponseBody注解,而@ResponseBody注解主要用于返回json格式的数据,所以主要区别就在于控制器中返回值类型为String的方法中。如果控制器使用了@RestController注解,将会导致方法return的内容直接变成json数据,可以理解为忽略了视图解析器(InternalResourceViewResolver)的作用,即返回值类型为String的方法return时,无法跳转到jsp页面!
-
而使用了@Controller注解的控制器,返回值类型为String的方法要通过return跳转到jsp页面,就可以在视图解析器(InternalResourceViewResolver)的帮助下完成跳转。如果返回值类型为String的方法要通过return来返回json数据,则在方法上的返回值类型上添加@ResponseBody注解即可!
演示
1、@RestController
设计一个jsp页面,超链接直接访问后端,后端是加了@RestController注解的控制器,return
“success”,项目根目录下有success.jsp,如果视图解析器能发挥作用,则会跳转到success.jsp页面,否则浏览器直接显示
success
1.1、TestController.java控制器
package com.test.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/test")
public class TestController {
@GetMapping(value = "/method")
public String method() {
return "success";
}
}
1.2、show.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<title>Show</title>
</head>
<body>
<a href="<%=basePath%>test/method">测试</a>
</body>
</html>
1.3、success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<title>Success</title>
</head>
<body>
This is success page!!!
</body>
</html>
1.4、前端发起请求
浏览器显示success,说明并没有跳转到success.jsp
因此可以证实,添加了@RestController注解的控制器,返回值类型为String的方法,直接return,会返回json格式的数据。
2、@Controller
jsp页面同上,仅修改控制器的注解
2.1、TestController.java控制器
package com.test.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value = "/test")
public class TestController {
@GetMapping(value = "/method")
public String method() {
return "success";
}
}
2.2、前端发起请求
注:如果是SpringBoot项目,需要在核心配置文件中设置视图解析器的解析前缀和解析后缀,如果是SpringMVC项目,则需要在MVC配置文件中添加相应配置,视图解析器才能生效。
至此,演示完成。