@RequestBody 请求体,获取一个请求的请求体内容
就不用@RequestParam
@RequestMapping("/testRequestBody")public String testRequestBody(@RequestBody String body){System.out.println("请求体: "+body);return "success";}

只有表单才有请求体,点链接没有请求体。

enctype就是encodetype就是编码类型的意思。multipart/form-data
multipart是指表单数据有多部分构成,
既有文本数据(form),又有文件等二进制数据(data)。
multipart/form-data是将文件以二进制的形式上传<form action="${ctp}/testRequestBody" method="post" enctype="multipart/form-data"><input name="username" value="tomcat"/><input name="password" value="123456"><input type="file"    name="file"/><input type="submit"/></form>

图片没在字符集范围的,所以她显示乱码正常的。
文本数据是字符编码的。

HttpEntity除了获取请求的请求体(表单),还可以获取请求的请求头

@RequestMapping("/testHttpEntity")public String testHttpEntity(HttpEntity<String> Body){System.out.println("请求体: "+Body);return "success";}


请求头的全部信息。

,{accept=[image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, /],
referer=[http://localhost:8080/ssm/testOther.jsp],
accept-language=[zh-Hans-CN,zh-Hans;q=0.5],
ua-cpu=[AMD64],
accept-encoding=[gzip, deflate],
user-agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64; Trident/7.0; rv:11.0) like Gecko],
host=[localhost:8080],
content-length=[487],
connection=[Keep-Alive],
cache-control=[no-cache],
cookie=[JSESSIONID=6A5B641C8EF5F4C9E2BDF3641CC546F2; com.springsource.sts.run.embedded=true],
Content-Type=[multipart/form-data;boundary=7e415f2730424;
charset=UTF-8]}


1.@ResponseBody 将返回的数据转化成json字符串,放在响应体中。

2.如果返回的是页面,能转化成json字符串吗,然后放在响应体里面。

@ResponseBody@RequestMapping("/testreturn")public String testreturn(){System.out.println("能转成json吗");return "sucess";


如果返回的是String类型的ResponseEntity
泛型的意义:返回的响应体(body)中内容的类型

public ResponseEntity<String> testreturn(){
new ResponseEntity<String>(body,headers,statusCode);
body:响应体
headers:响应头
statusCode:状态码

ResponseEntity可以定义
返回的HttpStatus(状态码)和HttpHeaders(响应头),body(响应体)

@RequestMapping("/testreturn")public ResponseEntity<String> testreturn(){HttpStatus statusCode;String body ="<h1>success</h1>";MultiValueMap<String,String> headers = new HttpHeaders();headers.add("Set-Cookie", "username=hahhahahaha");返回就 new一个return new ResponseEntity<String>(body,headers,HttpStatus.OK);

响应体

响应头:

扩展:
ResponseEntity<> 可以规定返回的响应体,它的内容类型
如果是文件下载的话,响应体应该是个字节流 byte[ ]

比如:
服务器(Servlet容器)一部署启动web应用,
要下载的资源在web应用的WebRoot的scripts文件夹下

怎么找呢,还要拿到ServletContext实例。

说起ServletContext,一些人会产生误解,以为一个servlet对应一个ServletContext。其实不是这样的,事实是一个web应用对应一个ServletContext,所以ServletContext的作用范围是整个应用,明确这点很重要,这是基础中的基础。

我曾经想,为什么不起名叫WebContext或者ApplicationContext或者WebApplicationContext?这样见名知意多好。后来我想这也可能是有历史原因的:最初的客户端-服务端的架构模型非常简单,服务端运行着一些servlet用来处理客户端的请求。那个时候服务器很轻量级,运行一个应用,应用就由一堆servlet组成。所以这样简单的服务器也被称作servlet容器,主要作用就是运行servlet的。那么提供给应用的上下文就叫做ServletContext。(这个纯属个人意淫_,不对勿喷)

一个web应用对应一个ServletContext实例,这个实例是应用部署启动后,servlet容器为应用创建的。ServletContext实例包含了所有servlet共享的资源信息通过提供一组方法给servlet使用,用来和servlet容器通讯,比如获取文件的MIME类型、分发请求、记录日志等。

这里需要注意一点,如果你的应用是分布式部署的,那么每台服务器实例上部署的Web应用实例都各自拥有一个ServletContext实例。

getRealPath
根据资源(所有servlet共享的资源)虚拟路径,返回实际路径(绝对路径)。
比如说web应用中有个JSP页面index.jsp,调用getRealPath(“index.jsp”),则返回index.jsp文件在文件系统中的绝对路径。在windows下或许是这样:D:\xxx\xxx\index.jsp,

这里可能存在web应用中有多个index.jsp,它们在不同的路径下。
这时候servlet容器
1.先从web应用的根目录下向下查找,
2.从/WEB-INF/lib目录下的各JAR包里面的/META-INF/resources目录查找

1.得到要下载的文件的流
new FileInputStream(realPath);

2.文件流多大,字节数组多大
fileinputstream.available();

3.要把文件流里面的所有数据读到字节数组中。
fileinputstream.read(tmp);

4.关闭文件流
fileinputstream.close();

5.要下载文件的话,那就要定制返回的响应头,要用ResponseEntity

返回的响应体的内容类型就是一个byte[] 字节数组

文件下载的响应头:Content-Disposition
1.表明这是一个需要下载的文件 2.告诉浏览器默认文件名

处理一个downlowd请求(文件下载的请求)@SuppressWarnings({ "unchecked", "rawtypes" })@RequestMapping("/download")public ResponseEntity<byte[]> download(HttpServletRequest request) throws Exception {ServletContext servletcontext = request.getServletContext();1.知道下载的文件的真实路径;String realPath=servletcontext.getRealPath("/scripts/jquery.min.js");2.得到下载的文件的流;FileInputStream fileinputstream=new FileInputStream(realPath);3.文件流有多大,字节数组就有多大byte[] tmp = new byte[fileinputstream.available()];4.要把文件流里面的所有数据,读到字节数组中fileinputstream.read(tmp);5关闭文件流fileinputstream.close();6.要下载文件的话,那就要定制返回的响应头,要用ResponseEntity返回的响应体的内容类型是一个 byte[] 字节数组下载文件的响应头: Content-Disposition 1.表明这是一个要下载的文件 2.告诉浏览器,它的默认文件名HttpHeaders  httpHeaders =  new HttpHeaders();httpHeaders.set("Content-Disposition","attachment;filename="+"jquery.min.js");return new ResponseEntity(tmp,httpHeaders,HttpStatus.OK);}

如果是返回RoponseEntity,视图解析器就不拼串了。
用到HttpEntity(获取请求的请求体,或者请求头)

 起作用的是HttpMessageConverter<T>接口将请求信息流转换为一个对象(类型为T),将对象写到响应流根据请求头的mediaType,我能不能读取这种类型的数据
Boolean canRead(Class<?> clazz,MediaType mediaType);根据响应,我能不能写出这种类型
Boolean canWrite(Class<?> clazz,MediaType mediaType); List<Meida Type>  getSupportMediaTypes();
能支持哪些媒体类型read write




适配器有MessageConverter,
适配器执行目标方法,
一旦发现目标方法的参数,不是我们默认能处理的。
或者发现目标方法的返回值,不是以前的逻辑可以处理的。
调用MessageConverter处理。

HttpMessageConverter:

ByteArrayHttpMessageConverter:
请求信息流(HttpMessage)转换成字节数组(ByteArray)对象

StringHttpMessageConverter:
请求信息流(HttpMessage)转换成字符串(String)对象
将字符串(String)对象写到响应流

来看一下ByteArrayHttpMessageConverter
有个supports方法,看他只支持处理字节数组类型

如果是读取,看readInternal,把请求信息流(HttpMessage)
里面的信息,转换成一个字节数组对象。

如果是写,看writeInternal,把字节数组对象 写到响应流

getBody() 获取一个输出流(OutputStream)
字节数组以输出流的形式写出去

8.HttpEntity,ResponseEntity相关推荐

  1. ResponseEntity类和HttpEntity及跨平台路径问题

    1. 简介 使用spring时,达到同一目的通常有很多方法,对处理http响应也是一样.本文我们学习如何通过ResponseEntity设置http相应内容.状态以及头信息. ResponseEnti ...

  2. spring ResponseEntity

    spring ResponseEntity 1. 用途 ​ ResponseEntity用于后台服务返回给前端发送数据的格式化.开始的时候,我们用json包生产一个json的字符串,配合http 协议 ...

  3. 【本人秃顶程序员】技巧分享丨spring的RestTemplate的妙用,你知道吗?

    ←←←←←←←←←←←← 快!点关注 为什么要使用RestTemplate? 随着微服务的广泛使用,在实际的开发中,客户端代码中调用RESTful接口也越来越常见.在系统的遗留代码中,你可能会看见有一 ...

  4. @ResponseBody ResponseEntity

    @ResponseBody ResponseEntity 1.产生疑问 我们知道,如果在 Controller 的某个方法上加上 @ResponseBody 注解,那么你就能拿到 json 数据. 如 ...

  5. SpringBoot2 整合OAuth2组件,模拟第三方授权访问

    本文源码:GitHub·点这里 || GitEE·点这里 一.模式描述 授权服务 验证第三方服务的身份,验证邮箱用户的身份,记录和管理认证Token,为资源服务器提供Token校验.场景:第三方网站借 ...

  6. springsecurity oauth2_跟OAuth2杠上了,老师,我要学全套的!

    昨天和小伙伴们说了 OAuth2 中的授权码模式,我从头到尾写了一个非常详细的案例,来和小伙伴们分享授权码模式的使用. 有小伙伴表示为什么没有另外三种授权模式的演示代码?要学就学全套的!这不,赶紧把另 ...

  7. SpringCloud之RestTemplate,几种常见的请求方式

    https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...

  8. 如何发起一个HTTP请求,发送HTTP请求的几种方式

    目录 概述 如何发起一个HTTP请求 模拟浏览器发送HTTP请求方式 概述 如何发起一个HTTP请求?这个问题似乎既简单又复杂,简单是指当你在浏览器里输入一个URL时,按回车键后这个HTTP请求就发起 ...

  9. 遇见OFFER,阿里云最强技术团队现身招聘,“职”为你来

    简历投递入口: https://bss.csdn.net/delivery/resume/ali 在5·15 遇见OFFER大厂梦招聘活动中,近20家企业来到CSDN[遇见OFFER]直播招聘栏目,其 ...

最新文章

  1. CentOS 7下编译安装Open Babel2.4.1和python绑定
  2. 手把手教你上手python库pydbgen(附代码、安装地址)
  3. ERROR: tensorboard 1.14.0 has requirement setuptools=41.0.0, but you'll have setuptools 39.1.0 whic
  4. (事件类型: 警告;事件代码:3005)的解惑
  5. Struct复杂数据类型的UDF编写、兼容HIVE的GenericUDF编写
  6. Callgrind:调用图生成缓存和分支预测分析器
  7. 大刚二开emlog模板超级帅-全版本兼容-修复各种bug
  8. Java编程的11个特点
  9. 数据仓库分层设计,零基础一看就会
  10. python 合并word并生成目录_使用Python制作WORD报告
  11. word2vec模型原理及实现词向量训练案例
  12. gh-ost学习笔记 试验代码学习
  13. 18岁少年辍学组建黑客俱乐部 已覆盖62所学校
  14. [渝粤教育] 西南科技大学 英语泛读 在线考试复习资料
  15. 程序员装机必备利器列表
  16. python制作壁纸获取器exe,壁纸采集
  17. 【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)
  18. 23计算机考研复习规划和经验分享
  19. 汽车防抱死制动系统(ABS)技术
  20. Qt制作简易的酷狗音乐播放器

热门文章

  1. 男女关系的30种经典比喻
  2. 我如何设计数据团队的入职培训课程?
  3. DBeaver安装与使用教程(超详细安装与使用教程)
  4. Win10下 Swin Transformer目标检测环境配置流程
  5. 支持组播的流媒体服务器,VLC 搭建流媒体服务器
  6. 仓库规划方法论-六大原则
  7. Unity CSG 布尔运算插件 模型打孔 模型打洞 模型挖洞
  8. webpack使用教程(二)
  9. 省选专练(这个真的有省选难度?)期望入门铃仙
  10. 判断计算机硬件和网络故障,计算机网络硬件的不同检测方法与维护