Java Web 开发:JSON 基础 + @Test 测试 + Cookie/Session/ 请求处理

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 { @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的工作流程

    1. 首次访问网站,浏览器发送请求;
    2. 服务器生成Cookie信息,通过Set-Cookie响应头返回;
    3. 浏览器接收并返回Cookie;
    4. 再次访问该网站时,浏览器自动在请求头中携带Cookie;
    5. 服务器携带Cookie,识别用户身份/状态,返回对应内容;
    6. 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工作流程

    1. 创建Session:用户首次访问服务器是,服务器会生成一个唯一的SessionId,并在服务器端创建对应的Session数据存储;
    2. 传递SessionId:服务器通过Cookie将Session Id发送给客服端,客户端会将其保存在本地;
    3. 后序交互验证:用户再次访问服务器是,客户端会自动携带Cookie中的SessionId,服务器通过这个SessionId找到对应的Session数据,确认用户身份和上下文,提供个性化服务;
    4. 销毁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; }

    Read more

    llama.cpp量化模型部署实战:从模型转换到API服务

    1. 为什么你需要关注llama.cpp:让大模型在普通电脑上跑起来 如果你对AI大模型感兴趣,肯定听说过动辄需要几十GB显存的“庞然大物”。想在自己的电脑上跑一个7B参数的模型,以前可能得配一张昂贵的专业显卡。但现在,情况不一样了。我今天要跟你聊的 llama.cpp,就是那个能让大模型“瘦身”并飞入寻常百姓家的神奇工具。 简单来说,llama.cpp是一个用C/C++编写的开源项目,它的核心目标只有一个:用最高效的方式,在消费级硬件(比如你的笔记本电脑CPU)上运行大型语言模型。它不像PyTorch那样是个庞大的深度学习框架,它更像一个“推理引擎”,专注于把训练好的模型,以最小的资源消耗跑起来。 我刚开始接触大模型部署时,也被各种复杂的依赖和巨大的资源需求劝退过。直到用了llama.cpp,我才发现,原来在我的MacBook Pro上,也能流畅地和Llama 2这样的模型对话。这背后的功臣,主要就是两点:纯C/C++实现带来的极致性能,以及模型量化技术带来的体积与速度革命。量化这个词听起来有点技术,你可以把它想象成给模型“压缩图片”

    nao机器人比赛高尔夫和接力

    三、NAO机器人指令操作 3.1 几大常用模块介绍 模块名称中文翻译方法ALproxy初始化代理ALProxy("模块名称", "<机器人的IP地址>", 9559)ALMotion运动模块唤醒、休息、设置刚度、设置角度、获取刚度ALRobotPosture姿势模块goToPostureALPhotoCapture相机模块getCameraID()、setResolution(分辨率)、setPictureFormat("jpg")、takePictures(拍摄数量, 文件夹, 文件名)ALTextToSpeech说话模块say()ALMemory内存模块subscribeToEvent()订阅事件ALSpeechRecognition语音识别模块setVocabulary()设置可识别字典,subscribe()订阅事件 3.2 NAO机器人的启动与休息 说明:  机器人的运动都是通过代码控制,你知道什么代码执行什么功能就行了 导入端口模块:    from naoqi import ALProxy 完整测试程序:  # -*-

    AutoGen Studio虚拟现实:AI生成3D场景作品集

    AutoGen Studio虚拟现实:AI生成3D场景作品集 1. 引言 想象一下,你只需要用简单的文字描述,就能在几分钟内生成一个完整的虚拟现实场景。不需要学习复杂的3D建模软件,不需要掌握专业的光照设置技巧,甚至不需要了解材质贴图的技术细节。这就是AutoGen Studio在虚拟现实领域带来的革命性体验。 今天我们将深入探索这个令人惊叹的技术成果,看看AI如何将文字描述转化为沉浸式的3D虚拟场景。从梦幻的森林秘境到未来的科幻都市,从温馨的家庭场景到宏大的历史遗迹,我们将展示一系列由AI生成的3D场景作品,让你亲眼见证这项技术的强大能力。 2. 技术核心:智能场景生成的三大支柱 2.1 自然语言理解与场景解析 AutoGen Studio的核心能力在于其强大的自然语言处理技术。当你输入"一个阳光明媚的海滩,有棕榈树和蓝色海浪"时,系统能够准确理解每个元素的空间关系、材质属性和环境氛围。 系统会分析文本中的关键词,识别出主要物体(棕榈树、海浪)、环境条件(阳光明媚)和视觉特征(蓝色)。这种深度理解确保了生成的场景不仅包含正确的元素,还能准确传达描述中的情感和氛围。

    立创开源智能家居键盘SmartKB32_v2:基于ESP32-S3的蓝牙/有线双模多功能控制器设计详解

    立创开源智能家居键盘SmartKB32_v2:基于ESP32-S3的蓝牙/有线双模多功能控制器设计详解 最近在做一个智能家居控制的项目,发现市面上的键盘要么功能太单一,要么自定义程度不够。比如很多客制化键盘虽然有旋钮,但基本只能调音量,而且旋钮都在右边,用起来不太顺手。于是我就琢磨着,能不能自己做一把既能当键盘用,又能控制智能设备,还能根据不同的软件切换快捷键的“全能型”键盘? 这就是今天要跟大家分享的 SmartKB32_v2。它基于性能强劲的ESP32-S3芯片,不仅支持蓝牙和有线双模连接,还内置了Web服务器,可以通过网页随时修改按键功能。更酷的是,它左侧集成了一个带屏幕和力反馈的智能旋钮,配合SD卡存储的“映射表”,可以一键切换成设计师模式、游戏模式或者智能家居控制模式。 无论你是想复刻这个项目的创客,还是对ESP32-S3开发、HID设备(键盘鼠标这类人机交互设备)设计感兴趣的工程师,这篇文章都会带你从硬件到软件,把它的设计思路和实现方法讲清楚。 1. 项目核心功能与设计思路 1.1 为什么要做这样一把键盘? 很多朋友可能和我有一样的痛点:用不同的设计软件(比如