大家好,今天来为大家解答讲座预约网站源码分享这个问题的一些问题点,包括讲座app也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
SpringMVC为开发者提供了方便的开发方式和丰富的功能。其中,HttpMessageConverter是SpringMVC中非常重要的一个组件,它负责将客户端提交的请求数据(如JSON、XML等)转换为Java对象,同时也负责将Java对象转换为客户端需要的数据格式。本文将从HttpMessageConverter的作用和源码实现两个方面进行讲解。
作用
在SpringMVC中,客户端通过发送请求,向服务器端请求数据,服务器端接收到请求后需要将请求参数转换为Java对象进行处理,这就需要使用HttpMessageConverter,它主要负责将HTTP请求中的请求参数转换为Java对象或将Java对象转换为HTTP响应中的内容。
HttpMessageConverter是一个接口,SpringMVC中有很多实现类,用于处理不同的数据类型。常见的HttpMessageConverter实现类有:
ByteArrayHttpMessageConverter:用于处理字节数组类型的数据。StringHttpMessageConverter:用于处理字符串类型的数据。FormHttpMessageConverter:用于处理表单类型的数据。MappingJackson2HttpMessageConverter:用于处理JSON类型的数据。Jaxb2RootElementHttpMessageConverter:用于处理XML类型的数据。
HttpMessageConverter接口定义了两个方法:canRead()和canWrite(),分别用于判断当前的HttpMessageConverter是否可以读取或写入指定的数据类型。
如果canRead()方法返回true,那么当前的HttpMessageConverter就可以将HTTP请求中的请求参数转换为Java对象;如果canWrite()方法返回true,那么当前的HttpMessageConverter就可以将Java对象转换为HTTP响应中的内容。
源码实现
下面以MappingJackson2HttpMessageConverter为例,讲解HttpMessageConverter的源码实现。
MappingJackson2HttpMessageConverter是一个用于处理JSON类型数据的HttpMessageConverter实现类。它继承了AbstractJackson2HttpMessageConverter类,并实现了HttpMessageConverter接口。
canRead()
@Override\npublicbooleancanRead(Class<?>clazz,@NullableMediaTypemediaType){\nJavaTypejavaType=getJavaType(clazz,null);\nreturn(this.objectMapper.canDeserialize(javaType)&&canRead(mediaType));\n}
方法首先调用了getJavaType()方法获取JavaType对象,然后判断当前的ObjectMapper是否可以反序列化JavaType对象。
如果当前的HttpMessageConverter可以反序列化JavaType对象并且当前的MediaType可以被处理,那么就返回true,否则返回false。
canWrite()
@Override\npublicbooleancanWrite(Class<?>clazz,@NullableMediaTypemediaType){\nreturn(this.objectMapper.canSerialize(clazz)&&canWrite(mediaType));\n}
方法首先判断当前的ObjectMapper是否可以序列化指定的Java对象
如果可以序列化并且当前的MediaType可以被处理,那么就返回true,否则返回false。
read()
@Override\npublicTreadInternal(Class<?extendsT>clazz,HttpInputMessageinputMessage)throwsIOException,HttpMessageNotReadableException{\nJavaTypejavaType=getJavaType(clazz,null);\ntry{\nreturnthis.objectMapper.readValue(inputMessage.getBody(),javaType);\n}\ncatch(JsonProcessingExceptionex){\nthrownewHttpMessageNotReadableException(&34;+ex.getMessage(),ex,inputMessage);\n}\n}
方法首先调用getJavaType()方法获取JavaType对象,然后通过ObjectMapper的readValue()方法将HTTP请求中的请求参数转换为Java对象。
如果在转换的过程中出现了异常,那么就抛出HttpMessageNotReadableException异常。
write()
@Override\nprotectedvoidwriteInternal(Tt,HttpOutputMessageoutputMessage)throwsIOException,HttpMessageNotWritableException{\n\ntry{\nJsonEncodingencoding=getJsonEncoding(outputMessage.getHeaders().getContentType());\nJsonGeneratorjsonGenerator=this.objectMapper.getFactory().createGenerator(outputMessage.getBody(),encoding);\nwritePrefix(jsonGenerator,t);\nthis.objectMapper.writeValue(jsonGenerator,t);\nwriteSuffix(jsonGenerator,t);\njsonGenerator.flush();\n}\ncatch(JsonProcessingExceptionex){\nthrownewHttpMessageNotWritableException(&34;+ex.getMessage(),ex);\n}\n}
方法首先通过getJsonEncoding()方法获取JSON编码格式,然后通过ObjectMapper的writeValue()方法将Java对象转换为JSON格式的字符串,并将结果输出到HTTP响应中。如果在转换的过程中出现了异常,那么就抛出HttpMessageNotWritableException异常。
异同
大家是不是觉得与前面文章所讲的MethodArgumentResolver很相似,都能够将请求参数转换为Java对象,但它们的作用和处理流程不同:
HttpMessageConverter会在请求到达Controller方法之前进行处理,这意味着它只处理请求参数,而不管Controller方法的签名和参数类型;MethodArgumentResolver会在Controller方法执行之前进行处理,它的作用是将请求参数按照Controller方法的参数顺序进行解析,并将解析结果映射到Controller方法的参数上,然后再调用Controller方法
总结
HttpMessageConverter是SpringMVC中非常重要的一个组件,它主要负责将HTTP请求中的请求参数转换为Java对象或将Java对象转换为HTTP响应中的内容。SpringMVC中提供了很多HttpMessageConverter实现类,可以处理不同的数据类型。
HttpMessageConverter接口定义了两个方法:canRead()和canWrite(),分别用于判断当前的HttpMessageConverter是否可以读取或写入指定的数据类型。HttpMessageConverter的源码实现中,read()方法用于将HTTP请求中的请求参数转换为Java对象,write()方法用于将Java对象转换为HTTP响应中的内容。在具体实现中,开发者可以根据自己的需求自定义HttpMessageConverter实现类。
作者:这堆干货有点猛链接:https://juejin.cn/post/7216495812578050109来源:稀土掘金
讲座预约网站源码分享的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于讲座app、讲座预约网站源码分享的信息别忘了在本站进行查找哦。
