SpringMVC中Dispatcher的工作流程及各角色之间的交互

Web开发框架的类型

首先先了解下Web开发框架的类型,主要有两种:

  1. 请求驱动的Web开发框架;又称为request/response框架(request/response framework)。这种框架是基于Servlet的请求/响应(request/response)处理模型构成的。这种类型的Web框架大都以Web MVC模式为指导,在JSP Model2架构上“进化”而来。
  2. 事件驱动的Web开发框架(event-driven web framework);这种框架采用与Swing等GUI开发框架类似的思想,将视图组件化,由视图中的相应组件触发事件,进而驱动整个处理流程。

引入Front Controller的控制器结构

SpringMVC属于请求驱动的Web开发框架,所以SPringMVC也是JSP Model2一样使用单一Servlet控制器的实践方式的。所以为了避免避免一些问题,通常这类框架通常会结合Front Controller和Page Controller模式,对单一的Servlet控制器做进一步的改进,对原先过于耦合的各种控制器逻辑进行逐步的分离。具体的说就是把单一Servlet作为整个程序的Front Controller;该Servlet接收到具体Web请求后,先参照预先可配置的映射信息,将待处理的Web请求转发给次一级的控制器(sub-controller)来处理,如图所示
在这里插入图片描述

Spring MVC框架的处理器策略

SpringMVC就是通过引入Front Controller和Page Controller的概念来分离流程控制逻辑与具体的Web请求逻辑。org.springframework.web.servlet.DispatcherServlet就是Spring MVC框架的Front Contrller,它负责接受并处理所有的Web请求,只不过针对具体的处理逻辑,他会委派给它的下一级控制器去实现,即org.springframework.web.servlet.mvc.Controller则对应Page Controller的角色定义。所以Spring MVC的核心Servlet就是DispatcherServlet。
DispatcherServlet的处理流程:

  1. HandlerMapping(Web请求的处理协调人)
    因为DispatcherServlet是整个框架的FrontController,当它注册到web.xml时,就注定了要服务于规定的一组的Web请求,而不是一个,看注册案例:
<servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
</servlet>

如果将映射的逻辑写死到DispatcherServlet,是无法有效的扩展的,而且匹配的方式也可能随着需求而变化,所以引入org.springframework.Web.servlet.HandlerMapping来专门管理Web请求到具体的处理类之间的关系,只是这里我们把HandlerMapping的配置给去掉了,因为你这并不是必须的,在没有配置任何Handle-rMapping时,容器将会调用默认的BeanNameUrlHandlerMapping进行URL到具体Controller的匹配;在请求到达DispatcherServlet之后,Dispathcer将寻求具体的HandlerMapping实例,以获取具体的处理类,即具体的Controller。

HandlerMapping的配置方法:

<bean id="handlerMapping" class="org.springframework.Web.servlet.handler.BeanNameUrlHandlerMapping">
</bean>
  1. org.springframework.Web.servlet.Controller(Web请求具体的处理者)
    就是我们通常说的Controller,Controller即DispatcherServlet的次级控制器,它本身实现了对应某个Web请求的处理逻辑。在使用HandlerMapping查找到具体的Controller实例后,DispatcherServlet即可获取HandlerMapping所返回的结果,并调用Controller来处理当前的Web请求。
    Controller执行完毕之后返回一个ModelAndView实例,包含两部分信息。
  • 视图的逻辑名称(或者具体的哪个视图)
  • 模型数据。
  1. ViewResolver和View(视图转换器和视图)
    Spring为了以统一的方式,将相同的数据模型纳入不同的视图形式,提出了一套基于ViewResoler和View接口的Web视图处理抽象层,以屏蔽Web框架在使用不同的Web视图技术时的差异性。我们要向客户端输出视图类型,可以分为文本传输和二进制传输两种方式,比如JSP/JSTL等最终都是以标记文本的方式表现的,而PDF/Excel之类则属于二进制内容行列。对于这两种形式的视图输出,Servlet自身的HttpServletResponse已经足够应付。
//使用Servlet输出标记文本视图
String markupText = ...;
PrintWriter writer = response.getWirter();
writer.write(markeupText);
write.close();

//使用Servlet输出二进制格式视图
byte[] binaryContext = ...;
ServletOutputStream out = response.getOutputStream();
out.write(binaryContext);
out.close();

在HttpServletResponse可以同时支持文本形式和二进制形式的视图输出前提下,我们只要在最终将视图数据通过HttpServletResponse输出之前,借助于不同的试图技术API,并结合模型数据和相应的模板文件,就能生成最终的视图结果;如下伪代码:

  1. 获取模型(Model)数据
  2. 获取视图模板文件(如*.JSP、.vm、.fm、*.xls)等
  3. 结合视图和模型数据,使用相应的视图技术API生成最终结果
  4. 将视图结果通过HttpServletResponse输出到客户端
  5. 完成

视图模板和模型数据合并逻辑,以及合并后的视图结果的输出逻辑全部封装到了相应的View实现类中。DispatcherServlet只需要根据ModelAndView返回的信息,选择具体的View实现类做最终的具体工作室即可。 ViewResolver只是帮忙处理逻辑视图名与具体的View实例之间的映射对应关系。

至此,整个DispathcerServlet的处理流程结束。
SPringMVC各角色交互图

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值