响应
响应:
- 响应页面
- 响应数据
- 文本数据
- JSON数据
响应页面:
后端控制器:
- 可以看到我们的page.jsp页面是放在了根路径之下的, 所以最终返回的页面路径一定是前面是+/, 也就是绝对路径, 不能是相对路径, 如果相对路径会跑到test路径下
postman发送请求:
可以看到页面是正常返回了
那么可以得到结论, 响应页面其实就是控制器方法返回值为String, 值为页面路径
- 这里有很多小伙伴会认为为什么没有出现异常, 不是应该访问不到jsp页面吗? 不是前端控制器拦截了所有请求吗?
- —> 其实这里是因为对于.jsp结尾的页面请求, 在tomcat中有内置的JspServlet可以处理
- 但是如果是访问后端的html页面或者是js, css都是不行的, 需要设置SpringMvcSupport, 也就是创建一个类继承WebMvcSupport类, 然后实现其中的addResourceHandlers()方法, 设置放行对应的请求给tomcat才可以
响应文本:
就直接响应String类型返回值, 但是不要忘记添加@ResponseBody注解, 就可以了
- 添加@ResponseBody注解之后就是告诉后端响应数据的时候将数据放到响应体中响应
- 添加该注解之后就不会走视图解析器了(也就不会认为这是响应页面), 而是会直接将数据写到响应体中响应回前端
- 此时响应头中的content-type应该是text/html
响应JSON数据:
就直接响应Java对象即可, 也不要忘记添加@ResponseBody注解
- 添加了@ResponseBody注解之后如果响应数据是Java对象, 那么默认会通过对应的转换器将该对象转换为JSON数据, 然后跳过视图解析器, 直接放到响应体中响应给前端
- 这里使用的控制器不是前面我们讲过的Converter接口实现类, 而是使用的HttpMessageConverter接口实现类MappingJackson2HttpMessageConverter完成的
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3i35Jby3-1679316078695)(E:\非凡英才\SpringMVC\图解\MappingJackson2HttpMessageConverter.png)]
- 这个过程中就使用到了Jackson, 所以之前我们讲过需要导入Jackson的坐标, 后面到了SpringBoot就不需要了, 因为SpringBoot内置了Jackson
- 这里使用的控制器不是前面我们讲过的Converter接口实现类, 而是使用的HttpMessageConverter接口实现类MappingJackson2HttpMessageConverter完成的
- 此时响应头中的content-type应该是application/json
补充:
HttpMessageConverter
Http请求响应报文其实都是字符串,当请求报文到java程序会被封装为一个ServletInputStream流,开发人员再读取报文,响应报文则通过ServletOutputStream流,来输出响应报文。
从流中只能读取到原始的字符串报文,同样输出流也是。那么在报文到达SpringMVC / SpringBoot和从SpringMVC / SpringBoot出去,都存在一个字符串到java对象的转化问题。这一过程,在SpringMVC / SpringBoot中,是通过HttpMessageConverter来解决的。HttpMessageConverter接口源码
Converter接口:
converter接口的作用就是将前端传递过来的字符串参数转换为日期, 自定义的对象类型等, 因为前端传递过来的数据肯定是字符串数据, 一般的类型, 比如转为int等类型, springmvc中都已经是提供了类型转换器, 日期类型则需要通过converter接口实现类进行转换
上述两个接口都是转换器, 只不过转换的东西不同