SpringBoot入门(六)数据响应与内容协商

目录

第七章 Web开发

7.4 数据响应与内容协商

7.4.1 响应JSON

        7.4.1.1 jackson.jar+@ResponseBody---返回值处理器

        7.4.1.2 SpringMVC支持哪些返回值

7.4.2 HTTPMessageConverter(消息转换器)原理

        7.4.2.1 MessageConverter规范

        7.4.2.2 默认的MessageConverter

7.4.3 内容协商

        7.4.3.1 引入支持返回XML的依赖

        7.4.3.2 开启浏览器参数方式内容协商功能

        7.4.3.3 内容协商原理

        7.4.3.4 自定义MessageConverter消息转换器


第七章 Web开发

7.4 数据响应与内容协商

7.4.1 响应JSON

7.4.1.1 jackson.jar+@ResponseBody---返回值处理器

   项目中引入web的依赖场景,而web的依赖场景中已经引用了josn的依赖场景,不需要我们自己手动引入依赖。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>
web场景自动引入了json场景
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-json</artifactId>
        <version>2.3.4.RELEASE</version>
        <scope>compile</scope>
</dependency>

   json场景中又引入了jackson的依赖:

  • 返回值处理器

  •  经过之前说过的请求参数处理,执行相应的方法后得到返回值,进入ServletInvocableHandlerMethod类的invokeAndHandle方法:
    public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
			Object... providedArgs) throws Exception {

		Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
		setResponseStatus(webRequest);
        //如果当前返回值为空
		if (returnValue == null) {
			if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
				disableContentCachingIfNecessary(webRequest);
				mavContainer.setRequestHandled(true);
				return;
			}
		}
        //检测是否有一些返回失败的原因
		else if (StringUtils.hasText(getResponseStatusReason())) {
			mavContainer.setRequestHandled(true);
			return;
		}
        
		mavContainer.setRequestHandled(false);
		Assert.state(this.returnValueHandlers != null, "No return value handlers");
		//核心代码
        try {
			this.returnValueHandlers.handleReturnValue(
					returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
		}
		catch (Exception ex) {
			if (logger.isTraceEnabled()) {
				logger.trace(formatErrorForReturnValue(returnValue), ex);
			}
			throw ex;
		}
	}
try {
   this.returnValueHandlers.handleReturnValue(
         returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}

  • 进入HandlerMethodReturnValueHandlerComposite类的handleReturnValue方法:

  • selectHandle方法就是查找哪个返回值处理器可以处理当前的返回值类型:

  • 返回值处理器判断是否支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot中的内容协商是指根据请求的参数或者请求头中的信息来确定返回的内容类型。在SpringBoot中,默认开启了基于请求头的内容协商功能,即根据请求头中的Accept字段来确定返回的内容类型。同时,也可以通过配置开启基于请求参数的内容协商功能,即根据请求参数来确定返回的内容类型。\[1\]\[2\]内容协商SpringMVC中也有实现,但SpringMVC默认开启的是基于请求头的内容协商功能。\[1\]所以,如果你在SpringBoot中使用内容协商功能,可以直接使用默认的配置,而如果你在SpringMVC中使用内容协商功能,需要手动配置开启基于请求参数的内容协商功能。\[1\]\[2\]内容协商是一个非常重要的知识点,对于理解和掌握SpringBootSpringMVC的请求和响应处理机制非常有帮助。\[3\] #### 引用[.reference_title] - *1* *3* [SpringBoot中的内容协商,颠覆你的认知](https://blog.csdn.net/likun557/article/details/122994859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Springboot-内容协商](https://blog.csdn.net/qq_42250642/article/details/116055710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值