SpringMVC解析JSON请求数据问题解析

  

这几年都在搞前后端分离,宁静的风格,我们项目中也在这样用。前几天有人遇到了解析JSON格式的请求数据的问题,然后说了一下解析的方式,今天就写篇文章简单的分析一下后台对于JSON格式请求数据是怎么解析的。
  

  

先把例子的代码贴出来:
  

  

前端         & lt;输入类型="按钮" value=" https://www.yisu.com/zixun/测试JSON数据”/比;   & lt;脚本type=" text/javascript祝辞   函数testJSON () {   . ajax({美元   类型:“文章”,   url:“/testJson”,   application/json contentType:“”,   数据类型:“json”,   数据:JSON.stringify({“名称”:“张三"}),   成功:函数(jsonResult) {   警报(jsonResult);   }   });   }   & lt;/script>   之前      

后台处理代码如下:

        @RequestMapping (value=" https://www.yisu.com/zixun/testJson ")   公共字符串testJson (@RequestBody地图名字,HttpServletRequest请求){   System.out.println(名称);   返回“jsonp”;   }   之前      

这里需要注意的是:要在参数对象上加上@RequestBody注解,这个一定不能少,后台在接收JSON数据的时候一定要用自定义的对象或者地图对象去接收,不要用JDK中的简单对象(字符串、整数/长)来接收。
  

  

接下来我再把抓出来的http请求贴一下:

        内容类型:application/json      

 SpringMVC解析JSON请求数据问题解析

  

这里需要注意的是:请求负载中的格式一定要和上图一致,其他格式SpringMVC会解析不出来。

  

好的,如上的代码就可以搞定一个JSON请求数据的解析了。下面我们来分析一下SpringMVC是怎么处理JSON请求的。

  

SpringMVC处理请求的简单时序图如下:

  

 SpringMVC解析JSON请求数据问题解析

  

正常情况下,一个请求在SpringMVC中一般会调用是否是doDispatch这个方法,我们进入到这个方法中直接跳到

        mv=哈。处理(processedRequest、响应mappedHandler.getHandler ());之前      

这一行,这一行上面的内容我们以后再找机会分析。
  

  

ha.handle这个方法会调用org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter中的处理方法,这个方法里面很简单,就是调用了handleInternal这个方法,代码如下:

        公众最终ModelAndView处理(HttpServletRequest请求、HttpServletResponse响应对象处理程序)   抛出异常{      返回handleInternal(请求、响应(HandlerMethod)处理程序);   }   之前      

而handleInternal这个方法调用的是org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中的handleInternal方法,我们进入到这个方法中看看这个方法中都干了一些什么事:

        @Override   保护ModelAndView handleInternal (HttpServletRequest请求,   HttpServletResponse响应,HandlerMethod HandlerMethod)抛出异常{      ModelAndView飞行器;   checkRequest(请求);//检查是不是所支持的请求类型,是不是要求//执行invokeHandlerMethod同步块如果需要。   如果(this.synchronizeOnSession){//会话中是不是要求同步执行   HttpSession会话=request.getSession(假);   如果(会话!=null) {   互斥对象=WebUtils.getSessionMutex(会话);   同步(互斥){//同步执行方法调用   飞行器=invokeHandlerMethod(请求、响应handlerMethod);   }   }   其他{//没有HttpSession→没有必要互斥   飞行器=invokeHandlerMethod(请求、响应handlerMethod);   }   }   其他{//不同步>   invocableMethod。invokeAndHandle (webRequest mavContainer);之前      

这里。这个方法在org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod中。在这个方法中我们只关注第一句话:

        对象returnValue=https://www.yisu.com/zixun/invokeForRequest (webRequest、mavContainer providedArgs);之前      

invokeForRequest这个方法在org.springframework.web.method.support.InvocableHandlerMethod中,同样在这个方法中我们也只关注第一句话:

        对象[]参数=getMethodArgumentValues(请求、mavContainer providedArgs);

SpringMVC解析JSON请求数据问题解析