1. 简介
本文先容利用SpringMVC的后端处事如何通过设置来支持多种返回值范例(xml,json,html,excel)
这里的代码利用的是springboot,下载地点:https://github.com/xiagn825/springboot-todolist/tree/springboot-ContentNegotiation
2. 基本观念
2.1 HttpHeader中Content-Type和Accept配置的区别
Accept:接口要返回给客户端的数据名目
curl --header 'Accept:application/json' http://localhost:8080/todo
Content-Type:客户端发送给处事器端的数据名目
curl -X PUT --header 'Content-Type:application/json' -d '{"title":"周末日程","content":"睡觉"}' http://localhost:8080/todo
2.2 SpringMVC生成输出的两种方法
1) 当处事端利用Restful的方法,只为客户端的ajax或其他处事端请求提供数据时,昆山软件开发,凡是会利用@ResponseBody来标识你的返回,这时候Spring利用HttpMessageConverter来把返回的工具名目化成所需的名目。
2) 当你需要提供表示层(好比:HTML),这时候SpringMVC利用ViewResolver来将处理惩罚你的返回。
有时候你的应用措施这两者都要提供
2.3 SpringMVC输格外式鉴定
许多时候为了支持多个系统或多个终端,你需要让沟通的数据已差异的表示形式输出。
SpringMVC利用ContentNegotationStrategy来鉴定用户请求但愿获得什么名目标数据。
ContentNegotationStrategy通过三种方法来识别用户想要返回什么样的数据
请看如下设置
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false) .favorParameter(true) .parameterName("mediaType") .defaultContentType(MediaType.APPLICATION_JSON) .mediaType("xml", MediaType.APPLICATION_XML) .mediaType("html", MediaType.TEXT_HTML) .mediaType("json", MediaType.APPLICATION_JSON); }
在你工程的WebMvcConfig中插手以上设置,暗示封锁URL后缀的法则,打开请求参数法则并配置请求参数为’mediaType’,默认的返回名目是json,还支持返回xml,html。
这三个组件是用来处理惩罚返回差异名目输出的要害
2.4 RequestMappings
2.4.1 RequestMappingHandlerMapping
我们在spring中凡是利用的就是RequestMappingHandlerMapping,按照RequestMappingInfo,细化匹配条件,整体的查找进程如下:
AbstractHandlerMethodMapping实现接口getHandlerInternal
1. 利用UrlPathHelper查找request对应的path
2. 查找path对应的HandlerMethod
2.1 从urlMap中直接等值匹配查找匹配条件RequestMappingInfo
2.2 假如等值查找到匹配条件,将其添加到match条件中
2.3 假如没有找到匹配条件,利用所有的handlerMethod的RequestMappingInfo举办匹配
2.4 对匹配到的Match举办排序,取出最高优先级的Match,并查对是否是独一的最高优先级
2.5 对匹配到条件,没有匹配到条件的两种环境,别离举办封装
3. 封装HandlerMethod,确保bean中存的是实例 ContentNegotiationManager个中提供了针对miniType的match条件较量,使框架可以匹配到最符合的处理惩罚要领。
2.5 HttpMessageConverter
2.5.1 The Default Message Converters
SpringMvc默认会加载下列HttpMessageConverters:
ByteArrayHttpMessageConverter – converts byte arrays StringHttpMessageConverter – converts Strings ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream SourceHttpMessageConverter – converts javax.xml.transform.Source FormHttpMessageConverter – converts form data to/from a MultiValueMap<String, String>. Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath) MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath) MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath) AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath) RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)