iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Spring的Model 和 Map的原理源码解析
  • 608
分享到

Spring的Model 和 Map的原理源码解析

2024-04-02 19:04:59 608人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

Model 和 Map 为什么在Model和Map中放值传入后会出现在request的上面。 9.1、源码解析 准备测试代码 @GetMapping("/Goto") public

Model 和 Map

为什么在Model和Map中放值传入后会出现在request的上面。

9.1、源码解析

准备测试代码

@GetMapping("/Goto")
public String go(httpservletRequest request,
                 Map<String,Object> map,
                 Model model){
    request.setAttribute("msg","传过来....");
    map.put("map","map hello Word!!");
    model.addAttribute("model","model hello word!!");
    return "forward:success";
}
@ResponseBody
@GetMapping("/success")
public Map success(@RequestAttribute(value = "msg",required = false) String msg,
                   HttpServletRequest request){
    Map<String,Object> HashMap = new HashMap<>();
    Object msg1 = request.getAttribute("msg");
    Object map = request.getAttribute("map");
    Object model = request.getAttribute("model");
    hashMap.put("map1",map);
    hashMap.put("model",model);
    hashMap.put("msg1",msg1);
    return hashMap;
}

第一步进入DispatchServlet 的 doDispatch中

主要的三步

DispatchServlet类中的 
    doDispatch方法
        // Determine handler for the current request.
        mappedHandler = getHandler(processedRequest);//获取反射的方法处理器
        // Determine handler adapter for the current request.
		//获取参数处理器
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
		// Actually invoke the handler.
		//反射执行方法和解析Model和Map
		mv = ha.handle(processedRequest, response, 	mappedHandler.getHandler());

在获取参数阶段,解Model和Map

  1. 获取Map 的 处理器器 MapMethodProcessor
  2. 处理Map这个参数
MapMethodProcessor类中的
@Override
@Nullable
public Object resolveArgument(MethodParameter parameter, 
                              @Nullable ModelAndViewContainer mavContainer,
                              NativeWEBRequest webRequest, 
                              @Nullable WebDataBinderFactory binderFactory) throws Exception {
    Assert.state(mavContainer != null, "ModelAndViewContainer is required for model exposure");
    
    return mavContainer.getModel();
}
 
然后进入ModelAndViewContainer类中的
    private final ModelMap defaultModel = new BindingAwareModelMap();
    public ModelMap getModel() {
    if (useDefaultModel()) {
        return this.defaultModel;//获取ModelMap
    }
    ......
  • 把这个ModelMap对象返回
  • 获取Model的 处理器器 ModelMethodProcessor
  • 处理Model这个参数
ModelMethodProcessor类中的
@Override
@Nullable
 public Object resolveArgument(MethodParameter parameter,
                               @Nullable ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, 
                               @Nullable WebDataBinderFactory binderFactory) throws Exception {
    Assert.state(mavContainer != null, "ModelAndViewContainer is required for model exposure");
    return mavContainer.getModel();
}
然后进入ModelAndViewContainer类中的
    private final ModelMap defaultModel = new BindingAwareModelMap();
    public ModelMap getModel() {
    if (useDefaultModel()) {
        return this.defaultModel;//获取ModelMap   这个和那个Map获取的是同一个
    }
    ......

把同一个ModelMap对象返回

反射调用方法

由于是同一个对象所有 map 和 model中的值都样,所以往map和Model放值都一样

把model和map的数据放入request

第一步

ServletInvocableHandlerMethod类中
    invokeAndHandle方法
    	//获取返回值的一个处理器
        try {
            this.returnValueHandlers.handleReturnValue(
                returnValue, getReturnValueType(returnValue), 
                mavContainer, webRequest);
        }
HandlerMethodReturnValueHandlerComposite类中的
    HandlerMethodReturnValueHandler方法 进行获取

这里获取的ViewNameMethodReturnValueHandler这个处理器

第二步

把Map和 Model携带的参数和返回值(路径)进行整合为ModelAndView

RequestMappingHandlerAdapter类中 
    handleInternal方法
    		...
    		ModelAndView mav;
			...
			mav = invokeHandlerMethod(request, response, handlerMethod);
			...

第三步

准备派发和放入参数

DispatchServlet类中的 
    doDispatch方法
    	render(mv, request, response);
		view.render(mv.getModelInternal(), request, response);
 
AbstractView类中的
    render方法
    	//把BindingAwareModelMap的参数封装为Map
    	Map<String, Object> mergedModel = createMergedOutputModel(model, 
                                                              request, response);
		prepareResponse(request, response);
		//准备方法和放入参数到reques中
		renderMergedOutputModel(mergedModel, getRequestToExpose(request), 	
                                							response);
InternalResourceView类中的
    renderMergedOutputModel
    	// Expose the model object as request attributes.
		exposeModelAsRequestAttributes(model, request);//把参数放入到request中
AbstractView类中的
    //把参数放入到原生的request域中
    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);
            }
        });
}

到此这篇关于spring的Model 和 Map的原理源码解析的文章就介绍到这了,更多相关Spring Model 和 Map内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring的Model 和 Map的原理源码解析

本文链接: https://www.lsjlt.com/news/151738.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作