首页 > 前端开发 > 最新文章

Java Web 开发:JSON 基础 + @Test 测试 + Cookie

CSDN博客 2026-05-13 08:04:17 人看过


JSON的概念

 概念

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。他基于JavaScript的一个子集,但采用了独立语言的文本格式,几乎所有编程都有支持Json的库。

 @Test注解

什么是@Test?

@Test是单元测试注解,用于标记“测试方法”,让框架自动执行该方法一验证代码逻辑。

与JSON关联

测试JSON序列化/反序列化是否正常;

测试从JSON文件读取数据的功能是否正常。

public class JsonTest {    @Test    void test1(){        System.out.println(111);    }    @Test    void 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;    }    @Override    public String toString() {        return "UserInfo{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    } }

对象转JSON字符串

@Test void test3() throws JsonProcessingException {        //创建ObjectMapper        ObjectMapper objectMapper=new ObjectMapper();        //构建UserInfo对象        UserInfo userInfo=new UserInfo("小熊",3);        //对象转Json        String s=objectMapper.writeValueAsString(userInfo);        System.out.println(s);//{"name":"小熊","age":3}    }

 throws JsonProcessingException:声明异常,因为objectMapper.writeValueAsString()可能抛出异常(序列化失败)

objectMapper:负责JSON的序列化(对象->JSON)和反序列化(JSON->对象),用于序列化操作

objectMapper.writeValueAsString():用于对象转JSON字符串。

@Test    void test4() throws JsonProcessingException {        //创建ObjectMapper        ObjectMapper 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之间的关系



CookieSession
存储位置浏览器(客户端)存的“小纸条”服务器(服务端)存“用户档案”
核心作用传递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;    }

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章