目录
1.什么是Spring Web MVC
官⽅对于 Spring MVC 的描述是这样的
翻译为中⽂:
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架 ,从⼀开始就包含在 Spring 框架中。 它的正式名称“ Spring Web MVC”来⾃其源模块的名称(Spring-webmvc) ,但它通常被称为Spring MVC).
从上述定义我们可以得出⼀个信息:
Spring Web MVC 是⼀个 Web 框架. 下⾯咱们简称之为: Spring MVC
MVC定义
MVC 是 Model View Controller 的缩写 ,它是软件⼯程中的⼀种软件架构设计模式 ,它把软件系统分 为模型、视图和控制器三个基本部分
• View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互 ,展⽰数据的资源.
• Model(模型) 是应⽤程序的主体部分 ,⽤来处理程序中数据逻辑的部分.
• Controller(控制器)可以理解为⼀个分发器 ,⽤来决定对于视图发来的请求 ,需要⽤哪⼀个模型来处理 ,以及处理完后需要跳回到哪⼀个视图。即 ⽤来连接视图和模型
2.学习Spring MVC
既然是 Web 框架, 那么当⽤⼾在浏览器中输⼊了 url 之后 ,我们的 Spring MVC 项⽬就可以感知到⽤⼾的请求, 并给予响应.
咱们学习Spring MVC, 重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个⽅⾯:
1. 建⽴连接:将⽤⼾ (浏览器)和 Java 程序连接起来 ,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。
2. 请求: ⽤⼾请求的时候会带⼀些参数 ,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数 的功能.
3. 响应: 执⾏了业务逻辑之后 ,要把程序执⾏的结果返回给⽤⼾ , 也就是响应.
建立连接
在 Spring MVC 中使⽤@RequestMapping来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤
创建⼀个 UserController 类 ,实现⽤户通过浏览器和程序的交互 ,具体实现代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello")
public String sayHello(){
return "hello";
}
}
接下来访问:http://127.0.0.1:8080/Romised/sayHello 就可以看到程序返回的数据了
代码中为什么要加上@RestController?
因为没有这个注解的话@RequestMapping注解无法被扫描到,无法进行正确的路由映射,@RestController是 @Controller 和 @ResponseBody 的组合,@Controller 注解用于标识一个类是控制器类,用于处理 Web 请求并协调视图和模型之间的交互,@ResponseBody 注解的主要作用是指示方法的返回值直接作为 HTTP 响应体返回给客户端(返回的是数据)
@RequestMapping 注解介绍及使用
@RequestMapping是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀ ,它是⽤来注册接⼝的
路由映射的
收到请求时, 路径为/sayHello 的请求就会调⽤ sayHello这个⽅法的代码.
路由映射:
当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射.
@RequestMapping的使用:
@RequestMapping可修饰类也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径
@RequestMapping 是 GET 还是 POST 请求?
本身并不限定是 GET 还是 POST 请求。它主要是用于定义请求的路径映射,通过结合不同的 HTTP 方法(如 @GetMapping 对应 GET 请求,@PostMapping 对应 POST 请求等)来具体指定该映射路径所支持的请求方式。可以与多种 HTTP 方法配合来处理不同类型的请求。
@Controller
public class MyController {
@RequestMapping(value = "/Romised", method = RequestMethod.GET)
public String getMethod() {
return "result for GET";
}
@RequestMapping(value = "/Romised", method = RequestMethod.POST)
public String postMethod() {
return "result for POST";
}
}
Spring MVC 参数获取
1.获取单个参数
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello")
public String sayHello(String name){
return "hello!" + name;
}
}
获取单个参数
注意说明:
1.代码中声明的参数名与请求地址栏中的参数名要完全一致,若不一致则无法获取到地址栏中对应的参数值,获取的为参数的默认值。
2.如果想明确指定请求中的参数要绑定到方法的参数,可以在方法的参数前加上@RequestParam注解进行参数重命名操作
获取多个参数
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello")
public String sayHello(String name,String password){
return "name:" + name + " password:" + password;
}
}
获取多个参数注意说明:
1.进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证完全一致。
2.前后端进行参数匹配时,是以参数的名称进行匹配的,因此地址栏中的参数位置是不影响后端获取参数的结果
获取普通对象
创建实体类Person:
import lombok.Data;
@Data
public class Person {
private Integer id;
private String name;
}
获取Person:
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello")
public Person sayHello(Person person){
return person;
}
}
获取JSON对象
上述代码运行后获取JSON对象:发现获取不到JSON对象
在Spring MVC 中,提供了 @RequestBody
注解来实现接收 Json 对象的操作。代码如下:
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello")
public Person sayHello(@RequestBody Person person){
return person;
}
}
获取基础URL参数
代码示例:
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/sayHello/{name}/{password}")
public String sayHello(@PathVariable(value = "name") String name,@PathVariable String password){
return "name:" + name + " password:" + password ;
}
}
获取基础URL参数注意说明:
使用@PathVariable 进行参数匹配时,后端代码的参数名称要与地址栏中的参数名称要保证一致且其对应的参数值要对应。
获取上传文件
代码示例:注意@RequestPart中的文件名和上传的要一致
@RestController
@RequestMapping("/fileTest")
public class BlogController {
@RequestMapping("file")
public String file(@RequestPart("Kun") MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
file.transferTo(new File("D:/BlogTest/" + file.getOriginalFilename()));
return "success";
}
}
上传文件成功!
注意:在new File的时候不要把路径写死,这样就可以上传多个文件不会覆盖
获取Header
获取Header的操作代码:
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
return "userAgent:" + userAgent;
}
}
在地址栏输入URL后,使用FIddler进行抓包操作获取请求的相关信息和响应信息
注意:
使用@RequestHeader
注解进行获取Header中的参数操作,该注解里的参数的参数名要与Header里面的参数名要一致
获取Cookie
首先在Chrome浏览器中打开开发者工具设置Cookie
代码示例:
@RestController
@RequestMapping("/Romised")
public class BlogController {
@RequestMapping("/getCookie")
public String getCookie2(@CookieValue String kun,@CookieValue String romised){
return "cookie存取的值kun:"+kun+",romised:"+romised;
}
}
获取Session
获取Session的操作代码:
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("username","Romised");
return "success";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
HttpSession session = request.getSession(false);
if (session!=null){
String username = (String)session.getAttribute("username");
return "登录用户:"+username;
}
return "session 为空";
}
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute(required = false) String username){
return "username:"+username;
}
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){
String username = (String)session.getAttribute("username");
return "登录用户:"+username;
}
首先先设置session,然后可以通过三个方法获取session
总结
学习Spring MVC, 其实就是学习各种Web开发需要的注解
@RequestMapping: 路由映射
@RequestParam: 后端参数重命名
@RequestBody: 接收JSON类型的参数
@PathVariable: 接收路径参数
@RequestPart: 上传⽂件
@ResponseBody: 返回数据
@CookieValue: 从Cookie中获取值
@SessionAttribute: 从Session中获取值
@RequestHeader: 从Header中获取值
@Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回视图.
RestController: @ResponseBody + @Controller 返回数据
Cookie 和Session都是会话机制, Cookie是客户端机制, Session是服务端机制.二者通过SessionId 来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使⽤时, 直接在方法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使用HttpServletResponse设置Http响应状态码.