目录
一.什么是Spring Web MVC ?
二.什么是Spring MVC ?
2.1 MVC定义:
2.2 Spring MVC 主要关注有两个点:
三.学习Spring MVC
3.1学习Spring MVC的重点:
3.2 建立连接:
3.3 请求:
3.3.1 传递单/多个参数
3.3.2 传递对象
3.3.3 传递数组
3.3.3 传递集合
3.3.4 传递JSON数据
3.3.5 获取URL中参数@PathVariable
3.3.6上传⽂件@RequestPart
3.3.7 获取Cookie/Session
3.4响应
3.4.1返回静态界面:
3.4.2 返回数据@ResponseBody
3.4.3 返回JSON
3.4.4 设置状态码
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 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅法路径.import 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 可以查看程序返回的数据
import 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 请求:
访问不同的路径,就是发送不同的请求, 发送请求时,可能需要传递参数。
3.3.1 传递单/多个参数
@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 传递对象
@RequestMapping( "/r3")public String r3(@RequestParam Student student){return "接收参数:"+student;}//@RequestParam 必须传参
3.3.3 传递数组
Spring MVC可以自动绑定数组参数的赋值
@RequestMapping("/r2")public String r2(String [] name){return Arrays.toString(name);}
3.3.3 传递集合
跟传递数组基本差不多3.3.4
@RequestMapping("/r6")//@RequestParam 必传参数public String r6(@RequestParam List<String> list){return "接收参数 list::"+list;}
3.3.4 传递JSON数据
JSON: JavaScript Object Notation 的缩写
JSON :本质是字符串,却有自己的风格和语法,使⽤⽂本表⽰⼀个对象或数组的信息
//RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中 @RequestMapping("/r10")public String r9(@RequestBody Student student){return "接收参数:"+student.toString();}
JSON字符串和JAVA对象互转 :
readValue:把JSON字符串转成对象
writeValueAsString:把对象转为JSON字符串
public 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
/** 上传文件* @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:
//设置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 :
import 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:
/** 获取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
/** 返回JSON* */@RequestMapping("/returnJson")@ResponseBodypublic 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提供的方法来进行设置/** 设置状态码* */@RequestMapping(value = "/setStatus")@ResponseBodypublic String setStatus(HttpServletResponse response){response.setStatus(401);return "设置状态码成功 ";}
3.4.5 设置Header (了解)
Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现
1️⃣.设置Content-Type@RequestMapping(value = "/returnJson2",produces = "application/json")@ResponseBodypublic String returnJson2() {return "{\"success\":true}";}