@Controller和@RestController注解的区别

本质区别

有看过源码的朋友就会发现,其实@RestController比@Controller多了一个注解,就是@ResponseBody,换言之,@RestControler
= @Controller + @ResponseBody

衍生区别

本质区别所派生出来的衍生区别,下面也介绍一下。

  1. 因为@RestController中多了@ResponseBody注解,而@ResponseBody注解主要用于返回json格式的数据,所以主要区别就在于控制器中返回值类型为String的方法中。如果控制器使用了@RestController注解,将会导致方法return的内容直接变成json数据,可以理解为忽略了视图解析器(InternalResourceViewResolver)的作用,即返回值类型为String的方法return时,无法跳转到jsp页面!

  2. 而使用了@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格式的数据。

@Controller和@RestController注解的区别_第1张图片

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配置文件中添加相应配置,视图解析器才能生效。

@Controller和@RestController注解的区别_第2张图片

至此,演示完成。

你可能感兴趣的:(个人笔记,经验分享,程序人生,java)