@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格式的数据。

在这里插入图片描述

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

在这里插入图片描述

至此,演示完成。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值