使用Spring MVC需要在web.xml中配置DispatcherServlet,例如:
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
要了解Spring MVC,主要了解dispatcherServlet做了什么事。
dispatcherServlet 继承了 HttpServlet,在 Servlet 的 init 初始化方法调用了 DispatcherServlet,达到初始化MVC的目的。具体初始化了八个组件,有处理文件上传的,处理国际化的,定义主题的,定义映射关系的,定义处理规则的,处理错误的,指定ViewName前缀后缀的,将View解析成页面的。
上面八个组件,必须实现的是定义映射关系的(HandlerMapping),定义处理规则的(HandlerAdapter),将View解析成页面的(ViewResolver)。
Spring MVC初始化时序图如下:
Spring MVC 的Control
Control主要由 HandlerMapping 和 HandlerAdapter 完成,前者负责管理映射的URL和对应的处理类的关系,会根据URL返回一个HandlerEexcutionChain链,在链中添加任意HandlerAdapter的实例来处理URL请求。
HandlerMapping 初始化时完成的工作是,将URL和Handler的对应关系保存在一个handlerMap集合里 和 将所有interceptors对象保存在adaptedInterceptors数组中。当请求到来时先执行interceptors对象,这些对象必须继HandlerInterceptorAdapter接口。(即拦截器)
Control调用时序图如下:

再往下就是处理类的定义一般为xxxController,返回一般是一个ViewName,结合RequestToViewNameTranslator和
ViewResolver分别处理前缀后缀和页面解析的问题。