HandlerMapping的主要作用就是通过用户的请求找到对该请求相应的处理器。打开HandlerMapping的源代码我们可以看见,HandlerMapping只有一个方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception。HandlerExecutionChain 中封装了Handler和interceptors。通常springmvc会维护一个Map,key值就是对应的请求,而value就是HandlerExecutionChain。springMVC内部的SimpleUrlHandlerMapping也确实是这样来实现的。在内部维护了一个Map。private final Map<String, Object> urlMap = new LinkedHashMap<String, Object>(),由于Handler可以是任意类型或者方法,因此value使用了Object。
SimpleUrlHandlerMapping的主要方法有以下几个:
public void setMappings(Properties
mappings);将mappings加入urlMap。
public void setUrlMap(Map<String,
?> urlMap);设置UrlMap。
public Map<String,
?> getUrlMap();获取urlMap
public void initApplicationContext();用来初始化工作,在初始化时调用了registerHandlers方法。
protected void registerHandlers(Map<String, Object> urlMap);被initApplicationContext调用,在方法中主要对urlMap进行了一个循环遍历。代码如下:
for
(Map.Entry<String, Object> entry : urlMap.entrySet()) {
String url = entry.getKey();
Object handler = entry.getValue();
// Prepend with slash if not already present.
if (!url.startsWith("/")) {
url = "/" + url;
}
// Remove whitespace from handler bean name.
if (handler instanceof String) {
handler = ((String) handler).trim();
}
registerHandler(url, handler);
}
首先取出每一个url和对应的handler,然后调用了registerHandler方法。在registerHandler方法中,对url和handler进行了注册。