MVC目录
一. 🦁 MVC模型
MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:
-
Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。
-
View(视图):用于展示模型中的数据的,一般为jsp或html文件。
-
Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示
二. 🦁 SpringMVC
SpringMVC是一个基于MVC模式的轻量级Web框架,是Spring框架的一个模块,和Spring可以直接整合使用。SpringMVC代替了
Servlet技术,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。
1. SpringMVC执行流程(重点)
面试重点!!!
Ⅰ. SpringMVC四大组件
DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
HandlerMapping:处理器映射器,根据配置找到方法的执行链。
HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
ViewResolver:视图解析器,找到指定视图。
Ⅱ. 执行流程
-
客户端将请求发送给前端控制器。
-
前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。
-
前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器。
-
处理器执行方法,将结果返回给前端控制器。
-
前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。
-
视图渲染数据并将结果显示到客户端。
2. @RequestMapping
作用:给控制器方法设置请求路径
位置:方法或类上方。用于类上,表示类中的所有控制器方法都是以该地址作为父路径。
属性:
- value/path:请求路径
- method:指定请求方式
- params:规定必须发送的请求参数
- headers:规定请求必须包含的请求头
3. @RequestParam
作用:在控制器方法中获取请求参数
位置:方法参数前
属性:
- name:指定请求参数名称
- defaultValue: 为参数设置默认值
- required:设置是否是必须要传入的参数
/*
定义请求的参数名为username,默认值为sxt,不是必须的参数
*/
@RequestMapping("/annotation2")
public String annotation2(@RequestParam(name = "username",defaultValue = "sxt",required = false) String name){
System.out.println(name);
return "baizhan";
}
请求URL的写法:http://localhost:8080/c3/annotation2?username=bz
4. @ReuqestHeader & @CookieValue
@RequestHeader
作用:在控制器方法中获取请求头数据
位置:方法参数前
@CookieValue
作用:在控制器方法中获取Cookie数据
位置:方法参数前
/*
获取User-Agent请求头
获取JSESSIONID的Cookie值
*/
@RequestMapping("/annotation3")
public String annotation3(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String jSessionId){
System.out.println(userAgent);
System.out.println(jSessionId);
return "lion";
}
5. RESTful风格支持
RESTful风格是一种URL路径的设计风格,而每个资源都会占据一个网络路径,无论对该资源进行增删改查,访问的路径是一致的。
Ⅰ. 传统 vs restful
传统:
查找id为1的学生:
http://localhost:8080/student/findById?id=30
删除id为1的学生:
http://localhost:8080/student/deleteById?id=30
RESTful风格URL:
查找id为30的学生:
http://localhost:8080/student/30
删除id为30的学生:
http://localhost:8080/student/30
- 那么如何区分对该资源是哪一种操作?
通过请求方式不同,判断进行的是什么操作。
RESTful风格的URL一共有四种请求方式:
GET请求:查询操作
POST请求:新增操作
DELETE请求:删除操作
PUT请求:修改操作
- 优点
结构清晰、符合标准、易于理解、扩展方便。
Ⅱ. @PathVariable
作用:在RESTful风格的URL中获取占位符的值
位置:方法参数前
属性:
value:获取哪个占位符的值作为参数值,如果占位符和参数名相同,可以省略该属性。
对比 deleteStudent 和 findStudentById。
@Controller
@RequestMapping("/student")
// 模拟学生的增删改查控制器
public class StudentController {
// 路径中的{id}表示占位符,最后会封装到方法的参数中使用
// 删除学生
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public String deleteStudent(@PathVariable("id") int id){
System.out.println("删除id为"+id+"的学生");
return "lion";
}
// 如果占位符和参数名相同,可以省略@PathVariable的value属性
// 根据id查询学生
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public String findStudentById(@PathVariable int id){
System.out.println(id);
System.out.println("根据id查询学生");
return "lion";
}
// 新增学生
@RequestMapping(value = "/{id}",method = RequestMethod.POST)
public String addStudent(@PathVariable int id, Student student){
System.out.println(id);
System.out.println(student);
System.out.println("新增学生");
return "lion";
}
// 修改学生
@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
public String updateStudent(@PathVariable int id, Student student){
System.out.println(id);
System.out.println(student);
System.out.println("修改学生");
return "lion";
}
}
Ⅲ. @PostMapping @GetMapping
Ⅳ. @PutMapping @DeleteMapping
作用:简化设置请求方式的@RequestMapping写法
位置:方法上方。
@Controller
@RequestMapping("/student")
public class StudentController {
// 删除学生
@DeleteMapping("/{id}")
public String deleteStudent(@PathVariable("id") int id){
System.out.println("删除id为"+id+"的学生");
return "baizhan";
}
// 根据id查询学生
@GetMapping("/{id}")
public String findStudentById(@PathVariable int id){
System.out.println(id);
System.out.println("根据id查询学生");
return "baizhan";
}
// 新增学生
@PostMapping("/{id}")
public String addStudent(@PathVariable int id, Student student){
System.out.println(id);
System.out.println(student);
System.out.println("新增学生");
return "baizhan";
}
// 修改学生
@PutMapping("/{id}")
public String updateStudent(@PathVariable int id, Student student){
System.out.println(id);
System.out.println(student);
System.out.println("修改学生");
return "baizhan";
}
}
6. @ResponseBody
作用:方法返回的对象转换为JSON格式,并将JSON数据直接写入到输出流中,使用此注解后不会再经过视图解析器。使用该注解可
以处理Ajax请求。
位置:方法上方或方法返回值前
7. @RestController
如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转,可以使用@RestController代替@Controller,此时每个方
法上的@ResponseBody都可以省略。
8. @RequestBody
作用:将请求中JSON格式的参数转为JAVA对象
位置:写在方法参数前
@PostMapping("/addStudent2")
@ResponseBody
public Result addStudent2(@RequestBody Student student) {
System.out.println(student);
// 返回添加结果
Result result = new Result(true, "添加学生成功!");
return result;
}