这几年都在搞前后端分离,宁静的风格,我们项目中也在这样用。前几天有人遇到了解析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处理请求的简单时序图如下:
正常情况下,一个请求在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请求数据问题解析