中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

當(dāng)前位置: 首頁(yè) / 技術(shù)干貨 / 正文
SpringMVC源碼解析(四)

2023-03-09

視圖 handleradapter 處理器 對(duì)象 返回

  4 處理器適配器HandlerAdapter

  4.1 HandlerAdapter源碼分析

  1.在DispatcherServlet類中的doDispatch(request, response)方法中調(diào)用getHandlerAdapter(mappedHandler.getHandler())獲取處理器適配器。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
try {
// ...
try {
// ...

// 確定當(dāng)前請(qǐng)求的處理程序適配器。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
}
// ...
}
// ...
}

  2.getHandlerAdapter(Object handler)方法的具體實(shí)現(xiàn)見下源代碼。根據(jù)Handler找到支持它的HandlerAdapter對(duì)象。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}

  3.在SimpleControllerHandlerAdapter類中實(shí)現(xiàn)了HandlerAdapter接口中的三個(gè)抽象方法。

public class SimpleControllerHandlerAdapter implements HandlerAdapter {

@Override
public boolean supports(Object handler) {
// 判斷找到的handler是否為Controller類型。HelloController類實(shí)現(xiàn)了Controller接口,所以處理器能夠找到該類
return (handler instanceof Controller);
}

@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 通過(guò)handler處理器,調(diào)用控制器的handlerRequest方法,來(lái)處理相應(yīng)的請(qǐng)求
return ((Controller) handler).handleRequest(request, response);
}

/**
* 與HttpServlet的getLastModified方法的約定相同。在請(qǐng)求處理之前調(diào)用。

* 返回值將作為L(zhǎng)ast-Modified報(bào)頭發(fā)送給HTTP客戶端,并與客戶端返回的If-Modified-Since報(bào)頭進(jìn)行比較。只有在進(jìn)行了修改后,內(nèi)容才會(huì)重新生成。

* 參數(shù):request - 當(dāng)前HTTP請(qǐng)求

* 返回:上次修改基礎(chǔ)資源的時(shí)間,或-1表示必須始終重新生成內(nèi)容
*/
@Override
@SuppressWarnings("deprecation")
public long getLastModified(HttpServletRequest request, Object handler) {
if (handler instanceof LastModified) {
return ((LastModified) handler).getLastModified(request);
}
return -1L;
}

}

  4.從SimpleControllerHandlerAdapter類中handle方法可以看出,通過(guò)HandlerAdapter執(zhí)行Handler對(duì)象,最終得到ModelAndView對(duì)象。

@Override
@Nullable
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// handler處理器執(zhí)行handleRequest方法,主要作用是找到HelloController類中重寫的handleRequest重寫的業(yè)務(wù)邏輯方法
return ((Controller) handler).handleRequest(request, response);
}

  4.2 HandlerAdapter的執(zhí)行

  DispatcherServlet會(huì)根據(jù)handlerMapping傳過(guò)來(lái)的controller與已經(jīng)注冊(cè)好了的HandlerAdapter相匹配,看哪一種HandlerAdapter是支持該controller類型的,如果找到了其中一種HandlerAdapter是支持傳過(guò)來(lái)的controller類型,那么該HandlerAdapter會(huì)調(diào)用自己的handle方法,handle方法運(yùn)用Java反射機(jī)制執(zhí)行controller的具體方法來(lái)獲得ModelAndView。

  5 視圖解析器ViewResolver

  SpringMVC用于處理視圖最重要的兩個(gè)接口是ViewResolver和View。ViewResolver的主要作用是把一個(gè)邏輯上的視圖名稱解析為一個(gè)真正的視圖,SpringMVC中用于把View對(duì)象呈現(xiàn)給客戶端的是View對(duì)象本身,而ViewResolver只是把邏輯視圖名稱解析為對(duì)象的View對(duì)象。View接口的主要作用是用于處理視圖,然后返回給客戶端。

  5.1 ViewResolver源碼分析

  1.內(nèi)部資源視圖解析器InternalResourceViewResolver類,進(jìn)行頁(yè)面渲染時(shí),需要使用jstl標(biāo)準(zhǔn)標(biāo)簽庫(kù)。

public class InternalResourceViewResolver extends UrlBasedViewResolver {
// 在進(jìn)行頁(yè)面渲染時(shí),需要使用jstl的標(biāo)準(zhǔn)標(biāo)簽庫(kù)
private static final boolean jstlPresent = ClassUtils.isPresent(
"javax.servlet.jsp.jstl.core.Config", InternalResourceViewResolver.class.getClassLoader());

// ...
}

  2.InternalResourceViewResolver類的父類UrlBasedViewResolver類,根據(jù)返回頁(yè)面的名稱拼接前綴和后綴,最終形成一個(gè)完整頁(yè)面的路徑。例如:/WEB-INF/hello.jsp。

public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered {

public static final String REDIRECT_URL_PREFIX = "redirect:"; // 重定向

public static final String FORWARD_URL_PREFIX = "forward:"; // 轉(zhuǎn)發(fā)

@Nullable
private Class<?> viewClass;

private String prefix = ""; // 前綴

private String suffix = ""; // 后綴

// ...

protected AbstractUrlBasedView buildView(String viewName) throws Exception {
AbstractUrlBasedView view = instantiateView();
view.setUrl(getPrefix() + viewName + getSuffix());
view.setAttributesMap(getAttributesMap());

String contentType = getContentType();
if (contentType != null) {
view.setContentType(contentType);
}

String requestContextAttribute = getRequestContextAttribute();
if (requestContextAttribute != null) {
view.setRequestContextAttribute(requestContextAttribute);
}

Boolean exposePathVariables = getExposePathVariables();
if (exposePathVariables != null) {
view.setExposePathVariables(exposePathVariables);
}
Boolean exposeContextBeansAsAttributes = getExposeContextBeansAsAttributes();
if (exposeContextBeansAsAttributes != null) {
view.setExposeContextBeansAsAttributes(exposeContextBeansAsAttributes);
}
String[] exposedContextBeanNames = getExposedContextBeanNames();
if (exposedContextBeanNames != null) {
view.setExposedContextBeanNames(exposedContextBeanNames);
}

return view;
}

protected View applyLifecycleMethods(String viewName, AbstractUrlBasedView view) {
ApplicationContext context = getApplicationContext();
if (context != null) {
Object initialized = context.getAutowireCapableBeanFactory().initializeBean(view, viewName);
if (initialized instanceof View) {
return (View) initialized;
}
}
return view;
}
}

  5.2 ViewResolver解析流程

  1.將SpringMVC控制器中的返回結(jié)果封裝成一個(gè)ModelAndView對(duì)象。

  2.通過(guò)SpringMVC中的視圖解析器,使用ViewResolver對(duì)控制器返回的ModelAndView對(duì)象進(jìn)行解析,將邏輯視圖轉(zhuǎn)換成物理視圖。

  3.調(diào)用View接口中的render()方法對(duì)物理視圖進(jìn)行渲染。

  6 SpringMVC執(zhí)行流程分析

  1.SpringMVC執(zhí)行流程圖

  2.SpringMVC執(zhí)行步驟

  1.客戶端瀏覽器發(fā)送請(qǐng)求給服務(wù)器中的前端控制器DispatcherServlet;

  2.用戶根據(jù)請(qǐng)求中的url路徑,通過(guò)HandlerMapping處理器映射器,找到匹配的Controller;

  3.HandlerMapping返回一個(gè)處理器執(zhí)行鏈,包括N個(gè)攔截器與1個(gè)Controller的處理器。并把處理器執(zhí)行鏈,返回給前端控制器DispatcherServlet;

  4.前端控制器DispatcherServlet得到處理器執(zhí)行鏈之后,把Controller的Handler發(fā)送給HandlerAdapter處理器適配器;

  5.HandlerAdapter根據(jù)supports(Object handler)方法,也就是內(nèi)部的匹配規(guī)則,判斷該處理器Handler是否實(shí)現(xiàn)了Controller接口;

  6.Handler處理器找到具體的方法handler.handleRequest(request, response),根據(jù)請(qǐng)求執(zhí)行Controller類中的方法;

  7.Controller類執(zhí)行完畢,然后返回一個(gè)ModelAndView對(duì)象給Handler處理器;

  8.Handler處理器把ModelAndView對(duì)象返回給HandlerAdapter;

  9.HandlerAdapter把ModelAndView對(duì)象返回給前端控制器DispathcerServlet;

  10.DispathcerServlet把ModelAndView對(duì)象傳遞給ViewResolver視圖解析器,根據(jù)jsp頁(yè)面的名稱拼接路;

  11.ViewResolver視圖解析器返回給DispathcerServlet前端控制器;

  12.DispathcerServlet拿到j(luò)sp路徑,由web容器對(duì)jsp頁(yè)面進(jìn)行視圖渲染;

  13.Web容器把響應(yīng)結(jié)果返回給瀏覽器。

  3.SpringMVC核心組件

QQ截圖20230309160031

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢(shì)
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開班動(dòng)態(tài)

More+
  • HTML5大前端 <高端班>

    開班時(shí)間:2021-04-12(深圳)

    開班盛況

    開班時(shí)間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時(shí)間:2021-03-22(杭州)

    開班盛況

    開班時(shí)間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時(shí)間:2021-05-10(北京)

    開班盛況

    開班時(shí)間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2020-09-21(上海)

    開班盛況
  • 云計(jì)算開發(fā) <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2019-07-22(北京)

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)

中文在线免费看视频_国产成人精品亚洲日本在线观看_亚洲精品第一综合99久久_国产亚洲精品日韩综合网

            成人免费视频视频在线观看免费 | 亚洲国产高清不卡| 成人av小说网| 亚洲成a天堂v人片| 久久久噜噜噜久久中文字幕色伊伊| 国产1区2区3区精品美女| 亚洲黄色免费网站| 精品不卡在线视频| 色激情天天射综合网| 极品少妇xxxx偷拍精品少妇| 亚洲人午夜精品天堂一二香蕉| 91精品国产入口在线| 成人白浆超碰人人人人| 青青青伊人色综合久久| 亚洲婷婷在线视频| 久久综合久久鬼色| 欧美日韩美少妇| jizzjizzjizz欧美| 激情综合色综合久久综合| 亚洲综合色丁香婷婷六月图片| 久久久久久夜精品精品免费| 色www精品视频在线观看| 国产成人在线观看| 蜜桃精品在线观看| 亚洲一区二区三区国产| 国产精品国产三级国产aⅴ原创| 欧美成人伊人久久综合网| 欧洲一区二区三区在线| 成人午夜av影视| 国产美女在线观看一区| 日韩不卡一区二区| 亚洲午夜久久久久久久久久久 | 久久久久一区二区三区四区| 在线观看日韩国产| 成人av影视在线观看| 国产乱码精品一区二区三区五月婷 | 中文久久乱码一区二区| 日韩精品最新网址| 在线不卡中文字幕| 欧美日韩色一区| 欧美视频在线播放| 色噜噜狠狠色综合欧洲selulu| 成人精品gif动图一区| 国产成人一区在线| 国产精品自在在线| 国产资源在线一区| 国内精品伊人久久久久av影院| 男女男精品网站| 日本不卡123| 免费在线看一区| 老司机精品视频导航| 日本一不卡视频| 美国精品在线观看| 免费精品视频最新在线| 欧美96一区二区免费视频| 午夜伦理一区二区| 日韩成人一级片| 奇米色一区二区三区四区| 美女脱光内衣内裤视频久久网站 | 视频一区在线播放| 亚洲大片一区二区三区| 视频一区二区中文字幕| 日韩影院免费视频| 奇米色一区二区| 久久 天天综合| 成人性生交大片免费看中文| 99久久精品国产网站| 91国偷自产一区二区三区观看 | 精品亚洲porn| 国产精品123区| av不卡免费在线观看| 99精品在线观看视频| 欧美三级在线播放| 日韩欧美成人一区| 中文子幕无线码一区tr| 一区二区三区四区中文字幕| 丝袜诱惑亚洲看片| 日韩国产一区二| 麻豆精品一区二区综合av| 麻豆国产精品777777在线| 美女网站一区二区| 精品亚洲国内自在自线福利| 精品亚洲国产成人av制服丝袜| 韩国欧美国产一区| 成人午夜大片免费观看| 99久久99久久免费精品蜜臀| 99re热视频这里只精品| 欧美系列一区二区| 欧美不卡一区二区三区四区| 国产精品成人网| 亚洲国产成人tv| 中文字幕日韩一区| 一区二区三区在线视频观看| 久久精品国产久精国产| 岛国一区二区三区| 欧美色图天堂网| 精品久久久久久无| 亚洲欧美一区二区久久| 免费观看在线综合色| 成人动漫一区二区| 日韩欧美一级二级三级| 亚洲天堂2014| 精品一区二区三区久久久| 一本大道久久a久久精品综合| 欧美老人xxxx18| 国产精品色噜噜| 麻豆精品一二三| 欧洲另类一二三四区| 久久精品在这里| 午夜视频在线观看一区二区三区 | 另类小说色综合网站| 一本色道a无线码一区v| 久久午夜电影网| 日韩制服丝袜先锋影音| 色婷婷av久久久久久久| 国产三级精品在线| 美美哒免费高清在线观看视频一区二区| 99精品在线免费| 久久久天堂av| 精品制服美女久久| 69堂国产成人免费视频| 亚洲精品成人在线| 成人avav影音| 国产亚洲成年网址在线观看| 看片网站欧美日韩| 欧美久久久久久久久| 亚洲另类一区二区| 97se亚洲国产综合自在线不卡| 久久久综合精品| 韩国欧美一区二区| 精品国产麻豆免费人成网站| 亚洲成a人v欧美综合天堂| 91免费视频网址| 亚洲色欲色欲www| 99精品桃花视频在线观看| 欧美—级在线免费片| 国产一区二区三区美女| 精品国产乱码久久久久久久| 视频一区二区三区在线| 欧美夫妻性生活| 奇米777欧美一区二区| 制服丝袜av成人在线看| 日韩成人av影视| 91麻豆精品国产91久久久久久久久| 亚洲图片欧美综合| 欧美丝袜自拍制服另类| 亚洲国产美女搞黄色| 欧美伦理电影网| 天天色图综合网| 日韩一区二区三区四区| 日韩高清不卡一区二区三区| 6080日韩午夜伦伦午夜伦| 亚洲国产综合人成综合网站| 欧美艳星brazzers| 午夜精品在线视频一区| 91精品国产麻豆国产自产在线 | 美女视频黄免费的久久| 337p日本欧洲亚洲大胆精品 | 国产在线看一区| 久久久青草青青国产亚洲免观| 国产福利一区二区三区视频| 国产精品白丝在线| 在线观看91视频| 日本一道高清亚洲日美韩| 久久综合色综合88| 成年人网站91| 五月开心婷婷久久| 精品对白一区国产伦| 成人精品国产免费网站| 亚洲综合一区二区三区| 日韩欧美中文字幕精品| 国产成人精品在线看| 夜夜嗨av一区二区三区网页| 日韩一二三四区| 国产成人av福利| 一区二区三区在线看| 日韩丝袜美女视频| 成人国产亚洲欧美成人综合网 | 国产精品婷婷午夜在线观看| 在线观看日韩国产| 国产真实精品久久二三区| 日韩一区中文字幕| 欧美一区二区在线免费播放| 国产福利91精品一区| 亚洲成人tv网| 国产日韩亚洲欧美综合| 欧美吻胸吃奶大尺度电影| 国内外精品视频| 亚洲综合色区另类av| 久久夜色精品一区| 色婷婷激情一区二区三区| 蜜臀久久99精品久久久久久9| 国产精品超碰97尤物18| 91精品久久久久久蜜臀| 99精品欧美一区| 狠狠色丁香婷婷综合| 亚洲福利视频三区| 国产精品久久久爽爽爽麻豆色哟哟| 678五月天丁香亚洲综合网| 99精品久久只有精品|