您的位置:首页 > 编程语言 > Java开发

SpringMVC之处理器映射

2017-02-12 11:18 183 查看

介绍

先大致了解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 han
4000
dler;
}
}
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认为拦截器本身将处理请求,而不继续执行处理器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: