文章目录:
一、什么是 Spring MVC?
1.Spring MVC 功能
Spring MVC是一种Web框架,从一开始就包含在 Spring 框架中,它是基于 Servlet API构建的,
它提供了一种基于模型-视图-控制器(MVC)的Web开发模型。 Spring MVC的核心是DispatcherServlet,它负责接收HTTP请求,将请求分发给相应的控制器,并将控制器的结果返回给客户端。
Spring MVC的控制器
是一个Java类,它负责处理HTTP请求并返回响应。控制器通常包含一个方法,该方法将HTTP请求映射到相应的视图。视图
是一种用于呈现数据的模板,它可以是HTML、JSON、XML等格式。
2.MVC 相关定义
MVC 是一种思想,而Spring MVC 是对 MVC 思想的具体实现。
MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分
- Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图) 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器) 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
二、Spring MVC 常用注解
前提:在 Spring Boot 项目基础上引入 Spring Web 依赖。
1. @RequestMapping
功能:
是用来注册接口的路由映射的
路由映射:所谓的路由映射指的是,
当用户访问一个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射
。
@RequestMapping 常用参数:
- value: 指定 URL 请求的实际地址
- method: 指定请求的 method 类型, 例如GET、POST、PUT等,
以下代码设置了路由
和请求类型
:
@RestController @RestController=@Controller+@ResponseBody
@ResponseBody //定义返回的数据格式为非视图(text/html)。
public class UserController {
@RequestMapping(value = "/sayhi",method = RequestMethod.POST) //post请求才能访问
public String sayHi(){
return "hi spring mvc";
}
}
2. @GetMapping 和 @PostMapping
“另一种设置请求类型的写法”
@RestController
@ResponseBody //定义返回的数据格式为非视图(text/html)。
public class UserController {
@PostMapping("/sayhello") //请求类型为 POST
public String sayhello(){
return "hello spring mvc";
}
@GetMapping("/hi") //请求类型为 GET
public String hi(){
return "spring mvc hi";
}
}
3. 传递单个或多个参数
请求路径
:http://localhost:8080/sayhi?name=zhangsan
//传一个或多个参数
@RequestMapping("/sayhi")
public String sayHi(String name){ //传递单个参数
return "hi "+name; //如果传递的不带参数的话,返回的是 null
}
4. 传递参数为对象
首先要在后端定义一个 Java 类,比如 UserInfo 实体类
import lombok.Data;
@Data
public class Userinfo {
private int id;
private String name;
private String password;
private int age;
}
请求路径
: http://localhost:8080/reg?name=zhangsan&password=123
@RequestMapping("/reg")
public Object reg(Userinfo userinfo){
System.out.println(userinfo);
return userinfo;
}
@RequestParam 后端参数重命名 及 设置参数是否必传
某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个username 给后端,而后端又是有 name 字段来接收的,这样就会出现参数接收不到的情况,
如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。
例如:
请求路径:
127.0.0.1:8080/reg?username=zhangsan&password=123
@RequestMapping("/reg")
//对参数进行重命名 (前端传username)
//required=false -> 表示username 为非必传参数
public Object reg(@RequestParam(value = "username",required = false) String name,String password){
return name+": "+password;
}
5. 传递参数为 JSON 对象 (参数前加@RequestBody注解 )
@RequestMapping("/reg3")
public Object reg3(@RequestBody Userinfo userinfo){
return userinfo;
}
6. 获取URL中参数 (?之前的参数) (@PathVariable)
请求路径:
127.0.0.1:8080/reg4/{zhangsan}/{123}
// 从基础 URL 中获取参数 ?之前的参数 (不是从 URL 参数中获取)
@RequestMapping("/reg4/{name}/{pwd}")
public Object reg4(@PathVariable String name,@PathVariable("pwd") String password){
return "name->"+name+" | password->"+password;
}
7. 上传文件 @RequestPart
@RequestMapping("/myupload")
public Object upload(@RequestPart("img")MultipartFile file) {
String fileName= UUID.randomUUID()+ //文件名
file.getOriginalFilename().substring( //文件后缀
file.getOriginalFilename().lastIndexOf("."));
File saveFile=new File("E:\\Java\\TestFile\\"+fileName);
try {
file.transferTo(saveFile);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
8. 获取Cookie、Session、header
8.1 获取Cookie @CookieValue
// 获取cookie
@RequestMapping("/getck")
public Object getCk(@CookieValue(value = "java",required = false) String java){
return java;
}
8.2 获取 Header 中的某个信息 @RequestHeader
// 获取 Header 中的某个信息
@RequestMapping("/gethd")
public Object getHeader(@RequestHeader("User-Agent")String ua){
return "header->"+ua;
}
8.3 Session 的存储和获取
获取 Session
// 获取 session
private static final String SESSION_KEY="USERINFO_SESSION_KEY";
@RequestMapping("/getsession")
public Object getSession(@SessionAttribute(SESSION_KEY)String name){
return "session -> "+name;
}
存储 Session
//存储 session
private static final String SESSION_KEY="USERINFO_SESSION_KEY";
@RequestMapping("/setsession")
public void doPostConstruct(HttpServletRequest request){
HttpSession session=request.getSession();
session.setAttribute(SESSION_KEY,"zhangsan");
}
9. 请求转发 和 请求重定向 (forward VS redirect)
后端给前端返回(return)不但可以返回一个视图,还可以实现跳转
,跳转的方式有两种:
- forward 请求转发;
- redirect:请求重定向。
//请求转发
@RequestMapping("/fw")
public Object fw(){
return "forward:/index.html";
}
//请求重定向
@RequestMapping("/rd")
public Object rd(){
return "redirect:/index.html";
forward 和 redirect 具体区别:
- 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
- 请求重定向地址发生变化,请求转发地址不发⽣变化。
- 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问