SpringMVC的总体设计。

要使用SpringMVC,只需在web.xml中配置一个DispatcherServlet,再定义一个dipatcherServlet-servlet.xml配置文件,这样一个简单的基于SpringMVC的应用就创建完成了。

实际上SpringMVC的使用非常简单,我们只要扩展一个路径映射关系;定义一个试图解析器;再定义一个业务逻辑的处理流程规则,SpringMVC就能够帮你完成所有的MVC功能了。要搞清楚SpringMVC如何工作,主要看DispatcherServlet的代码。

DispatcherServlet类继承了HttpServlet,在Servlet的init方法调用时DispatcherServlet执行SpringMVC的初始化工作。DispatcherServlet初始化什么,可以在其initStrategies方法中知道,这个方法如下:

protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
}

其要做的8件事如下所述。

  •   initMultipartResolver:初始化MultipartResolver,用于处理文件上传服务,如果有文件上传,那么会将当前的HttpServletRequest包装成DefaultMultipartHttpServletRequest,并且将每个上传的内容封装成CommonsMultipartFile对象。
  •     initLocaleResolver:用于处理应用的国际化问题,通过解析请求的Locale和设置响应的Locale来控制应用中的字符编码问题。
  •     initThemeResolver:用于定义一个主题,例如,可以根据用户的喜好来设置用户访问的页面的样式,可以将这个样式作为一个Theme Name保存,保存在用于请求的Cookie中或者保存在服务端的Session中,以后每次请求根据这个Theme Name返回特定的内容。
  •    initHandlerMappings:用于定义用户设置的请求映射关系。对HandlerMapping必须定义,如果没有定义,将获取DispatcherServlet.properties文件中默认的两个HandlerMapping,分别实BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping。
  •     initHandlerAdapters:用于根据Handler的类型定义不同的处理规则,例如,定义SimpleControllerHandlerAdapter处理所有Controller的实例对象,在HandlerMapping中将URL映射成一个Controller实例,那么SpringMVC在解析时SimpleControllerHandlerAdapter就会调用这个Controller实例。同样对HandlerAdapters也必须定义,如果没有定义,将获取DispatcherServlet.properties文件中默认的4个HandlerAdapters,分别实HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter、ThrowawayControllerHandlerAdapter和AnnotationMethodHandlerAdapter。
  •   initHandlerExceptionResolvers:当Handler处理出错时,会通过这个Handler来统一处理,默认的实现类是SimpleMappingExceptionResolver,将错误日志记录在log文件中,并且转到默认的错误页面。
  •     initRequestToViewNameTranslator:将指定的ViewName按照定义的RequestToViewNameTranslator替换成想要的格式,如加上前缀或者后缀等。
  •     initViewResolvers:用于将View解析成页面,在ViewResolvers中可以设置多个解析策略,如可以根据JSP来解析,或者按照Velocity模板解析。默认的解析策略是InternalResourceViewResolver,按照JSP页面来解析。

从上面的初始化策略可以看出,在一个请求中可能需要我们来扩展的地方都定义了扩展点,只要实现相应的接口类,并创建一个SpringBean就能扩展SpringMVC框架。

下图所示是SpringMVC的组件图。

在SpringMVC框架中,有3个组件是用户必须要定义和扩展的:定义URL映射规则、实现业务逻辑的Handler实例对象、渲染模板资源。而连接Handler实例对象和模板渲染的纽带就是Model模型了。

下面再看看DispatherServlet启动时都做了哪些事情?

HttpServlet初始化调用了HttpServletBean的init方法,该方法的作用是获取Servlet中的init参数,并创建一个BeanWrapper对象,然后由子类处真正执行BeanWrapper的初始化工作。但是HttpServletBean的子类FrameworkServlet和DispatcherServlet都没有覆盖其initBeanWrapper(bw)方法,所以创建的BeanWrapper对象没有任何作用,Spring容器也不是通过BeanWrapper来创建的。

Spring容器的而创建是在FrameworkServlet的initServletBean()方法中完成的,这个方法会创建WebApplicationContext对象,并调用其refresh()方法来完成配置文件的加载,配置文件的加载同样是先查找Servlet的init-param参数中设置的路径,如果没有,会根据namespace+Servlet的名称来查找XML文件。Spring容器在加载时会调用DispatcherServlet的initStrategies方法来完成在DispatcherServlet中定义的初始化工作。在initStrategies方法中会初始化SpringMVC框架需要的8个组件,这8个组件对应的8个Bean对象都保存在DispatcherServlet类中。

SpringMVC初始化的时序图如下图所示。

这时DispatcherServlet已经初始化完成,SpringMVC也已经初始化完成,可以接受你的HTTP请求了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值