Spring MVC和REST中@RestController和@Controller注释之间的区别

Spring MVC中的@RestController注释不过是@Controller@ResponseBody注释的组合。 它已添加到Spring 4.0中,以简化在Spring框架中RESTful Web Services的开发。 如果您熟悉REST Web服务,您就会知道Web应用程序与REST API之间的根本区别在于,Web应用程序的响应通常是HTML + CSS + JavaScript的视图,而REST API只是以以下形式返回数据: JSON或XML。 这种差异在@Controller@RestController批注中也很明显。 @Controller的工作是创建模型对象的Map并找到一个视图,但是@RestController只是返回对象,而对象数据@RestController JSON或XML的形式直接写入HTTP响应中。

这也可以使用传统的@Controller@ResponseBody批注来完成,但是由于这是RESTful Web服务的默认行为,因此Spring引入了@RestController ,它将@Controller@ResponseBody的行为结合在一起。

简而言之,Spring MVC中的以下两个代码段相同:

@Controller
@ResponseBody
public class MVCController { .. your logic
}
@RestController
public class RestFulController { .... your logic
}

显然,每个人都只想声明一个注解,而不是两个。 另外, @RestController比前两个更明显。

Spring中的@Controller和@RestController是什么?

在Spring框架中, Controller是一个类,它负责准备模型Map,其中包含要由视图显示的数据以及选择正确的视图本身。 它也可以使用@ResponseBody批注直接写入响应流并完成请求。

直接写入响应流的行为对于响应对RESTful Web服务的调用非常有用,因为在这里,我们只是返回数据,而不是返回我早先有关Spring MVC内部工作方式的解释中所述的视图。

如果您在Spring 4之前(例如在Spring 3或Spring 3.1中)开发了RESTful Web服务,那么通过使用@Controller@ResponseBody的组合来创建RESTful响应,您将会很熟悉。 Spring人意识到了这个问题,并创建了@RestController

现在,您无需使用@Controller@RestponseBody批注。 相反,您可以使用@RestController提供相同的功能。 简而言之,它是一种便捷控制器,它将@Controler@Response主体的行为组合为一个。

如果您更想了解在Spring中开发RESTFul Web Service的高级技术,可以进一步将Eugen Paraschiv的REST与Spring Master类一起加入。

Spring中@RestController和@Controller之间的区别

现在,您已经熟悉了这两个注释,现在是分析@RestController@Controler之间的某些事实差异的好时机。 这是一个非常重要的概念,不仅从访谈的角度来看,而且从Spring Core和Spring Web应用程序开发人员认证中也是如此。 如果您正在准备Spring认证 ,则应该熟悉这些细微的差异。 此外,您还可以查看免费的Spring考试,以了解有关考试格式和问题级别的信息。

无论如何,让我们回到重点,这是这两个注释之间的一些重要区别。

  1. @Controller是一个通用注释,用于将类标记为Spring MVC Controller,而@RestController是RESTFul Web服务中使用的特殊控制器,等效于@Controller + @ResponseBody
  2. @RestController是相对较新的,仅在Spring 4.0上添加,但是@Controller是一个旧的注释,自Spring开始支持注释以来就存在,并正式在Spring 2.5版本中添加。
  3. @Controller批注指示该类是“控制器”,例如Web控制器,而@RestController批注指示该类是一个控制器,其中@RequestMapping方法默认情况下采用@ResponseBody语义,即为REST API服务。
  4. @Controller@Component注释的特化,而@RestController@Controller注释的特化。 它实际上是一个使用@Controller@ResponseBody注释的便捷控制器,如下所示。
    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Controller 
    @ResponseBody
    public @interface RestController

    这是@Controller声明的样子:

    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Component
    public @interface Controller
  5. Spring MVC中@Controler@RestCotroller之间的主要区别之一是,一旦将一个类标记为@RestController则每个方法都将写入域对象而不是视图。 您可以查看Bryan Hassen的Spring MVC 4简介,以了解有关如何在基于Spring的应用程序中使用@RestController批注的更多信息。
  6. @RestController@Controller之间的另一个关键区别是,一旦使用@ResponseBody注释了该类, @RestController @ResponseBody在每个处理程序方法上都使用@RestController ,如下所示:

    使用@RestControler:

    @RestController
    public class Book{@RequestMapping(value={"/book"})
    public Book getBook(){
    //...
    return book;
    }
    }

    没有@RestController:

    @Controller
    public class Book{@RequestMapping(value={"/book"})
    @ResponseBody
    public Book getBook(){
    //...
    return book;
    }
    }

您可以看到,如果使用Spring MVC @Controller批注创建RESTful响应 ,则需要使用@ResponseBody批注对每个方法进行批注,而在使用@RestController时则不需要。 它不仅使您的代码更具可读性,而且还为您节省了几个按键。

这是一个使用@RestControllerSpringBoot框架的简单HelloWorld示例:

这就是Spring MVC和REST中@Controller@RestController批注之间区别@RestController是同时使用@Controller@ResponseBody批注的快捷方式。

Spring在Spring 4中有目的地添加了此批注,以使使用Spring框架的RESTful Web服务开发更加容易。 它可以根据请求的MIME类型将响应直接转换为JSON或XML。

因此,如果要创建RESTful Web服务,最好使用@RestController不是将@Controller组合到@ResponseBody

如果您想了解有关使用Spring和Spring Security框架开发RESTful Web服务的更多信息,建议您将Eugen Paraschiv的REST与Spring Coaching一起加入。 Eugen在Java中开发和保护RESTful Web服务方面具有一些良好的现实世界经验,该课程是从他的丰富经验中受益的好机会。

翻译自: https://www.javacodegeeks.com/2017/08/difference-restcontroller-controller-annotation-spring-mvc-rest.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java patriciatrie_明明白白以太坊Merkle Patricia Trie

在以太坊数据结构中,Merkle Patricia Trie始终是个绕不过去的坎,世界状态,交易,交易收据等都是以这种树的形式存储在区块链数据库中,并将树root hash保存在区块头里。可以说不弄懂这种树的原理就没有办法真正明白以太坊…

jdeveloper_适用于JDeveloper 11gR2的Glassfish插件

jdeveloper众所周知, ADF Essentials是使用Java构建Web应用程序的绝佳框架,它可以自由开发和部署。 您在Glassfish(3.1)服务器上部署ADF Essentials应用程序。 但是,JDeveloper并不带有嵌入式Glassfish服务器&#xff…

Spring Cloud教程– Spring Cloud Config Server简介

问题 SpringBoot在通过属性或YAML文件外部化配置属性方面提供了很大的灵活性。 我们还可以使用特定于配置文件的配置文件(例如application.properties , application-dev.properties , application-prod.properties等)分别为每个环…

数字孪生体技术白皮书_基于Flownex的数字孪生体解决方案 系列介绍之二:数据中心应用实例...

致力于数字孪生体技术的研究与发展通过解决方案和工程化应用造福人类来源:数字孪生体实验室原创作者:王永康转载请注明来源和出处导 读《基于Flownex的数字孪生体解决方案》是我们最近完成的系列落地方案之一。该方案适用于热力系统、冷却系统、通风空调…

node php聊天室,最简单的Nodejs聊天室示例

今天群里一个同学找我要一个nodejs聊天室的demo。给他了一个简单的例子,顺便记录下:准备工作(前提是已经装好了nodejs):mkdir nodejs-democd nodejs-demo安装express : npm install express安装socket.io : npm install socket.io安装foreve…

neo4j安装_neo4j 社区版win10 下安装

准备工作:Neo4j下载网址:https://neo4j.com/download-center/#releasesava jdk官网下载:https://www.oracle.com/technetwork/java/javase/downloads/index.html安装 查看是否有用旧版本的java jdk ,如果有请在设置“应用和功能”卸载 旧的ja…

php网站 qq登陆,php写的插件网站接入QQ登录,QQ互联

qq按钮这里的链接是入口,调用你的apiapi_qq.php前端直接链接到此/*** 这个QQ登录简单实用,只要大家看我写的注释会一目了然,请注意看哦。* 带有"todo"这样注释的地方都是要你去改成你自己的逻辑* 这个php怎么进来呢?这是…

Spring MVC中@RequestParam和@PathVariable批注之间的区别?

Spring MVC框架是在Java世界中开发Web应用程序最流行的框架之一,它还提供了一些有用的注释,可以从传入的请求中提取数据并将请求映射到控制器,例如 RequestMapping, RequestParam和PathVariable。 即使将RequestParam和ParthVari…

excel 两列模糊匹配给出结果_北大硕士给大脑植入Excel病毒,工作效率提升了好几倍...

在工作中,我们经常会碰到这样的同事,他们是这样完成工作的:先用计算器算好结果,甚者动用手指头在电脑屏幕上数数,然后把数据填写到Excel表格中。结果可以预见,原本可以在上班时间完成的工作,愣是…

java ee cdi_Java EE CDI Producer方法教程

java ee cdi这是CDI Producer方法的教程。 在CDI中,生产者方法生成一个对象,然后可以将其注入。 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造函数不执行的自定义初始…

qnap nas web php,如何在QNAP NAS上建立并使用 iSCSI Target

本帖最后由 小Q 于 2015-2-5 13:30 编辑在QNAP Turbo NAS上建立并使用iSCSI Target,快速、便利且便宜建置网络储存系统之方式内容:l 在Windows中使用Microsoft iSCSI启动器来连接iSCSI装置什么是iSCSI且它有什么好处?iSCSI(Internet Small Computer Sy…

openssl php api,PHP7使用openssl解密易班API中的用户数据

PHP7使用openssl解密易班API中的用户数据一、mcrypt扩展解密自从PHP版本更新到了7.1以上以后,mcrypt扩展被废弃,使用mcrypt扩展会出现如下图的报错。只能使用openssl来代替。然而易班轻应用提供的还是旧版本的mcrypt扩展,这将导致php版本升级…

Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言。 应该由Spring MVC处理的每个Web请求都通过DispatcherServlet处理。 通常,它是Front Contro…

运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

运行时区域1.程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现&#…

极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...

电子组装业MES系统软件六大功能组成MES系统软件是制造执行系统的英文简称,MES系统软件在整个企业信息集成系统中承上启下,是生产活动与管理活动信息沟通的桥梁,MES系统软件在产品从工单下发到生产成成品的整个过程中,扮演着促进生…

多个cuda 被单进程沾满_报名 | 提高GPU利用率,听英伟达专家分享这个CUDA工具

随着 NVIDIA GPU 计算性能的不断提升,如何提升 GPU 利用率是开发者普遍关心的问题之一。从 Kepler 架构开始,NVIDIA GPU 支持多个 CUDA kernels 函数的并发执行,称为 Hyper-Q 技术。Hyper-Q 技术支持多个 CUDA streams、多个 CPU threads 或者…

usb转ttl模块与matlab,USB接口转TTL小板的自检测试

现在电脑基本上都不会配置DB9串行数据端口了,这给一些喜欢折腾刷机和单片机加载程序的朋友带来了诸多的不便。还好,随着技术的发展,USB接口转TTL的产品越来越成熟,而这种产品主要以采用PL-2303HX芯片作为主控器的居多,…

matlab 误差椭圆,求3倍标准差误差椭圆分析的程序

根据《白话空间统计之九:方向分布(标准差椭圆)修正版》(有些地方没有理解清楚),写了下面的程序。但是好像结果不对Zmvnrnd([0.5 1.5], [0.025 0.03 ; 0.03 0.16], 50);XZ(:,1); YZ(:,2);mean_Xnanmean(X); mean_Ynanmean(Y); %椭圆圆心%确定长短半轴…

java ee cdi_Java EE CDI处理程序方法示例

java ee cdi这是CDI Disposer方法的教程。 在CDI中,由于Producer方法生成的对象随后可以注入到应用程序中,因此使用Disposer方法,以便在其工作完成时将其删除。 Disposer方法始终与Producer方法匹配。 Disposer方法使用的一个示例是当应用程…

python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程。类似这样:每个方程有两个变量,x和y,形式为:axbycd由于这次有了两个方程,我们提取参数的代码就适合提炼为一…