jq处理返回来json_SpringBoot入门建站全系列(二)Controller种类及映射处理详解

news/2024/5/16 1:04:07/文章来源:https://blog.csdn.net/weixin_35755562/article/details/112376032

641ca48a7e31b2784d68ba334e45f128.png

SpringBoot入门建站全系列(二)Controller种类及映射处理详解

Controller及Mapping其实不属于SpringBoot,SpringBoot只是个大杂烩的容器而已。Controller及Mapping分别在Spring的web和context包中存在着。

本文主要介绍Controller种类及映射处理详解,并针对不同的写法做出示例。

品茗IT-SpringBoot专题-同步发布

品茗IT 提供在线支持:

一键快速构建Spring项目工具

一键快速构建SpringBoot项目工具

一键快速构建SpringCloud项目工具

一站式Springboot项目生成

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

一、Controller种类

Controller可以简单分为RestController和Controller。RestController位于Spring的web包中,Controller还是在Spring的context包中。

1.1 Controller

控制器Controller 负责处理由DispatcherServlet 分发的请求。在这个时候,就先不考虑Model、ModelMap和ModelAndView之类的东东,大多数时候根本用不上这三个东东的,Spring提供的方法很简洁的,后面会一一讲解。

@Controller注解的类,会作为访问的路径映射处理,不加特殊处理的返回值会被作为跳转路径。

1.2 RestController

就是@Controller + @ResponseBody 注解的综合,返回值如果是实体,一般作为json数据返回,也可以定制返回值。

二、Mapping种类

RequestMapping是mapping的基本类型,另外还有GetMapping、PostMapping、PutMapping、DeleteMapping、PatchMapping。

2.1 RequestMapping

RequestMapping注解包含以下属性:

name: 别名

value/path: 请求路径

method:请求类型(get/post...)

params: 筛选参数

headers:筛选http header

consumes: 筛选content-type

produces: 返回值的content-type

2.2 GetMapping

等价于@RequestMapping(method = RequestMethod.GET),只处理http的get请求。

2.3 PostMapping

等价于@RequestMapping(method = RequestMethod.POST),只处理http的post请求。

2.4 PutMapping

等价于@RequestMapping(method = RequestMethod.PUT),只处理http的pus请求。

2.5 DeleteMapping

等价于@RequestMapping(method = RequestMethod.DELETE),只处理http的delete请求。

2.6 PatchMapping

等价于@RequestMapping(method = RequestMethod.PATCH),只处理http的patch请求。

2.7 Http不同方法的区别

幂等: 如果一个方法重复执行多次,产生的效果是一样的,那就是幂等的。幂等的意思是如果相同的操作再执行第二遍第三遍,结果还是一样。

RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。

如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。

RESTful其实还是http,只是定义了一种http请求的规范,我们如果按照这个规范来了,它就是RESTful,如果不按照这个规范来,就不能称之为RESTful。比如,我们在GET请求里做了新建或更新,那它就不是幂等的,事实上,我们一般只是用到了GET和POST请求,PUT、PATCH、DELETE一般都没用上,都是用GET/POST来完成这些操作了,而且没毛病,不过最好是按照RESTful的要求来写,比如elasticsearch就有一套很规范的RESTful Api。

RESTful风格主要用到以下几种:

GET: 获取数据。

POST: POST方法不是幂等的,多次执行,将导致多条相同的条目被创建。

PUT: PUT方法一般会用来更新一个已知资源,幂等。

PATCH:是对PUT方法的补充,用来对已知资源进行局部更新,PATCH是幂等的。

DELETE: 删除操作。

三、Request参数获取方法种类

对请求的参数获取,一般有以下几种方式:

3.1 RequestBody

请求体body作为字符串进行解析,一般是是json或者xml。

3.2 RequestParam

请求参数为键值对,请求方式可以为GET请求的key=xx&value=xx形式,也可以是post的form或x-www-form-urlencoded

3.3 RequestPart

作用类似于RequestParam,但是更强大,复杂的请求,如一个formdata中,包含一个文件和一个json,这时用RequestParam只能解析出文件和一个json字符串,用RequestPart可以解析出文件和实体。

3.4 RequestHeader

可以把Request请求header部分的值绑定到方法的参数上.

3.5 CookieValue

顾名思义,获取cookie值。

3.6 PathVariable

请求路径中的某一部分。

3.7 ModelAttribute

运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中。

运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中。

反正没用过。

3.8 RequestAttribute

获取Request作用域下塞入的Attribute属性。

3.9 SessionAttribute

获取Session作用域下塞入的Attribute属性。

四、示例

4.1 请求跳转

默认跳转方式就是forward。

forward和redirect的不同就是,redirect是302,地址栏会变化的,显示最新请求地址。forward不会变。

@Controller
@RequestMapping("/web")
public class HelloWorldWeb {@RequestMapping(value = "/hello")public String test() {return "/index.html";}@RequestMapping(value = "/hello1")public String test1() {return "forward:/index.html";}@RequestMapping(value = "/hello2")public String test2() {return "redirect:/index.html";}}

4.2 请求json/xml,返回json/xml

根据下面的测试情况可以看出,不指定produces,默认都是返回json。不指定consumes和produces的情况下,可以根据请求数据类型做解析,默认都是返回json。

要想返回xml,或支持xml数据,需要添加依赖:

<dependency><groupId>com.fasterxml.jackson.jaxrs</groupId><artifactId>jackson-jaxrs-xml-provider</artifactId>
</dependency>

同名路径允许存在,但请求信息应不同,比如请求数据为json/xml的不同。

@PostMapping和@RequestMapping功能一样,但是@PostMapping只支持POST请求,@RequestMapping不指定请求类型的时候,是可以捕获所有类型的请求。

@RestController
@RequestMapping("/test")
public class HelloWorldRest {@RequestMapping(value = "/hello")public String test() {return "hello,world";}@RequestMapping(value = "/testJsonx")public TestClass hellox(@RequestBody TestClass json) {return json;}@RequestMapping(value = "/testResXml",consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_XML_VALUE)public TestClass hello(@RequestBody TestClass json) {return json;}@PostMapping(value = "/test",consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)public TestClass hello1(@RequestBody TestClass json) {return json;}@RequestMapping(value = "/test",consumes=MediaType.APPLICATION_XML_VALUE, produces=MediaType.APPLICATION_XML_VALUE)public TestClass hello2(@RequestBody TestClass json) {return json;}@RequestMapping(value = "/testReqJson",consumes=MediaType.APPLICATION_XML_VALUE, produces=MediaType.APPLICATION_JSON_VALUE)public TestClass hello3(@RequestBody TestClass json) {return json;}public static class TestClass{String key;String value;public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}}

4.3 跳转和json/xml共存

只需在需要返回json/xml的实体上加上ResponseBody即可。

@Controller
@RequestMapping("/web")
public class HelloWorldWeb {@RequestMapping(value = "/hello")public String test() {return "/index.html";}@RequestMapping(value = "/testJsonx")@ResponseBodypublic TestClass hellox(@RequestBody TestClass json) {return json;}
}

4.4 各种参数获取方式示例

@RestController
@RequestMapping("/all")
public class HelloWorldALLRest {/*** 测试json请求* @param json* @return*/@PostMapping(value = "/testJson")public TestClass hellox(@RequestBody TestClass json) {return json;}/*** 测试获取url参数* @param json* @return*/@GetMapping(value = "/testBody")public TestClass testBody(TestClass json) {return json;}/*** 测试获取key-value的参数值* @param key* @return*/@GetMapping(value = "/testParam")public String testParam(@RequestParam("key") String key) {return key;}/*** 测试获取路径* @param id* @return*/@GetMapping(value = "/testParam/{id}")public String helloxx(@PathVariable("id") String id) {return id;}/*** 测试获取参数* @param key* @return*/@GetMapping(value = "/testAttr")public String testAttr(@ModelAttribute("key") String key) {return key;}/*** 测试RequestPart功能* @param file* @param testClass* @return*/@PostMapping(value = "/testPart")public TestClass testPart(@RequestPart("file") MultipartFile file, @RequestPart("testClass") TestClass testClass) {return testClass;}/*** 测试文件自动填充* @param testClassMutiPart* @return*/@PostMapping(value = "/testMultipart")public TestClassMutiPart testMultipart(TestClassMutiPart testClassMutiPart) {return testClassMutiPart;}/*** 测试http头自动填充* @param type* @return*/@GetMapping(value = "/testHeader")public String testHeader(@RequestHeader("Connection") String type) {return type;}/*** 测试cookie信息自动填充* @param JSESSIONID* @return*/@GetMapping(value = "/testCookie")public String testCookie(@CookieValue("JSESSIONID") String JSESSIONID) {return JSESSIONID;}/*** 测试session的属性值获取* @param test* @param http* @return*/@GetMapping(value = "/testSession")public String testSession(@SessionAttribute(value = "test", required = false) String test,HttpServletRequest http) {http.getSession().setAttribute("test", "asdasd");return test;}/*** 测试requst的属性值获取,需要一个跳转到本路径的请求做配置,或者中途对requst做过修改也可以。* @param test* @return*/@GetMapping(value = "/testReqAttr")public String testReqAttr(@RequestAttribute(value = "test", required = false) String test) {return test;}/*** 测试用内部类,写成外部类也可以* @author fufei**/public static class TestClass {String key;String value;public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}/*** 测试用内部类,写成外部类也可以* @author fufei**/public static class TestClassMutiPart {String key;String value;MultipartFile file;public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public MultipartFile getFile() {return file;}public void setFile(MultipartFile file) {this.file = file;}}
}

喜欢这篇文章么,喜欢就加入我们一起讨论SpringBoot技术吧!

afdea49793952d012023f6c18e018441.png

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

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

相关文章

php网站底部版权修改,Discuz论坛标题和底部去掉版权信息实例讲解

需求&#xff1a;一、标题&#xff1a;打开template/default/common/header_common.htm文件&#xff0c;里面的代码如下$navtitle - $_G[setting][bbname]Powered by Discuz!$_G[setting][seohead]1、原来的标题代码为&#xff1a;$navtitle - $_G[setting][bbname]Powered by …

合理利用缓存,创建高性能网站

1、缓存的分类 客户端缓存分为强缓存和协商缓存&#xff0c;它们之间最重要的区别是强缓存不会发起网络请求&#xff0c;而协商缓存会发起网络请求 强缓存&#xff1a;如果强缓存命中&#xff0c;则浏览器从自身的缓存中获取资源&#xff0c;不会发起请求到服务端。从网络请求…

TheBeerHouse 网站项目学习笔记(1)----换肤技术

转自&#xff1a;http://www.bcbbs.net/news/Content31274.aspx 对于ASP.NET学习的中期,TheBeerHouse 项目是一个不错的选择,这个项目几乎囊括了所有ASP.NET 2.0下所有的技术点,而且其设计的类图架构知识值得我们借鉴.关于此项目的介绍,在此不罗嗦,可以参看如下地址: 1. 源码下…

项目管理实践【五】自动编译和发布网站

转自&#xff1a;http://www.cnblogs.com/ttzhang/archive/2008/11/10/1330321.html 在上一篇教程项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】 中&#xff0c;我们讲解了如何使用CCNETMSBuild来自动编译项目&#xff0c;今天我们讲解一下怎…

传AOL将收买博客聚合网站Outside.In

网易科技讯 3月4日动静&#xff0c;据国外媒体报道&#xff0c;据业内一位知恋人士吐露&#xff0c;美国在线公司(AOL)将于美国时间往日宣布揭晓&#xff0c;该公司已收买"超当地化&#xff08;Hyper-Local&#xff09;"博客聚合网站Outside.In。眼前当今尚不分明美国…

Java版PageRank及网站收录情况查询代码

在Google这个由10的100次方得名的站点中&#xff0c;各种评估网站的算法层出不穷&#xff0c;而PageRank即是其中之一。Google的PageRank根据网站的外部链接和内部链接的数量和质量俩衡量网站的价值。PageRank背后的概念是&#xff0c;每个到页面的链接都是对该页面的一次投票&…

H标签在SEO中的应用方法

转载于:https://www.cnblogs.com/vger/archive/2011/06/27/2091456.html

把网店开到美国去--个人网店(自己制作的电子商务网站)

吾阅&#xff1a;借助支付宝等成熟线上支付工具和带独立域名的C2C网店不但多了个性化&#xff0c;而且有进一步发展壮大的可能。 所售商品也不局限于实物&#xff0c;你的摄影作品和小软件都可以找到买家。 如果你有程序设计的天赋&#xff0c;App Store绝对就比ebay强&#…

关于IIS7发布网站

用IIS7 发布网站的时候&#xff0c;出现这个错误&#xff0c;一般将这个连接池“高级设置” &#xff0c;托管管道模式&#xff0c;由Intergrated 改为Classic 类型。 转载于:https://www.cnblogs.com/withoutaword/archive/2013/01/30/2883223.html

中文域名在SEO上的威力!

吾阅&#xff1a;有待验证&#xff1b; 中文域名在SEO上的威力&#xff01; 转自&#xff1a;http://富妈妈.net/20100524/330.html 5月21日着手将博客转移到自己的中文域名&#xff1a;http://富妈妈.net。5月22日周六陪孩子&#xff0c;抽空搜索了一下&#xff0c;发现已经…

百度推出开放平台 或颠覆下载网站等六大行业

百度推出开放平台 或颠覆下载网站等六大行业 2010年08月27日07:08腾讯科技李乐东 雷建平 吾阅&#xff1a;百度的框计算&#xff1f;谁说技术没有用&#xff1f;要是搞个搜索出来&#xff0c;全国都被你统治&#xff1b; 转自&#xff1a;http://tech.qq.com/a/20100827/000115…

WordPress SEO by Yoast 插件安全绕过漏洞

漏洞名称&#xff1a;WordPress SEO by Yoast 插件安全绕过漏洞CNNVD编号&#xff1a;CNNVD-201304-177发布时间&#xff1a;2013-04-12更新时间&#xff1a;2013-04-12危害等级&#xff1a; 漏洞类型&#xff1a; 威胁类型&#xff1a;远程CVE编号&#xff1a; WordPress SEO…

bootstrap弹窗_响应式网站制作之响应式视频弹窗实现

很多网站都有视频播放的功能&#xff0c;有些视频播放需要外链出去播放&#xff0c;不太影响网站的加载和网站的使用流量&#xff0c;有些则需要到本地播放&#xff0c;极大的影响了网站的加载和流量的使用&#xff0c;而有些网站还有一系列的视频列表页&#xff0c;这样的情况…

一个使用Ruby on Rails开发LBS网站的简单实例

一个使用Ruby on Rails开发LBS网站的简单实例 cheungmine 2011-7 这几天一直在学习使用Ruby on Rails(RoR)&#xff0c;想建立一个功能全面一点的LBS(Location Based Service)网站。但是对于我这个RoR的初学者&#xff08;仅有几天时间&#xff09;来说&#xff0c;毕竟太复杂…

[网站公告]23:00-05:00阿里云SLB升级会造成4-8次每次10秒的闪断

大家好&#xff0c;阿里云将于今天夜里&#xff08;7月29日23:00-7月30日05:00&#xff09;对负载均衡服务&#xff08;SLB&#xff09;进行升级操作&#xff0c;升级期间我们使用的SLB实例会有4-8次的闪断&#xff0c;每次闪断时间10秒左右。闪断期间会造成网站不能正常访问&a…

网站安全通用防护代码(C#版本源码提供)

每一个开发者都会意识到&#xff0c;网站发布之前&#xff0c;需要进行安全检查。 那么如何拦截攻击者注入恶意代码&#xff1f;如何防御诸如跨站脚本攻击&#xff08;XSS&#xff09;、SQL注入攻击等恶意攻击行为&#xff1f; 针对目前常见的一些安全问题&#xff0c;结合目前…

网站策划方案写作、演示标准

一份成功的网站策划方案是赢得订单的重要砝码&#xff0c;如何写一份令客户心动的网站策划方案则需要下苦功夫。《网站策划方案写作、演示标准》主要分为7个部分&#xff0c;希望对您有帮助&#xff1a;1. 网站策划方案的价值——内容重点阐述了解决方案能给客户带来什么价值&a…

网站策划方案写作、演示标准

一份成功的网站策划方案是赢得订单的重要砝码&#xff0c;如何写一份令客户心动的网站策划方案则需要下苦功夫。《网站策划方案写作、演示标准》主要分为7个部分&#xff0c;希望对您有帮助&#xff1a;1. 网站策划方案的价值——内容重点阐述了解决方案能给客户带来什么价值&a…

理解 Ajax 及其工作原理,构建网站的一种有效方法

理解 Ajax 及其工作原理&#xff0c;构建网站的一种有效方法 Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成&#xff0c;这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本文的作者是一位 Ajax 专家&#xff0c;他演示了这些技术如何协同工作 —— …