Java Web 开发:JSON 基础 + @Test 测试 + Cookie/Session/ 请求处理
个人主页:♡喜欢做梦
欢迎 👍点赞 ➕关注 ❤️收藏 💬评论
目录
编辑
🍍JSON的概念
🍐概念
🍐@Test注解
🍑什么是@Test?
🍑与JSON关联
🍑@Test标记的方法与main方法的区别
🍍JSON语法
🍐核心数据类型
🍐常见使用
🍑对象
🍑数组
🍑JSON字符串和Java对象的互转
🍑传递JSON
🍑获取URL中的参数
🍑上传文件:@RequestPart
🍍Cookie和Seeion
🍐Cookie
🍑什么是Cookie?
🍑Cookie的获取
🍐Session
🍑什么是Session?
🍐Cookie和Session之间的关系
🍑Session的存储
🍑Session的获取
🍍获取header
🍍JSON的概念
🍐概念
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。他基于JavaScript的一个子集,但采用了独立语言的文本格式,几乎所有编程都有支持Json的库。
🍐@Test注解
🍑什么是@Test?
@Test是单元测试注解,用于标记“测试方法”,让框架自动执行该方法一验证代码逻辑。
🍑与JSON关联
- 测试JSON序列化/反序列化是否正常;
- 测试从JSON文件读取数据的功能是否正常。
public class JsonTest {@Testvoid test1(){System.out.println(111);}@Testvoid test2(){System.out.println(222);}
}

可以单个窗口执行,也可以多个窗口同时执行。
🍑@Test标记的方法与main方法的区别
| 对比 | @Test标记的测试方法 | main方法 |
| 作用 | 验证代码功能 | 程序入口,启动并指向核心业务逻辑 |
| 调用 | 由测试框架自动调用 | 由JVM自动调用(程序启动时) |
| 定义规范 | 必须是无参数void | 必须是public static void main(String[] args) |
| 独立性 | 每个测试方法应独立,不依赖执行顺序 | 代码逻辑顺序执行,依赖前后逻辑 |
| 场景 | 用于开发的测试验证 | 用于程序的实际运行 |
🍍JSON语法
🍐核心数据类型
| 类型 | 说明 |
| 对象(Object) | 无序的键值对集合,用{}包裹;键必须是双引号包裹的字符串,只为任意Json类型 |
| 数组(Array) | 有序的值列表,用[]包裹;值可以是任意Json类型,且允许不同类型混合 |
| 字符串(String) | 必须双引号包裹(不能用单引号),支持转移字符 |
| 数组(Number) | 支持整数、浮点数、负数、不支持NaN、Infinity;可省略小数点前/后数字 |
| 布尔值(Boolean) | 仅两个固定值:true或fals心数据类型e |
| 空值(Null) | 仅一个固定值:null,表示“无数据” |
语法规则
- JSON的两个结构:JSON的结构只能是对象或者组,不能直接是字符串、数字等单个值;
- 键值必须是双引号,不能是单引号;
- 逗号分隔且无尾逗号:对象的键值对、数组的元素之间用逗号分隔,但是最后一个元素不能加逗号;
- JSON不支持注释;
- 大小写敏感。
🍐常见使用
🍑对象
{"name": "张三","age": 30,"isStudent": false,"hobbies": ["篮球", "编程"],"address": {"city": "上海","street": "XX路"},"score": null
}
🍑数组
[{"id": 1,"name": "苹果","price": 5.99
},
{"id": 2,"name": "香蕉","price": 3.5
},
{"id": 3,"name": "橙子","price": 4.2
}]
也可以压缩表示
{"name":"张三","age":30,"isStudent":false,"hobbies":["篮球","编程"],"address":{"city":"上海","street":"XX路"},"score":null}
[{"id":1,"name":"苹果","price":5.99},{"id":2,"name":"香蕉","price":3.5},{"id":3,"name":"橙子","price":4.2}]
🍑JSON字符串和Java对象的互转
UserInfo类
public class UserInfo {private String name;private int age;public UserInfo(){}public UserInfo(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "UserInfo{" +"name='" + name + '\'' +", age=" + age +'}';}
}
对象转JSON字符串
@Test
void test3() throws JsonProcessingException {//创建ObjectMapperObjectMapper objectMapper=new ObjectMapper();//构建UserInfo对象UserInfo userInfo=new UserInfo("小熊",3);//对象转JsonString s=objectMapper.writeValueAsString(userInfo);System.out.println(s);//{"name":"小熊","age":3}}
- throws JsonProcessingException:声明异常,因为objectMapper.writeValueAsString()可能抛出异常(序列化失败)
- objectMapper:负责JSON的序列化(对象->JSON)和反序列化(JSON->对象),用于序列化操作
- objectMapper.writeValueAsString():用于对象转JSON字符串。
@Testvoid test4() throws JsonProcessingException {//创建ObjectMapperObjectMapper objectMapper=new ObjectMapper();//定义一个字符串String s="{\"name\":\"小熊\",\"age\":3}";//Json转对象UserInfo userInfo=objectMapper.readValue(s, UserInfo.class);System.out.println(userInfo);//UserInfo{name='小熊', age=3}}
- objectMapper.readValue():用于JSON转对象
- UserInfo.class:表示要转换的目标类
JSON的优点
- 简洁易读,语法简单直观;
- 跨语言兼容,几乎所有编程语言都支持;
- 轻量高效,传输和解析速度快;
- 与JavaScript无缝集成,适合Web开发;
- 结构化能力强,可灵活表示复杂数据,且易于扩展,安全性较高。
🍑传递JSON
接收JSON对象,需要用到@RequestBody注解
@RequestBody:@RequestBody就是“桥梁”,把前端请求体里面的JSON数据,自动变成你能用的JSON对象,如果没有@RequestBody,那么就无法接收到数据。

🍑获取URL中的参数
获取URL中的参数,需要使用@PathVariable注解
@PathVariable(路径变量)
- 语法:{变量名}表示url的动态部分;
- 作用:在一个url下可以进行多种类似的请求
@RequestMapping("/11/{id}/{name}")public String method10(@PathVariable("id") Integer id,@PathVariable("name") String name){return "获取文章id:"+id+" 获取文章name:"+name;}

- @PathVariable("userid")中的useid参数:指定要绑定的路径变量名称,可写可不写
- @PathVariable("userid")中指定的名称需要与url模版中的{userid}一致
🍑上传文件:@RequestPart
@RequestPart:用于接收multipart/from-data类型请求中的文件或复杂对象的文件,常用于文件上传场景
@RequestMapping("/13")public String method13(@RequestPart("file")MultipartFile file) throws IOException {//获取文件名称String filename= file.getOriginalFilename();System.out.println(filename);//创建文件对象File file1=new File("D:/.temp/" + file.getOriginalFilename());//文件上传file.transferTo(file1);return "文件上传成功";}
- MultipartFile:文件上传处理接口;
- 使用/:是windows系统下的路径格式,通用的路径分隔符
此路径下没有文件


文件上传后的结果:

🍍Cookie和Seeion
🍐Cookie
🍑什么是Cookie?
Cookie是Web服务器保存在用户浏览器上的小型文本文件。
Cookie的工作流程
- 首次访问网站,浏览器发送请求;
- 服务器生成Cookie信息,通过Set-Cookie响应头返回;
- 浏览器接收并返回Cookie;
- 再次访问该网站时,浏览器自动在请求头中携带Cookie;
- 服务器携带Cookie,识别用户身份/状态,返回对应内容;
- Cookie过期或被清除。
就好像,你第一次去超市买东西,办了一张卡,这张卡里面记录着你的积分和消费信息,随后放进钱包保存起来,你第二去该超市买东西结账的时候,直接出示卡,就可以。收银员刷卡,就可以看到你的相关消费信息。会员卡到期了就无法使用或者失效。
🍑Cookie的获取
//传统写法
@RequestMapping("/14")public String method14(HttpServletRequest request){//获取Cookie信息Cookie[] cookies=request.getCookies();//打印Cookie信息if(cookies!=null){for (Cookie cookie:cookies) {System.out.println(cookie.getName()+":"+cookie.getValue());}}return "获取Cookie成功";}//简洁写法@RequestMapping("/15")public String method15(@CookieValue("username") String name){return "name"+name;}
- HttpServletRequest:表示客户端发给服务器的HTTP请求。
既然有请求就有响应。
- HttpServletResponse: 表示服务器给客户端返回的http响应




🍐Session
🍑什么是Session?
Session是指计算网络中,客户端与服务器之间为完成特定交互(登入、购物)而建立的临时、有状态的连接或数据存储机制,核心作用是在状态的http下,保护用户的身份信息和操作上下文。
Session工作流程
- 创建Session:用户首次访问服务器是,服务器会生成一个唯一的SessionId,并在服务器端创建对应的Session数据存储;
- 传递SessionId:服务器通过Cookie将Session Id发送给客服端,客户端会将其保存在本地;
- 后序交互验证:用户再次访问服务器是,客户端会自动携带Cookie中的SessionId,服务器通过这个SessionId找到对应的Session数据,确认用户身份和上下文,提供个性化服务;
- 销毁Session:当用户主动退出登入,Session超时或服务器重新启动,数据就会被删除。
就好像,你(客户端)去一家酒店吃饭,让服务员点菜或者扫码点菜,就会生成一份属于自己的菜单(session数据),服务员可以根据你的取餐码(sessionId),知道你点的有哪些东西。
🍐Cookie和Session之间的关系
| Cookie | Session | |
| 存储位置 | 浏览器(客户端)存的“小纸条” | 服务器(服务端)存“用户档案” |
| 核心作用 | 传递SessionId | 存用户会话“信息” |
| 依赖关系 | Session通常靠Cookie传ID实现 | Cookie常作为Session的“身份证” |
| 典型场景 | 记录登记状态(传SessionId) | 存用户购物,登录信息 |
🍑Session的存储
@RequestMapping("/16")public String method16(HttpServletRequest request){//获取Session对象:从cookie中获取SessionId,在根据SessionId获取session对象HttpSession session=request.getSession();//往Session里面存储数据session.setAttribute("name","lisi");session.setAttribute("age","11");return "存储Session成功";}

🍑Session的获取
//写法1:
@RequestMapping("/17")public String method17(HttpServletRequest request){//回去Session对象,但不自动创建(如果客户端没有有效的Session,返回null)HttpSession session=request.getSession(false);if(session==null){return "用户未登入";}else {//获取Session对象:将Object类型强制转换为String//getAttribute:根据键名获取对应的值String username=(String) session.getAttribute("name");String userage=(String) session.getAttribute("age");return "用户名:"+username+" 年龄:"+userage;}}
//写法2:@RequestMapping("/18")//HttpSession:当前用户的会话对象public String method18(HttpSession session){String username=(String) session.getAttribute("name");String userage=(String) session.getAttribute("age");return "用户名:"+username+" 年龄:"+userage;}
//写法3:
@RequestMapping("/19")public String method19(@SessionAttribute("name") String name,@SessionAttribute("age") String age){return "用户名:"+name+" 年龄:"+age;}


🍍获取header
header(请求头/响应头):通信双方传递的“额外说明信息”,就像点外卖上面的备注。
//获取header//写法1:@RequestMapping("/20")public String method20(HttpServletRequest request){String agent=request.getHeader("User-Agent");return "agent:"+agent;}//写法2:@RequestMapping("/21")public String method21(@RequestHeader("User-Agent") String agent){return "agent:"+agent;}




