目录
🍌 一.什么是Spring MVC
Spring Web MVC是基于Servlet API构建的原始Web框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。前面学习了Spring Boot,其是为了快速开发Spring而创建的框架,其本质也是spring,所以现在大部分Java项目都是基于Spring(或 Spring Boot)的,而Spring的核心就是Spring MVC,也就是说Spring MVC 是Spring框架的核心模块,那么MVC代表什么呢?
MVC是Model View Controller的缩写,这其实是一种设计模式,这种设计模式将软件(项目)分成三部分:模型,视图和控制器,下面是一个项目和用户的具体交互过程:
通过这样的MVC设计模式就可以实现一个web项目,那么MVC和Spring MVC又有什么关系:MVC是一种设计思想,而Spring MVC是具体的实现框架!
总结一下:Spring MVC其实就是一个基于MVC设计模式和Servlet API实现的web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring的诞生而存在的一个框架!
🍌 二.Spring MVC 创建和连接
Spring MVC项目的创建和Spring Boot项目的创建其实是差不多的,在创建项目的时候,选择了Spring Web就相当于创建了Spring MVC项目!
🍓 1.实现用户和程序的映射
🍉 1.1.使用注解@RequestMapping
@Controller
@ResponseBody
public class UserController {
@RequestMapping("/func")
public String func(){
return "Hello,world!";
}
}
这里是需要加上@ResponseBody的,否则就会认为你返回的是一个静态页面,就会去查找到底有没有这个页面,如果没有的话就会404了,因此这里是需要加上这个注解的,这样才能访问到这个页面,这其实是一个遗留的问题。
而通过抓包工具可以发现这个是一个get请求(使用浏览器直接访问的一般都是get请求),那有没有办法构造post请求呢?答案是肯定的!
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping(value = "/func",method = RequestMethod.POST)
public String func(){
return "Hello,world!";
}
}
通过这样的参数设计就可以将请求设置为post请求了,其他类型的请求也是可以进行设置的,下面可以通过postman来看一下这个到底是不是post请求:
可以发现这个请求已经是post请求了
🍉 1.2.使用注解@PostMapping
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@PostMapping("/func2")
public String func2(){
return "我是post请求!";
}
}
这样构造出来的一定是post请求
🍉 1.3使用注解@GetMapping
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@GetMapping("/func3")
public String func3(){
return "我是get请求!";
}
}
🍓 2.服务器端得到用户的请求参数
🍉 2.1.获取单个参数
这里在参数里面传一个id值,
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping("/getuserbyid")
public User getUserById(Integer id){ //这里一定使用包装类,可以避免为空的异常
//这里不查询数据库,直接返回
User user = new User();
user.setId(id);
user.setUsername("张三");
user.setPassword("123");
user.setAge(19);
return user;
}
}
抓包工具里面也可以发现其响应结果正是这样的数据,另外这里传递的参数一定是要和前端传递的参数一致的,否则就无法进行参数的传递!
🍉 2.2.获取多个参数
这里也是可以传递多个参数的:
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping("/login")
public String login(String username,String password){
return "username: " + username + " | password: " + password;
}
}
但是当参数过多的话,在使用这样的方式来进行传递,每次增加的参数,都需要再参数列表里面进行传递,这显然是不合适的,那么有什么更好的方法嘛?当然这里也是可以传递一个对象的!
🍉 2.3.获取对象
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping("/reg")
public String reg(User user){
return "用户信息: " + user;
}
}
这里就可以发现传递一个对象也是可以的,而Spring内部会根据返回的信息来自己设置返回类型,这也是Spring非常厉害的一个地方吗,另外通过form表单参数传递/传递多个参数也是可以的,这里就不详细介绍了!
🍉 2.4.后端参数重命名
如果前端传递过来的参数,不符合后端的需要,后端也是可以对前端传递过来的参数进行重名的!这里使用一个@RequestParam就可以解决了:
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
//RequestParam里面放着前端传递的参数,后面是后端要重命名的参数
@RequestMapping("/set")
public String set(@RequestParam("name") String username){
return username;
}
前端传递的参数是name,但是在后端可以使用username,这样就可以进行了重命名!
而当使用了@RequestParam之后,传递过来的参数就不能是空的了,如果是空的话就会直接报错了,想要让其可以传递空的参数的话,可以将@RequestParam里面的属性required = false就可以传递空的参数了!
🍉 2.5.获取JSON对象
此时就不能再使用接收普通对象来接收了,此时就需要使用@RequestBody注解了,@RequestBody表示从前端接收过来的数据是JSON形式的
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping("/getjson")
public String getJson(@RequestBody User user){
return "用户信息:" + user;
}
}
可以发现是获取到了这个对象了!
🍉 2.6.获取URL中的参数
想要从url里面获取参数,就需要使用到@PathVariable注解了,而前面的获取url的参数是从?后面的参数中获取的,但这里可以从url地址(?前面)来进行获取,下面一起来看一下:
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
@RequestMapping("/geturl/{username}/{password}")
public String getUrl(@PathVariable String username,@PathVariable String password){
return "用户名: " + username + " | 密码: " + password;
}
}
在@RequestMapping里面也是要根据顺序来进行编写的
发现信息也是可以获取到的!
🍉 2.7.上传文件
这里也是可以进行上传文件操作的,使用@RequestPart注解就可以实现:
@Slf4j
@Controller
@ResponseBody //返回一个非静态页面
public class UserController {
//上传文件
@RequestMapping("/upimg")
public boolean upImg(Integer id, @RequestPart("img")MultipartFile file){
boolean result = false;
//保存文件到本地目录
try {
file.transferTo(new File("E:\\Web\\img.png"));
result = true;
} catch (IOException e) {
log.error("上传图片失败" + e.getMessage());
}
return result;
}
图片也是上传成功了!