一 . 了解什么是 Spring Mvc
- Spring MVC 全称为 Spring Web MVC.
- Spring MVC 是一个 Web 框架.
- Spring MVC 是基于 Servlet API 构建的.
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,它也是存在于 Spring 框架之中的,通俗的说,它其实就是 Spring 框架中的 Web 模块。
1.1 MVC 定义
- MVC 是 Model View Controller 的缩写,它是一种设计模式,这种设计模式把软件系统分为 模型 ,视图 , 控制器 三个基本部分。
- Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。
二 . 怎么学 Spring MVC?
学习 Spring MVC 我们只需要掌握以下 3 个功能:
- 连接的功能:实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应方法)
- 获取参数的功能:服务器端要得到用户的请求参数
- 输出数据的功能:服务器端要将结果返回给用户(前端)
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。
2.1 如何实现连接功能呢
我们连接用户和 Java 程序之前, 先要创建一个 Spring MVC 项目, 而 SpringMVC 项目就是基于 Spring MVC 项目本身是基于 Spring Boot 项目的
代码演示
@RestController
public class ControllerTest {
@RequestMapping("/say")
public String say(){
return "hello,world";
}
}
在浏览器输入localhost:8080/say就可以访问代码中所写的方法
- @Controller :加上@Controller 注解是为了让 spring MVC 项目加载类, 加载类的时候, 才可以调用对应的 hello() 方法. 如果不加 @Controller 注解, 就不能正确访问到本地程序
- @RequestMapping : 该注解既可以修饰方法, 也可以修饰类. 当它指修饰方法的时候, 只需要通过方法的路由就可以映射到对应的方法; 当修饰类和方法时, 就需要通过类的路由 + 方法的路由一起才能映射到对应的方法.
- @ResponseBody : 通常用于返回 JSON 数据。如果不使用这个注解,Spring 会尝试使用 View Resolver 和模板引擎解析并渲染视图,而不是返回纯数据。
2.2 @RequestMapping, @GetMapping, @PostMapping 三个注解的区别
@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。
@RestController
@RequestMapping("/Controller")
// 可以修饰类
public class ControllerTest {
// 也可修饰方法
@RequestMapping("/say")
public String say(){
return "hello,world";
}
}
@RequestMapping 注解是既支持 GET 请求又支持 POST 请求的.
当你的程序想要只支持 GET 请求或者只支持 POST 请求的时候, 就可以使用 @GetMapping 和 @PostMapping 注解, 这俩注解和 @RequestMapping 是类似的用法, 使用相应的请求类型, 是能够正确映射到本地程序的.
Get 请求
// 写法一
@RequestMapping("/hello")
// 写法二
@RequestMapping(value="/hello", method=RequestMethod.GET)
// 写法三
@GetMapping("/hello")
Poth 请求
// 写法一
@RequestMapping(value = "/hello",method = RequestMethod.POST)
// 写法二
@PostMapping("/hello")
2.3 在程序中获取前端传递过来的参数
- URL 传参(人为的)
- ajax 传参
- form 表单传参
2.3.1 传递单个参数
@RestController
@RequestMapping("/Controller")
public class ControllerTest {
@RequestMapping("/say")
public String say(String name){
return "name:" + name;
}
}
其中传的数据类型要用包装类,就算前端没有传数据,也不会报错
2.3.2 传递多个参数
@RestController
@RequestMapping("/Controller")
public class ControllerTest {
@RequestMapping("/say")
public String say(String name,Integer id){
return "id:" + id + " name:" + name;
}
}
2.3.3 获取对象
@Data
public class User {
private int id;
private String name;
private int age;
}
@RequestMapping("/user")
public String user(User user){
return user.toString();
}
- 1. 当前端传递成百上千个参数的时候, 我们就不再使用接收多个变量的方式了, 而是直接封装成对象来接收, 此时 Spring MVC 就会去这个实体类里解析它所有的属性, 然后调用属性的 setter 方法, 将传递过来的值根据 key 值设置进去.
- 2. 当某一天, 前端又突然加了几个参数时, 我们的方法是不需要做出改变的, 只需要给实体类 User 中扩充属性即可.(参数名要保证一致!!!)
- 3. 参数名是大小写敏感的, 如果大小写不一样, 依然获取不到参数. 建议全部使用小写, 不要使用小驼峰.
2.3.4 获取JSON 对象
2.3.5 上传文件
@Slf4j
@Controller // 加载并注册类
@ResponseBody // 当前类返回的是非静态页面
@RequestMapping("/web") // 使用 "/web" 可以访问到当前类 (可省略)
public class WebController2 {
//获取配置文件的保存路径
@Value("${img.path}")
private String imgpath; //imgpath通过注解获取到了文件保存的路径
//上传文件
@RequestMapping("/upload") // 使用 "/web" + "/hello" 可以访问到当前方法
public boolean upload(String name, @RequestPart("myfile")MultipartFile file) throws IOException {
boolean result = false;
//得到原图片的名称
String filename = file.getOriginalFilename();
//得到图片后缀(png)
filename = filename.substring(filename.lastIndexOf("."));
//生成不重名的文件名
filename = UUID.randomUUID().toString() + filename;
try {
//将图片保存
file.transferTo(new File( imgpath+ filename));
result = true;
} catch (IOException e) {
log.error("图片上传失败!" + e.getMessage());
}
return result;
}
}
为什么一定要拿到用户上传的文件后缀格式呢?
答:用户上传的文件不仅仅是 " xxx.png “,” xxx.jpg ",还有可能是 " xxx.mp4 “,” xxx.gif " …如果我们需要 " UUID " 生成一个独一无二的名字,就需要获取文件格式。因为根据用户上传的特定格式,后端必须定义相同的文件格式,只是名字发生变化而已。所以,我们就可以通过 " 截取字符串 " 的经典方式来实现
2.3.6 获取 Cookie/Session/Header
@RequestMapping("/getcookie")
public String getCookie(@CookieValue(value = "java", required = false)
String ck) {
return ck;
}
@RequestMapping("/get_sess")
public String getSess(@SessionAttribute(required = false, value = "SESSION_KEY") String name) {
return name;
}