最近在看Spring MVC的源码,分享一下我的体验。
先让我们看看一般web框架所做的事情:
1)浏览器发来请求,GET或者POST。
2)web框架通过某种方式包装这些数据。
3)后台业务逻辑代码接受传递的请求数据,进行正常的业务操作(查询,增加,修改,删除等)。
4)web服务器发出响应,渲染页面到浏览器,或者重定向。
所有Web框架都离不开Servlet,因为这是Java web框架的运行时容器。根据MVC模式,Web框架的所有职责被分为三部分即(Model(拥有数据),View(展现数据)和Controoler(控制请求的流向))
为了控制整个请求过程的复杂性,所以把所有请求控制逻辑集中于一处。这就是Front Controller模式。在SpringMVC中,所有的控制逻辑都会由一个类来控制,就是DispatcherServlet.下面对主要类的职责进行一下说明:
1)View接口,根据Model中的数据渲染页面。
public interface View {
String getContentType();
void render(Map model, HttpServletRequest request, HttpServletResponse response)
}
2)Controller接口,处理请求,并返回ModelAndView对象(这是一个包含Model和View的类,作用就是hold数据)
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
}
3)ModelMap(代表MVC里的M)。
所有的请求数据都是被封装到这个类里。其实就是一个加强型的Map。和Struts不同的是,Struts是用Form来进行数据传递的,所以会有很多Form。Spring把Model抽象为Map,损失了类型信息。带来了灵活性。
4)ViewResolver。
因为控制类可能直接返回一个视图,也可能仅仅返回一个视图的名字,这样就是这里类根据一些规则来找到一个合适的视图并返回。它承担了C->V的部分职责。
5)DispatcherServlet类。
它就是一个路由器,告诉请求该往哪里去。有点向大堂的前台,来一个客人(请求),她会引领你到正确的地方。doDispatch方法负责执行所有Intercepter和handler的执行过程。
6)HandlerMapping接口。
这个类承担什么职责呢?上面我说道了DispatcherServlet,她是路由器,但是她不是随便转发的,她的转发是有根据的。什么是根据呢,这个接口的职责就是干这个的,相当于一个注册表,DispatcherServlet会根据请求信息在这些注册表(HandlerMapping)里找到正确的Handler,然后由Handler来处理这个请求。大家也许有这样的疑问,为什么不直接转到某一个Controller就完了?答案就是,Spring就是这样一个粘合框架,体现在这里,就是他可以兼容很多Web框架,这里又加了一层间接 。Spring认为,所有的请求都是应该Handler来进行处理,而Controller只是其中一种Handler而已。看看代码:
public interface HandlerMapping {
String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
HanderExecutionChain主要是hold了一个HandlerIntercepter的列表,它用了Decorator模式. 所有HandlerExecutionChain中的intercepter会被合并。最终也是在DispatcherServlet的doDispatch得到调用。
7)说到这里,我们该引出HandlerAdapter接口。
上面我说了,什么都有可能是Handler,这个接口就是整整处理请求的地方。看来两个例子:
第一个例子是把请求适配到Controller。
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
public long getLastModified(HttpServletRequest request, Object handler) {
if (handler instanceof LastModified) {
return ((LastModified) handler).getLastModified(request);
}
return -1L;
}
}
接下来的例子是将请求适配到某一个Servlet:
public class SimpleServletHandlerAdapter implements HandlerAdapter {
public boolean supports(Object handler) {
return (handler instanceof Servlet);
}
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
((Servlet) handler).service(request, response);
return null;
}
public long getLastModified(HttpServletRequest request, Object handler) {
return -1;
}
}
真正的请求是在DispatcherServlet里调用的,请看doDispatch方法片段,就是这里。
// Actually invoke the handler.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
还有很多类没说,不过骨架都在这里了,希望我说的明白。
分享到:
相关推荐
通过这些模式的运用,Spring MVC的代码结构清晰,易于扩展和维护。 对Spring MVC源码的深入剖析不仅有助于开发者更好地理解框架的工作机制,而且可以为开发定制化组件、性能优化及故障排查等提供坚实的知识基础。...
spring mvc4.1.4 源代码 spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码
在Spring MVC中,开发者可以通过@Autowired注解自动装配依赖,使得代码更易于测试和维护。 此外,Spring MVC还提供了数据绑定和验证功能。表单提交的数据可以直接绑定到控制器方法的参数上,通过@ModelAttribute...
这本书“看透Spring MVC源代码分析与实践”显然是为了帮助开发者深入理解Spring MVC的工作原理,并通过源码分析提升实战技能。在本文中,我们将探讨Spring MVC的关键概念、设计模式以及源码中的重要组成部分。 1. *...
这份【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip文件很可能是为了帮助求职者准备相关面试问题而设计的,包含了对Spring MVC工作原理、关键组件和源码解读的详尽解析。 1. **Spring MVC基本...
标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...
看透Spring MVC源代码分析与实践 看透Spring MVC源代码分析与实践
而`spring-framework-2.5.6-with-docs.zip`可能包含了Spring 2.5.6的源码和文档,帮助开发者了解Spring MVC的内部实现和最佳实践。 总之,这个压缩包提供了开发基于Spring MVC和Hibernate的Java Web应用所需要的...
通过仔细阅读和分析这些源代码,开发者不仅可以提升对Spring MVC框架的理解,还能学习到设计模式、性能优化和最佳实践,从而在实际项目中更有效地应用Spring MVC。无论是初学者还是经验丰富的开发者,都应该充分利用...
- 学习Spring MVC和MyBatis的整合,可以参考官方文档、教程和开源项目的源码。 - 通过调试源码,理解其实现原理,有助于提升实战技能。 总结,这个压缩包提供了一个完整的Spring MVC和MyBatis整合的示例,包含了...
10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持。 在实际开发中,我们可以通过Maven或Gradle等构建工具将Spring MVC 4.2.3依赖引入项目。同时,使用IDE如IntelliJ ...
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...
在本源码分析中,我们将探讨Spring MVC的工作原理、主要组件及其交互方式。 1. **DispatcherServlet**: 作为Spring MVC的前端控制器,DispatcherServlet是所有请求的入口点。它负责拦截请求,根据请求信息(如URL、...
Spring MVC深入解析 Spring MVC是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,是Spring Framework的一部分。它提供了一个灵活的方式来构建Web应用程序,使得开发者可以轻松地创建复杂的Web应用程序。 ...
这个"Spring MVC 基础实例源码01"的资源很可能是为了帮助初学者理解Spring MVC的核心概念和基本用法。下面我们将详细探讨Spring MVC的一些关键知识点。 1. **MVC模式**:MVC(Model-View-Controller)是一种设计...
1. **依赖注入**:Spring MVC 4.0继续支持Spring框架的核心功能,依赖注入(DI),允许开发者通过配置来管理对象及其依赖关系,降低了代码耦合度,提高了可测试性。 2. **ModelAndView对象**:在处理完请求后,控制...