欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring的Model?和?Map的原理源碼解析

 更新時間:2022年06月16日 15:20:01   作者:水三丫  
這篇文章主要介紹了Spring的Model?和?Map的原理解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Model 和 Map

為什么在Model和Map中放值傳入后會出現(xiàn)在request的上面。

9.1、源碼解析

準(zhǔn)備測試代碼

@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;
}

第一步進(jìn)入DispatchServlet 的 doDispatch中

主要的三步

DispatchServlet類中的 
    doDispatch方法
        // Determine handler for the current request.
        mappedHandler = getHandler(processedRequest);//獲取反射的方法處理器
        // Determine handler adapter for the current request.
		//獲取參數(shù)處理器
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
		// Actually invoke the handler.
		//反射執(zhí)行方法和解析Model和Map
		mv = ha.handle(processedRequest, response, 	mappedHandler.getHandler());

在獲取參數(shù)階段,解Model和Map

  1. 獲取Map 的 處理器器 MapMethodProcessor
  2. 處理Map這個參數(shù)
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();
}
 
然后進(jìn)入ModelAndViewContainer類中的
    private final ModelMap defaultModel = new BindingAwareModelMap();
    public ModelMap getModel() {
    if (useDefaultModel()) {
        return this.defaultModel;//獲取ModelMap
    }
    ......
  • 把這個ModelMap對象返回
  • 獲取Model的 處理器器 ModelMethodProcessor
  • 處理Model這個參數(shù)
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();
}
然后進(jìn)入ModelAndViewContainer類中的
    private final ModelMap defaultModel = new BindingAwareModelMap();
    public ModelMap getModel() {
    if (useDefaultModel()) {
        return this.defaultModel;//獲取ModelMap   這個和那個Map獲取的是同一個
    }
    ......

把同一個ModelMap對象返回

反射調(diào)用方法

由于是同一個對象所有 map 和 model中的值都樣,所以往map和Model放值都一樣

把model和map的數(shù)據(jù)放入request

第一步

ServletInvocableHandlerMethod類中
    invokeAndHandle方法
    	//獲取返回值的一個處理器
        try {
            this.returnValueHandlers.handleReturnValue(
                returnValue, getReturnValueType(returnValue), 
                mavContainer, webRequest);
        }
HandlerMethodReturnValueHandlerComposite類中的
    HandlerMethodReturnValueHandler方法 進(jìn)行獲取

這里獲取的ViewNameMethodReturnValueHandler這個處理器

第二步

把Map和 Model攜帶的參數(shù)和返回值(路徑)進(jìn)行整合為ModelAndView

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

第三步

準(zhǔn)備派發(fā)和放入?yún)?shù)

DispatchServlet類中的 
    doDispatch方法
    	render(mv, request, response);
		view.render(mv.getModelInternal(), request, response);
 
AbstractView類中的
    render方法
    	//把BindingAwareModelMap的參數(shù)封裝為Map
    	Map<String, Object> mergedModel = createMergedOutputModel(model, 
                                                              request, response);
		prepareResponse(request, response);
		//準(zhǔn)備方法和放入?yún)?shù)到reques中
		renderMergedOutputModel(mergedModel, getRequestToExpose(request), 	
                                							response);
InternalResourceView類中的
    renderMergedOutputModel
    	// Expose the model object as request attributes.
		exposeModelAsRequestAttributes(model, request);//把參數(shù)放入到request中
AbstractView類中的
    //把參數(shù)放入到原生的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);
            }
        });
}

到此這篇關(guān)于Spring的Model 和 Map的原理源碼解析的文章就介紹到這了,更多相關(guān)Spring Model 和 Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 復(fù)選框和Struts2后臺交互代碼詳解

    復(fù)選框和Struts2后臺交互代碼詳解

    這篇文章主要介紹了復(fù)選框和Struts2后臺交互代碼詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • SpringBoot常見問題小結(jié)

    SpringBoot常見問題小結(jié)

    這篇文章主要介紹了SpringBoot常見問題小結(jié),需要的朋友可以參考下
    2017-07-07
  • Java中Servlet的生命周期

    Java中Servlet的生命周期

    這篇文章主要介紹了Java中Servlet的生命周期,Servlet?初始化后調(diào)用?init?()?方法、Servlet?調(diào)用?service()?方法來處理客戶端的請求、Servlet?銷毀前調(diào)用?destroy()?方法,下面來看看具體的解析吧,需要的小伙伴可以參考一下
    2022-01-01
  • Java實現(xiàn)五子棋游戲

    Java實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例

    spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例

    這篇文章主要介紹了spring boot使用WebClient調(diào)用HTTP服務(wù)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • kotlin和Java的相互調(diào)用示例詳解

    kotlin和Java的相互調(diào)用示例詳解

    Kotlin 的設(shè)計過程中就考慮到了與 Java 的互操作性。在 Kotlin 中可以直接調(diào)用既有的 Java 代碼, 反過來在 Java 中也可以很流暢地使用 Kotlin 代碼,下面這篇文章主要給大家介紹了關(guān)于kotlin和Java的相互調(diào)用的相關(guān)資料,需要的朋友可以參考下。
    2018-02-02
  • 理解Spring中的依賴注入和控制反轉(zhuǎn)

    理解Spring中的依賴注入和控制反轉(zhuǎn)

    這篇文章主要介紹了理解Spring中的依賴注入和控制反轉(zhuǎn),具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存)

    MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存)

    這篇文章主要介紹了MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 快速排序算法在Java中的實現(xiàn)

    快速排序算法在Java中的實現(xiàn)

    這篇文章主要介紹了快速排序算法在Java中的實現(xiàn),簡單介紹了快速排序的實現(xiàn)原理,分享了兩種實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java中反射機(jī)制的使用詳解

    Java中反射機(jī)制的使用詳解

    這篇文章主要介紹了Java中反射機(jī)制的使用詳解,Java的發(fā)射機(jī)制允許程序在運行時檢查和操作任意一個類、方法、屬性等的信息,包括了類名、方法名、屬性名、參數(shù)列表以及訪問修飾符等,需要的朋友可以參考下
    2023-09-09

最新評論