1.1 Spring MVC 基本特点
1.1.1 基本概念
- Spring MVC是 Spring体系的轻量级Web MVC框架。
- Spring MVC的核心Controller控制器,用于处理请求,产生响应。
- Spring MVC基于Spring IOC容器运行,所有对象都被IOC管理。
1.1.2 在三层架构中的位置
1.1.3 Springmvc优点
序号 | 优点 | 描述 |
---|---|---|
1 | 清晰的角色划分 | 前端控制器( DispatcherServlet) 、处理器映射器( HandlerMapping) 、处理器适配器( HandlerAdapter)、 视图解析器( ViewResolver)、 后端控制器( Controller) |
2 | 与Spring 框架无缝集成 | 这是其它web框架不具备的 |
3 | 可扩展性好 | 可以很容易扩展,虽然几乎不需要 |
4 | 单元测试方便 | 利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试 |
5. | 功能强大 | RESTful、数据验证、格式化、本地化、主题等 |
6 | jsp标签库 | 强大的 JSP 标签库,使 JSP 编写更容易 |
1.1.4 和Struts2比较
共同点:
- 它们都是表现层框架,都是基于 MVC 模型编写的。
- 它们的底层都离不开原始 ServletAPI。
- 它们处理请求的机制都是一个核心控制器。
区别:
- Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter。
- Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
- Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便。
- Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提升,尤其是 struts2 的表单标签,没有 html 执行效率高。
1.2 执行原理
1.2.1 前端控制器
Spring的web框架围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器。
从Spring 2.5开始,使用Java 5或者以上版本的用户可以采用基于注解的controller声明方式。
Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。
1.2.2 SpringMVC的原理
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
1.2.3 SpringMVC执行原理
实线表示SpringMVC框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。
1.2.4 执行流程
1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
假设请求的url为 : http://localhost:8080/SpringMVC/success
如上url拆分成三部分:http://localhost:8080服务器域名。
SpringMVC部署在服务器上的web站点。success表示控制器.
通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
2、HandlerMapping为处理器映射。
DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
3、HandlerExecutionChain表示具体的Handler(处理器)
其主要作用是根据url查找控制器,如上url被查找控制器为:success。
4、HandlerExecutionChain将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
5、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
6、Handler让具体的Controller执行。
7、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
8、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
9、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
10、视图解析器将解析的逻辑视图名传给DispatcherServlet。
11、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
12、最终视图呈现给用户。