實作Controller的三種方式分析
每種實作的方式對應的HanderAdapter都不同,
實作Controller介面
該介面對應的HanderAdapter為SimpleControllerHandlerAdapter,

使用案列:
public class LeController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 創建資料視圖類
ModelAndView mv = new ModelAndView();
// 填充資料
mv.addObject("msg","北方情韻");
// 跳轉的視圖
mv.setViewName("index");
return mv;
}
}
配置對應的bean資訊,這里的name就是訪問該Controller的路徑,
<bean name="/le" />

我們可以通過debug那個執行鏈就可以知道,

實作HttpRequestHandler介面
該介面對應的HanderAdapter為HttpRequestHandlerAdapter,

使用案例:
public class YueController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("msg","實作介面HttpRequestHandler");
request.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(request,response);
}
}
配置對應的bean資訊,這里的name就是訪問該Controller的路徑,
<bean name="/yue" />

繼續查看當前物件的執行鏈:

這兩種方式大體上是類似的,我們可以區別的看一下,他們是怎么處理的,
先看實作HttpRequestHandlerAdapter介面的:

進入1075行代碼:

可以發現,這是把當前Controller強轉為HttpRequestHander,然后再執行HttpRequestHanderAdapter的handleRequest方法,(實際就是去執行我們Controller里面的方法,)

而HttpRequestHandler正是我們Contoller類實作的HttpRequestHandler,

同理,我們去看一下實作Controller介面的類的處理方法,

一樣,都是先強轉為介面類,然后執行對應的方法,也就是我們自己實作的方法:

注意:當前的所處位置:
使用注解的方式
待補充
探究HandlerAdapter的裝配規則
一直都很疑惑:
為什么不裝配全部都能用,只裝配一種,不符合的就不能用了呢?
未配置HandlerAdapter
觀察DispatcherServlet的初始化方法:
可以看到有對HandlerAdapter的初始化,點進去加斷點,

開始Debug:


根據注釋,我們可以知道如果此時HandlerAdapters如果為空的話將加載初始化的HandlerAdapters

可以看到,在664行加載了四個HandlerAdapter

進入此方法繼續debug查看:
注意:
DispatcherServlet的初始化方法只執行一次,后面需要重新啟動tomcat才能繼續進入初始化方法,

重啟后,繼續Debug:

往下走,可以看到這里讀取到了幾個HandlerAdapter

很明顯872行代碼是讀取了什么檔案

重新Debug可以發現這里讀取的是org/springframework/web/servlet/DispatcherServlet.properties檔案,

DispatcherServlet.properties:
......
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
org.springframework.web.servlet.function.support.HandlerFunctionAdapter
......
檔案里內容不少,我這里只留下了HandlerAdapter的資訊了
繼續往下看怎么處理的:
下面我感覺應該是利用泛型和反射得到所有的處理器,

配置了HandlerAdapter
如果我們再容器中裝配了Adapter:

重啟tomcat,繼續Debug

可以看到642行讀取到了我們配置的兩個HandlerAdapter,并且再645行賦值給了DispatcherServlet的handlerAdapters,此時方法就會結束了,因為下面都不符合條件了,

總結:
如果我們在容器里添加了HandlerAdapter,那么就不會通過讀取本地的檔案添加默認的四個HandlerAdapter,
如果沒在容器中添加HandlerAdapter,機會讀取本地的DispatcherServlet.properties里面的四個HandlerAdapter,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/545553.html
標籤:其他
上一篇:pat 乙級1024 科學計數法關于stl中size()的一些思考即測驗點六,無符號整數問題
下一篇:docker實戰


