目录
[一.什么是Spring Web MVC ?](#一.什么是Spring Web MVC ?)
[二.什么是Spring MVC ?](#二.什么是Spring MVC ?)
[2.1 MVC定义:](#2.1 MVC定义:)
[2.2 Spring MVC 主要关注有两个点:](#2.2 Spring MVC 主要关注有两个点:)
[三.学习Spring MVC](#三.学习Spring MVC)
[3.1学习Spring MVC的重点:](#3.1学习Spring MVC的重点:)
[3.2 建立连接:](#3.2 建立连接:)
[3.3 请求:](#3.3 请求:)
[3.3.1 传递单/多个参数](#3.3.1 传递单/多个参数)
[3.3.2 传递对象](#3.3.2 传递对象)
[3.3.3 传递数组](#3.3.3 传递数组)
[3.3.3 传递集合](#3.3.3 传递集合)
[3.3.4 传递JSON数据](#3.3.4 传递JSON数据)
[3.3.5 获取URL中参数@PathVariable](#3.3.5 获取URL中参数@PathVariable)
[3.3.7 获取Cookie/Session](#3.3.7 获取Cookie/Session)
[3.4.2 返回数据@ResponseBody](#3.4.2 返回数据@ResponseBody)
[3.4.3 返回JSON](#3.4.3 返回JSON)
[3.4.4 设置状态码](#3.4.4 设置状态码)
[3.4.5 设置Header (了解)](#3.4.5 设置Header (了解))
一.什么是Spring Web MVC ?
Spring Web MVC是基于Servlet API构建的原始Web框架(简单来说 Spring Web MVC是一个Web框架 )------ 简称:Spring MVC
二.什么是Spring MVC ?
2.1 MVC定义:
Mvc是 Model View Controller 的缩写,分为三基本部分:(控制器 模型 视图****)****
MVC可以说是一种思想,而Spring实现了这个思想称为Spring MVC
MVC的设计模式(图一):
图1
2.2 Spring MVC 主要关注有两个点:
- MVC
- Web框架
Spring MVC 全称是 Spring Web MVC
总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架
Spring MVC设计模式(图二 )
图二
三.学习Spring MVC
3.1学习Spring MVC的重点:
如何通过浏览器和用户程序进行交互
重点主要分为三方面:
- 建立连接:将用户 (浏览器)和Java程序连接起来,通过访问地址能调用Spring程序
- 请求:Spring程序接收请求,获取参数的功能
- 响应:执行完业务逻辑后,把执行后的结果返回给用户,就是响应
3.2 建立连接:
通过 @RequestMapping 来实现URL路由映射, 浏览器连接程序的关键
@RequestMapping 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径.
javaimport org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.Arrays; import java.util.List; @RestController public class RequestController{ @RequestMapping("/r1") public String r1(){ return "hello"; } }
⽅法名和路径名称⽆需⼀致
访问: http://127.0.0.1:8080/r1 可以查看程序返回的数据
javaimport org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.Arrays; import java.util.List; @RequestMapping("/calc") @RestController public class RequestController{ @RequestMapping("/r1") public String r1(){ return "hello"; } }
访问: http://127.0.0.1:8080/calc/r1 可以查看程序返回的数据
@RequsetMapping 即支持Get请求,又支持Post请求(也支持其他请求)
3.3 请求:
访问不同的路径,就是发送不同的请求, 发送请求时,可能需要传递参数。
所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收
3.3.1 传递单/多个参数
java@RequestMapping("/r4") public String r4(Integer id ,String name){ return "接收参数 id:"+id+" name: "+name; } @RequestMapping("/r9") public String r9(String name){ return "接收参数:"+name; }
无论单个参数还是多个参数 双方名称必须一致
3.3.2 传递对象
java@RequestMapping( "/r3") public String r3(@RequestParam Student student){ return "接收参数:"+student; } //@RequestParam 必须传参
3.3.3 传递数组
Spring MVC可以自动绑定数组参数的赋值
java@RequestMapping("/r2") public String r2(String [] name){ return Arrays.toString(name); }
3.3.3 传递集合
跟传递数组基本差不多3.3.4
java@RequestMapping("/r6") //@RequestParam 必传参数 public String r6(@RequestParam List<String> list){ return "接收参数 list::"+list; }
3.3.4 传递JSON数据
JSON: JavaScript Object Notation 的缩写
JSON :本质是字符串,却有自己的风格和语法,使⽤⽂本表⽰⼀个对象或数组的信息
java//RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中 @RequestMapping("/r10") public String r9(@RequestBody Student student){ return "接收参数:"+student.toString(); }
JSON字符串和JAVA对象互转 :
readValue:把JSON字符串转成对象
writeValueAsString:把对象转为JSON字符串
javapublic class JsonText { public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String json ="{\"id\":10,\"name\":\"niha\",\"age\":5}"; //JSON字符串转对象 Student student = objectMapper.readValue(json, Student.class); System.out.println(student); //对象转字符串 String s =objectMapper.writeValueAsString(student); System.out.println(s); } }
JSON优点:
1.简单易用:语法简单,易于理解和编写,可以快速地进行数据交换
2. 跨平台支持:JSON可以被多种编程语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输
3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用带宽较小,可以提高数据传输速度
4.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
5.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性
3.3.5 获取URL中参数@PathVariable
1.如果方法参数名称和需要绑定的URL中的变量名称一致时,可以简写,不用给@PathVariable的 属性赋值
2.如果方法参数名称和需要绑定的URL中的变量名称不一致时,需要@PathVariable的属性value赋值,
3.3.6上传⽂件@RequestPart
java
/*
* 上传文件
* @RequestParam("File")重命名
* */
@RequestMapping("/r8")
public String r8(@RequestPart("File") MultipartFile jpgFile){
String originalFilename = jpgFile.getOriginalFilename();
return "接收到文件名称::"+originalFilename;
}
3.3.7 获取Cookie/Session
首先要知道HTTP属于 "无状态" 协议
无状态的含义指:HTTP协议下的客户端和服务器的这次连接,与下次通信没有直接连接
HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是SpringMVC方法的内置对象.需要时直接在方法中添加声明即可.
HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息.
HttpServletResponse 对象代表服务器的响应.HTTP响应的信息都在这个对象中,比如向客户
端发送的数据,响应头,状态码等.通过这个对象提供的方法,可以获得服务器响应的所有内容
获取Session:
java//设置session @RequestMapping("/setSess") public String setSession(HttpServletRequest request ){ //从cookie中获取SessionId,根据sessionId获取session对象,如果没有获取到,会创建一个session对象 HttpSession session = request.getSession(); session.setAttribute("name","zhangsan"); return "设置session成功"; } /* 获取session方法一 * */ @RequestMapping("/getSess") public String getSession(HttpServletRequest request ){ HttpSession session = request.getSession(); String name =(String) session.getAttribute("name"); return "从session获取name:"+name; } /* 获取session方法二 HttpSession:封装获取sesionId方法 * */ @RequestMapping("/getSess2") public String getSession2(HttpSession session ){ String name =(String) session.getAttribute("name"); return "从session获取name:"+name; } /* 获取session方法三 注解@SessionAttribute:把获取sessionId和session对象全部封装在一起了 * */ @RequestMapping("/getSess3") public String getSession3(@SessionAttribute String name){ return "从session获取name:"+name; }
获取Cookie :
javaimport jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import org.springframework.web.bind.annotation.*; import java.util.Arrays; @RestController @RequestMapping("/session") public class SessionController { @RequestMapping("/getCk") /* 获取cookie方法一 * */ public String getCookie(HttpServletRequest request, HttpServletResponse response){ String name = request.getParameter("name"); Cookie[] cookies = request.getCookies(); if(cookies != null){ Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName()+": "+ck.getValue())); } return "获取cookie"; } @RequestMapping("/getCk2") /* 获取cookie方法二 * */ public String getCookie(@CookieValue("cookie") String cookie){ return "获取cookie: "+cookie; } }
获取header:
java/* * 获取header信息 * */ @RequestMapping("/getheader") public String getHeader(@RequestHeader("User-Agent") String UserAgent){ return "从header中获取信息:"+UserAgent; }
3.4响应
在我们前面的代码例子中,都已经设置了响应数据,Http响应结果可以是数据,也可以是静态页面,也可以针对响应设置状态码,Header信息等
3.4.1返回静态界面:
创建前端⻚⾯calc.html(注意路径)
- @Controlller:返回视图
- @ResponseBody:返回数据
- @RestController = @Controlller + @ResponseBody
随着前后端分离,后端不需要处理页面,只需要返回页面所需要的数据
想要返回视图 ,我们需要把@Restcontroller改为@Controller
3.4.2 返回数据@ResponseBody
3.4.3 返回JSON
java/* * 返回JSON * */ @RequestMapping("/returnJson") @ResponseBody public HashMap<String,String> returnJosn(){ HashMap<String, String> map = new HashMap<>(); map.put("Java", "Java Value"); map.put("MySQL", "MySQL Value"); map.put("Redis", "Redis Value"); return map; }
3.4.4 设置状态码
SpringMVC会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码
通过SpringMVC的内置对象HttpServletResponse提供的方法来进行设置
java/* * 设置状态码 * */ @RequestMapping(value = "/setStatus") @ResponseBody public String setStatus(HttpServletResponse response){ response.setStatus(401); return "设置状态码成功 "; }
3.4.5 设置Header (了解)
Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
1️⃣.设置Content-Type
java@RequestMapping(value = "/returnJson2",produces = "application/json") @ResponseBody public String returnJson2() { return "{\"success\":true}"; }