编译软件:IntelliJ IDEA 2019.2.4 x64
操作系统:win10 x64 位 家庭版
Maven版本:apache-maven-3.6.3
Mybatis版本:3.5.6
SpringMvc版本:5.3.1
一、SpringMvc是什么?
①SpringMVC是Spring的一种子框架,它是Spring为【 展现层 | 表示层 | 表述层 | 控制层】提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架。
什么是Mvc设计理念?
就是Mvc设计思想,即Model (业务模型),View(用户视图)与Controller(控制层)
为什么要使用Mvc设计理念?
简单来说,MVC设计理念提供了一种结构化的方式来组织应用程序的代码,使得开发人员可以更好地管理复杂性、提高开发效率,并实现可维护、可扩展和可测试的代码。
②SpringMVC是非侵入式
什么叫非侵入式?
它强调了一种开发模式 ,
在使用框架的同时尽量减少对应用程序代码的依赖和修改,使得框架与应用程序之间的耦合度降低。
具体来说,在SpringMVC中,你可以编写普通的Java类作为控制器,并通过注解或配置将其标识为处理特定URL请求的方法
。这种方式让您可以保持应用程序原有的结构和业务逻辑,而不需要强制按照框架的规范去改变代码的组织方式。
③SpringMVC是用来代替Servlet,在未用到SpringMvc框架之前,我们通常都是基于Servlet处理请求,做出响应。
二、SpringMvc是如何执行业务流程的?
SpringMvc执行业务的简易流程如下所示
- 用户通过浏览器向后端发出请求。
- DispatcherServlet是一个Servlet,它作为应用程序的入口点接收所有的请求,并负责协调整个处理流程。
- DispatcherServlet根据配置的处理器映射器(HandlerMapping)查询找到适合处理当前请求的处理器(控制器)。
- 处理器映射器根据请求的URL或其他条件将请求映射到合适的处理器。处理器可以是一个类,通常会使用注解(如@Controller)标识,也可以是实现了特定接口(如HandlerInterceptor)的类。
- 处理器映射器将请求做简单的封装得到处理器执行链对象(HandlerExecutionChain)返回给DispatcherServlet,该链包括处理器本身、拦截器以及其他辅助处理器。
- DispatcherServlet通过拦截器链调用处理器的预处理方法(preHandle),这样可以进行一些共享数据的准备工作以及对请求进行预处理。
- 根据处理器执行链中的处理器,DispatcherServlet查找到与之相应的处理器适配器对象HandlerAdapter。这是由于处理器的种类不只一种,不同的处理器需要不同的处理器适配器 HandlerAdapter 来执行。
- 找到对应的处理器适配器后,DispatcherServlet立即调用处理器适配器,让其执行处理器。
- 处理器适配器执行处理器后,处理器将 ModelAndView 返回给处理器适配器。
- 处理器适配器在接收到处理器返回的 ModelAndView 后,直接将 ModelAndView 返回给DispatcherServlet。
- DispatcherServlet在接收到处理器适配器发送来的 ModelAndView 后,并不是将其作为最终的调度结果,而是首先调用执行处理器执行链中的拦截器后端方法。因为DispatcherServlet将ModelAndView 对象传递给了拦截器的后端方法,使后端方法可以修改 ModelAndView。
- 视图解析器的工作将视图名称与响应目标定位对象进行绑定,形成视图对象返回给DispatcherServlet。
- 在得到相应的视图对象后,DispatcherServlet调用视图对象的渲染方法,真正对视图进行渲染。
- DispatcherServlet执行了收尾工作,它执行处理器执行链拦截器的afterCompletion()方法。由 afterCompletion()方法发出对请求的最终响应。
- 浏览器接收到响应
三、如何搭建基于SpringMvc的第一个HelloWorld
3.1 搭建SpringMvc框架的步骤
①在IDEA中创建一个Maven项目,导入相关jar包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
这里为何把javax.servlet-api的scope设为provided?
因为tomcat服务器中已经有了一个javax.servlet-api,若pop.xml中将javax.servlet-api这个jar包依赖范围设到Tomcat服务器中,则两个servlet的jar包会发生冲突。
②编写配置文件
- 在web.xml中注册DispatcherServlet
- ur配置:/
- init-param:contextConfigLocation,设置springmvc,xml配置文件路径【管理容器对象】
- <load-on-startup>:设置DispatcherServlet优先级【启动服务器时,创建当前Servleti对象】
- 在springmvc.xml实现以下功能
- 开启组件扫描
- 配置视图解析器【解析视图(设置视图前缀&后缀】
③编写请求处理器【Controller | Handler】
- 使用@Controlleri注解标识请求处理器
- 使用@RequestMapping注解标识处理方法【URL】
④准备页面进行以测试
3.2 HelloWorld之实战
①准备
新建一个Maven工程,在其上搭建web工程环境,工程结构如下所示
②在Maven工程中的pop.xml中导入相关jar包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
③在spring的配置文件中【springmvc.xml】中开启组件扫描和配置视图解析器
<!-- 开启组件扫描 --> <context:component-scan base-package="spring"></context:component-scan> <!-- 配置视图解析器【解析视图(设置视图前怨后缀)】 --> <!-- 配置视图解析器 --> <bean id="thymeleafViewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"> <!--鹿置字符集属性 --> <property name="characterEncoding" value="UTF-8"></property> <!--鹿置模板引擎厨性--> <property name="templateEngine"> <!--鹿置内bean--> <bean class="org.thymeleaf.spring5.SpringTemplateEngine"> <!--鹿置馍块的解析器雨性--> <property name="templateResolver"> <!-- 配置内部bean --> <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"> <!-- 配置前缀 --> <property name="prefix" value="/WEB-INF/pages/"></property> <!-- 配置后缀 --> <property name="suffix" value=".html"></property> <!-- 配置字符集 --> <property name="characterEncoding" value="UTF-8"></property> </bean> </property> </bean> </property> </bean>
④在web.xml中注册DispatcherServlet【前端控制器】
<!-- 注册 Dispatcherservlet【前满控制器】--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 设置DispatcherServlet优先级 --> <!-- 启动服务器时,创建当前Servleti对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
⑤从当前工程下/src/main/spring/Controller下新建一个类HelloController,作为请求处理器,使用@Controlleri注解标识它为请求处理器,并且使用@RequestMapping注解标识处理方法【URL】
@Controller //标识此类为请求处理器 public class HelloController { //配置url【/】 映射到wEB-INF/index.html @RequestMapping("/") public String toIndex(){ //WEB-INF/pages/index.html //物理视图名=视图前餐+逻辑视图名+视图后缀 return "index"; } /** * 配置url【/HelloControllerMethod】,浏览器中的请求会基于该url,找到并进入下面的方法 */ @RequestMapping("/HelloControllerMethod") public String HelloControllerMethod(){ System.out.println("--->请求已经进入到HelloControllerMethod方法中"); //默认是转发请求 return "success"; } }
⑥编写相关前端页面【index.html & success.html】
<!-- index.html --> <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>首页</h1> <a th:href="@{/HelloControllerMethod}">发送请求</a> </body> </html>
<!-- success.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>转发成功,到达成功页面</title> </head> <body> <h1>成功页面</h1> </body> </html>
⑦开启Tomcat服务器,运行测试