一、概述
SpringMvc与Servlet一样,都属于web层的开发。在Web应用程序设计中,MVC模式已经被广泛使用。SpringMVC以DispatcherServlet为核心,负责协调和组织不同组件以完成请求处理并返回响应的工作,实现了MVC模式。
这时候有人会说,既然SpringMvc与servlet一样,那我们为啥还要学习SpringMvc嘞
咱们看一个最基础的servlet的例子
在这个servlet中,我们重写了doGet和doPost两个方法,同时让doPost转调doGet对请求进行统一的处理,但是我们通常会编写一个方法对应一个servlet,那么这时候问题就出现了,一个业务最基础都离不开增删改查吧,如果我们每一个方法都写一个servlet去实现业务,代码就显得太过冗余了
比如这样:
为了简化我们的开发,SpringMvc就诞生了
让我们看看SpringMvc的简洁性
我们只需要新建一个controller类使用
@RequestMapping为每个方法都添加上对应的 访问路径
@ResponseBody声明请求体
就极大程度的简略了代码了
二、快速入门
1,导入依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
2,编写SpringMvc配置类和servlet总配置类
SpringMvcConfig:
package config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("controller")
public class springMvcConfig {
}
servletConfig:
package config;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//servlet启动配置类,加载SpringMvcConfig
public class servletConfig extends AbstractDispatcherServletInitializer {
//加载SpringMvc容器配置
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(springMvcConfig.class);
return ctx;
}
//设置SpringMvc管理哪些请求
@Override
protected String[] getServletMappings() {
//所有请求都由SpringMvc处理
return new String[]{"/"};
}
//加载Spring容器配置
@Override
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
3,新建Controller层编写测试
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/user")
public class userController {
@ResponseBody
@RequestMapping("/select")
public String select(){
System.out.println("user Test....");
return "{'model':'springMvc'}";
}
@ResponseBody
@RequestMapping("/delete")
public String delete(){
System.out.println("user Test....");
return "{'model':'springMvc'}";
}
@ResponseBody
@RequestMapping("/update")
public String update(){
System.out.println("user Test....");
return "{'model':'springMvc'}";
}
@ResponseBody
@RequestMapping("/add")
public String add(){
System.out.println("user Test....");
return "{'model':'springMvc'}";
}
}
项目最终路径
测试:
直接访问目标网址
观察输出结果
到此结束~
三、工作流程
启动服务器初始化流程
- 服务器启动,执行serlvetConfig类,初始化web容器
- 执行createServletApplicatonContext方法,创建webApplicationContext对象
- 调用webApplicationContext对象的register方法注册SpringMvc配置类的信息
- 执行SpringMvc内的@componentScan扫描对应的bean
- 加载Controller层每一个对应的@RequestMapping的每一个方法
- 执行servlerConfig类中的getServletMappings()方法定义哪些请求需要控制
单次请求流程
- 发送请求localhost+对应的@RequestMapping的value值
- web容器判断当前是否被springMvc管理
- 解析请求路径
- 通过@RequestMapping对应具体的方法
- 执行当前方法
- 通过@ResponseBody把对应的方法体作为返回数据返回给请求方