SpringMVC.JPG
1、功能
handlerMapping是一個(gè)接口,也就是可擴(kuò)展。
handlerMapping的作用就是根據(jù)不同的請(qǐng)求去匹配對(duì)應(yīng)的Handler,也就是根據(jù)請(qǐng)求匹配一個(gè)請(qǐng)求處理器。
這個(gè)過程需要兩個(gè)步驟:
- 第一步,需要將Handler注冊(cè)到HandlerMapping中;
- 分析請(qǐng)求根據(jù)規(guī)則從已注冊(cè)的Handler中匹配到對(duì)應(yīng)的Handler,即Controller。默認(rèn)情況下,SpringMvc為我們提供了幾個(gè)默認(rèn)的HandlerMapping的實(shí)現(xiàn),通過優(yōu)先級(jí)的次序決定執(zhí)行的順序。
2、運(yùn)行流程
?在基于Spring MVC的Web應(yīng)用程序中,我們可以為DispatcherServlet提供多個(gè)HandlerMapping供其使用。
- DispatcherServlet在選用HandlerMapping的過程中,將根據(jù)我們所指定的一系列HandlerMapping的優(yōu)先級(jí)進(jìn)行排序,然后優(yōu)先使用優(yōu)先級(jí)在前的HandlerMapping。
- 如果當(dāng)前的HandlerMapping能夠返回可用的Handler,DispatcherServlet則使用當(dāng)前返回的Handler進(jìn)行Web請(qǐng)求的處理,而不再繼續(xù)詢問其他的HandlerMapping。
- 否則,DispatcherServlet將繼續(xù)按照各個(gè)HandlerMapping的優(yōu)先級(jí)進(jìn)行詢問,直到獲取一個(gè)可用的Handler為止。
3、源碼
public interface HandlerMapping {
String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
public abstract HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}