Conventions.getQualifiedAttributeName (HandlerMapping.class, "pathWithinHandlerMapping");
//实际上维护一个HandlerExecutionChain,这是典型的Command的模式的使用, 这个执行链里面维护handler和拦截器
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
他的具体实现只需要实现一个接口方法,而这个接口方法返回的是一个 HandlerExecutionChain,实际上就是一个执行链,就像在Command模式描述的那样,这个 类很简单,就是一个持有一个Interceptor链和一个Controller:
代码
public class HandlerExecutionChain {
private Object handler;
private HandlerInterceptor[] interceptors;
........
}
而这些Handler和Interceptor需要我们定义HandlerMapping的时候配置好,比如对具 体的 SimpleURLHandlerMapping,他要做的就是根据URL映射的方式注册Handler和 Interceptor,自己维护一个放映映射的handlerMap,当需要匹配Http请求的时候需要使 用这个表里的信息来得到执行链。这个注册的过程在IOC容器初始化 SimpleUrlHandlerMapping的时候就被完成了,这样以后的解析才可以用到map里的映射信 息,这里的信息和bean文件的信息是等价的,下面是具体的注册过程:
代码
protected void registerHandlers(Map urlMap) throws BeansException {
if (urlMap.isEmpty()) {
logger.warn("Neither ''urlMap'' nor ''mappings'' set on SimpleUrlHandlerMapping");
}
else {
//这里迭代在SimpleUrlHandlerMapping中定义的所有映射元素
Iterator it = urlMap.keySet().iterator();
while (it.hasNext()) {
//这里取得配置的url
String url = (String) it.next();
//这里根据url在bean定义中取得对应的handler
Object handler = urlMap.get(url);
// Prepend with slash if not already present.
if (!url.startsWith("/")) {
url = "/" + url;
}
//这里调用AbstractHandlerMapping中的注册过程
registerHandler(url, handler);
}
}
}
Spring源代码解析(四):Spring MVC(3)
时间:2011-03-29 javaeye jiwenke
在AbstractMappingHandler中的注册代码:
代码
protected void registerHandler(String urlPath, Object handler) throws BeansException, IllegalStateException {
//试图从handlerMap中取handler,看看是否已经存在同样的Url映射关系
Object mappedHandler = this.handlerMap.get(urlPath);
if (mappedHandler != null) {
........
}
//如果是直接用bean名做映射那就直接从容器中取handler
if (!this.lazyInitHandlers && handler instanceof String) {
String handlerName = (String) handler;
if (getApplicationContext().isSingleton(handlerName)) {
handler = getApplicationContext().getBean(handlerName);
}
}
//或者使用默认的handler.
if (urlPath.equals("/*")) {
setDefaultHandler(handler);
}
else {
//把url和handler的对应关系放到handlerMap中去
this.handlerMap.put(urlPath, handler);
........
}
}
handlerMap是持有的一个HashMap,里面就保存了具体的映射信息:
代码
private final Map handl |