欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

整体的查找过程如下: AbstractHandlerMethodMapping实现接口getHandlerInterna

点击: 次  来源:劳务派遣管理系统 时间:2017-12-21

原文出处: xiagn

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通过三种方法来识别用户想要返回什么样的数据

  1. 通过请求URL后缀:http://myserver/myapp/accounts/list.html 返回html名目
  2. 通过请求的参数:http://myserver/myapp/accounts/list?format=xls 该配置默认不开启,默认key是format。
  3. 通过HTTP Header的Accept:Accept:application/xml 优先级由上至下

请看如下设置

@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。

这三个组件是用来处理惩罚返回差异名目输出的要害

  • Request Mappings: 抉择差异的请求到差异的要领并返回差异的名目.
  • View Resolution: 按照范例返回符合的暗示层.
  • HttpMessageConverters: 将request中的参数转换成java工具,将java工具转换成相应的输格外式到response.
  • 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)