什么是SpringMVC
SpringMVC 简介
Spring Web MVC 是一种使用了 MVC 架构模式思想的轻量级 Web 框架,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,帮助我们简化日常 Web 开发的。
- MVC是模型(Model)、视图(View)、控制器(Controller)的简写
- 是将业务逻辑、数据、显示分离的方法来组织代码
- MVC主要作用是降低了视图与业务逻辑间的双向偶合
Controller(控制器)
- 取得表单数据
- 调用业务逻辑
- 转向指定的页面
Model(模型)
- 业务逻辑
- 保存数据的状态
View(视图)
- 显示页面
MVC框架要做哪些事情
- 将url映射到java类或java类的方法
- 封装用户提交的数据
- 处理请求--调用相关的业务处理--封装响应数据
- 将响应的数据进行渲染 . jsp / html 等表示层数据
Spring MVC的特点
- 轻量级,简单易学
- 高效 , 基于请求响应的MVC框架
- 天生与 Spring 框架集成
- 提供强大的约定大于配置的契约式编程支持
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简洁灵活,易于扩展
回顾Servlet
项目结构:
1.利用 Maven 创建一个 web 工程当做父工程。
2.在 pom.xml 文件中,添加 spring-webmvc 的依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
3.建立一个Moudles:pringmvc-01-servlet,并添加Web app的支持。
4.导入servlet 和 jsp 的 jar 依赖。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
5.编写一个Servlet类,用来处理用户的请求。
//实现Servlet接口
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//取得参数
String method = req.getParameter("method");
if (method.equals("add")){
req.getSession().setAttribute("msg","执行了add方法");
}
if (method.equals("delete")){
req.getSession().setAttribute("msg","执行了delete方法");
}
//业务逻辑
//视图跳转
req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
6.在web.xml中注册Servlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.ldc.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/user</url-pattern>
</servlet-mapping>
</web-app>
7.配置Tomcat并启动项目。
8.项目启动成功后,浏览器输入 localhost:8080/user?method=add 或 localhost:8080/user?method=delete 测试。
SpringMVC执行原理
- 客户端发送请求到 DispatcherServlet
- DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller
- Controller 调用业务逻辑后,返回 ModelAndView
- DispatcherServlet 查询 ModelAndView,找到指定视图
- 视图将结果返回到客户端
执行流程
-
用户发送请求至前端控制器 DispatcherServlet。
-
DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
-
处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)并返回给DispatcherServlet。
-
DispatcherServlet 调用 HandlerAdapter 处理器适配器,经过适配后调用具体的处理器(Controller)。
-
HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。
-
DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
-
ViewReslover 解析后返回具体 View。
-
DispatcherServlet 根据 View 进行渲染视图(将模型数据填充至视图中)并响应用户。
SpringMVC 中的组件
-
DispatcherServlet:前端控制器
用户请求到达前端控制器,它是 SpringMVC 的大脑,由它调用其它组件处理用户的请求。
DispatcherServlet 的存在降低了组件之间的耦合性。 -
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler(就是 Controller)。
SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等,在实际开发中,我们常用的方式是注解方式。 -
Handler:处理器
Handler 是后端控制器,在DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。
Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。 -
HandlAdapter:处理器适配器
HandlAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行多种类型的处理器,这里使用了适配器设计模式。 -
ViewResolver:视图解析器
ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名(具体的页面地址),再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。