SpringMVC 之处理器映射:先大致了解 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 认为拦截器本身将处理请求,而不继续执行处理器
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: