SpringMVC实战教程 | 第三篇: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认为拦截器本身将处理请求,而不继续执行处理器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值