前言
在DispatcherServlet初始化过程中,我们知道Spring MVC会初始化九大组件,下面我们就来看下这九个组件分别起什么作用,这里我们并不会分析它们内部具体的实现,只是做宏观的介绍。
HandlerMapping
我们可以看到HandlerMapping接口中只定义了一个方法,就是通过request找到HandlerExecutionChain,而HandlerExecutionChain包装了一个Handler和一组Interceptors。
public interface HandlerMapping {
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
HandlerAdapter
之所以需要HandlerAdapter是因为Spring MVC没有对Handler做任何规定,它可以是类,可以是方法,也可以是任何其他东西,我们可以看到Handler的类型是Object,这样会非常灵活。但是怎么让任意类型的Handler处理固定格式的请求呢?没错,就是使用适配器,每种Handler都要有对应的HandlerAdapter才能处理请求。我们来看下HandlerAdapter接口的定义
public interface HandlerAdapter {
/**
* 判断是否支持传入的handler
*/
boolean supports(Object handler);
/**
* 使用给定的handler处理请求
*/
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
/**
* 返回上次修改时间,可以返回-1表示不支持
*/
long getLastModified(HttpServletRequest request, Object handler);
}
HandlerExceptionResolver
在处理请求的过程中,难免会出现异常,HandlerExceptionResolver就是专门来处理异常的组件,它能根据异常设置ModelAndView,然后交给render进行渲染。我们来看下HandlerExceptionResolver的接口定义
public interface HandlerExceptionResolver {
ModelAndView resolveException(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
从上面的分析中我们可以知道HandlerExceptionResolver只能处理页面渲染之前的异常,页面渲染过程中的异常,它是不能处理的,这时可以让容器跳转到指定的错误页面来处理异常。
ViewResolver
ViewResolver用来将String类型的视图名和本地化信息Local解析成View类型的视图,其接口定义如下
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
RequestToViewNameTranslator
ViewResolver是根据viewName查找View,但有的Handler处理完后并没有设置View也没有设置viewName,这时就需要RequestToViewNameTranslator从request中找到默认的View了。我们来看下RequestToViewNameTranslator的接口定义
public interface RequestToViewNameTranslator {
String getViewName(HttpServletRequest request) throws Exception;
}
网友评论