介绍
先大致了解SpringMVC的核心开发步骤:
① 在web.xml中部署DispaterServlet,并配置springmvc.xml等文件;
② 将映射文件请求到处理器HandlerMapping;
③ HandlerMapping会把请求映射为HandlerExecutionChain类型的handler对象;
④ 将handler对象作为参数传递给HandlerAdapter的实例化对象,调用其handler方法会生成一个ModelAndView对象;
⑤ 通过ViewResolver视图解析器,将上一步骤中生成的ModelAndView解析为View;
⑥ DispatcherServlet根据获取到View,将视图返回给用户。
Spring的分发器(DispatcherServlet)使用定义什么样的请求被接收到控制器(Controller)处理,在具体的某个请求被某个具体的控制器处理,这需要通过处理器映射来进行
映射原理
首先可以明确HandlerExecutionChain与HanderMapping关系非常紧密,HandlerExecutionChain只能通过HanderMapping接口中的唯一方法来获得
HandlerMapping接口的代码示例
public interface HandlerMapping {
////该方法是HandlerMapping接口中的唯一方法,此方法可以利用用户请求request中的信息来生成HandlerExecutionChain对象
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
实现把对*.do的请求转换给配置文件中设定的相应处理器,则依赖DispatcherServlet的getHandler()方法,代码如下
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//根据给定的request查找handler
for (HandlerMapping hm : this.handlerMappings) {
//调试时使用的日志信息
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
//获取handler
HandlerExecutionChain handler = hm.getHandler(request);
//如果获取的handler不是null就返回handler
if (handler != null) {
return handler;
}
}
return null;
}
添加拦截器
有了处理器映射,就可以在映射请求时添加一个拦截器,以做某种动作或检查。要在映射请求时添加一个拦截器,自定义的拦截器就必须实现HandlerInterceptor接口
public interface HandlerInterceptor {
//在处理器执行前被调用
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
//在处理器执行后被调用
default void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
}
//在整个请求处理完后调用
default void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
代码说明: 当preHandle()方法返回true时,处理器将继续执行,当返回false时,DispatcherServlet认为拦截器本身将处理请求,而不继续执行处理器