`

Spring MVC源码浅析

阅读更多

  最近在看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());

 

   还有很多类没说,不过骨架都在这里了,希望我说的明白。

 

3
1
分享到:
评论

相关推荐

    Spring MVC源码深度剖析开源架构源码2021.pdf

    通过这些模式的运用,Spring MVC的代码结构清晰,易于扩展和维护。 对Spring MVC源码的深入剖析不仅有助于开发者更好地理解框架的工作机制,而且可以为开发定制化组件、性能优化及故障排查等提供坚实的知识基础。...

    spring mvc源代码

    spring mvc4.1.4 源代码 spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码spring mvc4.1.4 源代码

    Mastering Spring MVC 4(2015.09)源码

    在Spring MVC中,开发者可以通过@Autowired注解自动装配依赖,使得代码更易于测试和维护。 此外,Spring MVC还提供了数据绑定和验证功能。表单提交的数据可以直接绑定到控制器方法的参数上,通过@ModelAttribute...

    看透spring mvc源代码分析与实践扫描版带目录+源码

    这本书“看透Spring MVC源代码分析与实践”显然是为了帮助开发者深入理解Spring MVC的工作原理,并通过源码分析提升实战技能。在本文中,我们将探讨Spring MVC的关键概念、设计模式以及源码中的重要组成部分。 1. *...

    【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip

    这份【面试资料】-(机构内训资料)看透Spring MVC源代码分析与实践.zip文件很可能是为了帮助求职者准备相关面试问题而设计的,包含了对Spring MVC工作原理、关键组件和源码解读的详尽解析。 1. **Spring MVC基本...

    开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp

    标题中的"开发Spring MVC应用程序补充—程序源码下载.rar_spring_spring mvc_spring mvc 源码_sp"表明这是一个关于Spring MVC框架的开发教程,其中包含了源代码供学习者参考。Spring MVC是Spring框架的一个核心组件...

    精通Spring MVC 4

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。Spring MVC4是当前zuixin的版本,在众多特性上有了进一步的提升。, 在精通Spring...

    看透Spring MVC源代码分析与实践

    看透Spring MVC源代码分析与实践 看透Spring MVC源代码分析与实践

    Spring MVC jar包

    而`spring-framework-2.5.6-with-docs.zip`可能包含了Spring 2.5.6的源码和文档,帮助开发者了解Spring MVC的内部实现和最佳实践。 总之,这个压缩包提供了开发基于Spring MVC和Hibernate的Java Web应用所需要的...

    《精通Spring MVC 4》源码

    通过仔细阅读和分析这些源代码,开发者不仅可以提升对Spring MVC框架的理解,还能学习到设计模式、性能优化和最佳实践,从而在实际项目中更有效地应用Spring MVC。无论是初学者还是经验丰富的开发者,都应该充分利用...

    spring mvc mybatis 整合源码,带数据库脚本,带详细注释

    - 学习Spring MVC和MyBatis的整合,可以参考官方文档、教程和开源项目的源码。 - 通过调试源码,理解其实现原理,有助于提升实战技能。 总结,这个压缩包提供了一个完整的Spring MVC和MyBatis整合的示例,包含了...

    Spring MVC 4.2.3

    10. **国际化和本地化**:通过消息源和LocaleResolver,Spring MVC可以轻松实现应用的多语言支持。 在实际开发中,我们可以通过Maven或Gradle等构建工具将Spring MVC 4.2.3依赖引入项目。同时,使用IDE如IntelliJ ...

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码.zip

    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框架源码

    在本源码分析中,我们将探讨Spring MVC的工作原理、主要组件及其交互方式。 1. **DispatcherServlet**: 作为Spring MVC的前端控制器,DispatcherServlet是所有请求的入口点。它负责拦截请求,根据请求信息(如URL、...

    springmvc深入解析.pdf

    Spring MVC深入解析 Spring MVC是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,是Spring Framework的一部分。它提供了一个灵活的方式来构建Web应用程序,使得开发者可以轻松地创建复杂的Web应用程序。 ...

    Spring MVC 基础实例源码01

    这个"Spring MVC 基础实例源码01"的资源很可能是为了帮助初学者理解Spring MVC的核心概念和基本用法。下面我们将详细探讨Spring MVC的一些关键知识点。 1. **MVC模式**:MVC(Model-View-Controller)是一种设计...

    spring mvc 4.0

    1. **依赖注入**:Spring MVC 4.0继续支持Spring框架的核心功能,依赖注入(DI),允许开发者通过配置来管理对象及其依赖关系,降低了代码耦合度,提高了可测试性。 2. **ModelAndView对象**:在处理完请求后,控制...

Global site tag (gtag.js) - Google Analytics