16.参数解析原理

简单的参数解析原理可以参考日记14.请求映射的原理.note
这一节主要探讨复杂参数的解析原理:
  Map,Errors/BindingResult,Model,RedirectAttribute(重定向携带数据),
  ServletResponse(response),SessionStatus,UriCompon恩同事Build而,ServletUriComponentsBuilder
如果在目标方法的请求参数中有map或者Model,例如public String goToPage(Map map){}
    例子:
            //1.第一个控制方法中,在参数map中放入name=吴孟达
            @Controller
            public class RequestController {
                @RequestMapping("/goto")
                public String goToPage(Map map){
                    map.put("name", "吴孟达");
                    //转折点:进行请求转发,转发可以共用请求域中的数据
                    return "forward:/success";
                }
                //2.第二个控制方法中,从请求域中获取name值
                @RequestMapping("/success")
                @ResponseBody
                public void success(HttpServletRequest requestA){
                    System.out.println("name:"+requestA.getAttribute("name"));
                }
            }
            可以正常输出:name:吴孟达
            
结论:如果请求参数中有map或者Model,往里放值,值会被放入到请求域中,相当关于调用了request.setAttribute()
原理:
    目标方法中的Model和Map最终会合并成一个BindAwareModelMap,然后层层封装,最终转换成一个map,这个map中包含了请求参数中的map和model中的所有数据
    最终会调用这个方法将map中的参数全部放入到请求域中!
        protected void exposeModelAsRequestAttributes(Map<String, Object> model,HttpServletRequest request) throws Exception {
               model.forEach((name, value) -> {
                  if (value != null) {
                     request.setAttribute(name, value);
                  }
                  else {
                     request.removeAttribute(name);
                  }
               });
            }

 

posted @ 2022-05-11 21:53  努力的达子  阅读(51)  评论(0编辑  收藏  举报