深入分析JavaWeb---第14章 SpringMVC的工作机
1.SpringMVC的总体设计
Part1:通过web.xml将SpringMVC集成项目中。
项目要使用SpringMVC,只需要在web.xml中配置一个DispatcherServlet,所有对请求都经过这个servlet处理。
Part2:需使用者扩展三个业务部分:
1.路径映射(即代码层面:定义URL映射规则);
2.业务逻辑处理(实现业务逻辑的Handler实例对象);
3.视图解析器(渲染模板资源)。
Part3:DispatcherServlet执行Servlet的初始化init方法,做了8件事。
DispatcherServlet类继承了HttpServlet,在Servlet的init方法调用时DispatcherServlet执行SpringMVC的初始化工作包括8个细节,同时这8个细节分别对应SpringMVC的8个组件:
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context); //核心组件
initHandlerAdapters(context); //核心组件
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context); //核心组件
}
1.核心组件---HandlerMapping
答: 用于将用户请求的URL映射到一个个的Handler实例上。
2.核心组件---HandlerAdapter
答:用于根据Handler的不同类型定义不同处理规则。例如:我们最最常见的将URL映射到一个Controller实例。 或者 太易保项目中的各种拦截器interceptors:报文保存拦截器;加解密拦截器;登录token验证拦截器。这些拦截器都统一实现HandlerInterceptorAdapter接口,在Controller处理用户请求之前,执行一些请求预操作。
3.核心组件---ViewResolver
答:用于将View解析成页面。策略模式---在ViewReslover中可以设置多个解析页面策略。例如:常见的根据JSP 解析 或者 按照Velocity模板解析。
4.MultipartResolver
答:用于处理文件上传服务。
5.ThemeResolver
答:用于定义页面的主题。
6.HandlerExceptionResolver
答:当Handler处理出现异常时,会通过这个resolver来统一处理。
太易保项目定义的AppExceptionHandler,通过实现HandlerExceptionReslover接口统一处理后端项目的异常。
7.LocaleResolver
答:用于处理应用的国际化问题,通过解析请求的Locale和设置响应的Locale控制应用中的字符编码问题。
8.RequestToViewNameTranslator
答:将指定的ViewName按照定义的RequestToViewNameTranslator替换为想要的格式。
思考领悟:从上面的初始化策略看出,在一个请求过程中可能需要用户来扩展的地方都定义了扩展点:只要实现相应的接口类,并创建一个Spring Bean就能扩展SpringMVC框架。自然具有非常好的可扩展性和灵活性。
2.1 Control控制器设计
SpringMVC的Control主要由上述的HandlerMapping和HanderAdapters两个组件提供。
Part1:HandlerMapping初始化
HandlerMapping初始化,完成的两个最重要的工作就是:
1>将URL与Handler的对应关系保存在handlerMap集合中。
2>将所有的interceptors对象保存在adaptedInterceptors数组中,等到请求到来时执行数组中对应的interceptor对象。
所有的interceptor对象必须实现HandlerInterceptor接口。
Part2:HandlerAdapter初始化
HandlerAdapter初始化没有什么特别之处:只是简单地创建一个HandlerAdapter对象,同时将这个对象保存在DispatcherServlet的handlerAdapters集合中。**当URL对应到某个Handler时,会在这个handlerAdapters集合中机型查询。
Part3:Controller的调用逻辑(职责连设计模式)