news 2026/6/17 5:42:59

WEB应用技术第六次作业

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WEB应用技术第六次作业

一、复现上课的案例: springboot的请求和响应

(一)请求

1.接收简单参数

定义simpleParam接口方法,形参=请求参数名

@GetMapping只接收GET请求,在GET请求Params标签里填写请求参数并赋值

@RequestMapping可以接收各种请求

  • 形参名和请求参数名一致
@GetMapping("/simpleParam") public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致 System.out.println(name+" : "+age); return "OK"; }

终端返回

  • 形参名和请求参数名不一致
    @GetMapping("/simpleParam1") public String simpleParam1(String username , Integer age ){//形参名和请求参数名不一致 System.out.println(username+" : "+age); return "OK"; }

  • 不一致时,通过@RequestParam注解完成映射,不返回null。该注解的required属性默认为true,请求参数必须有赋值
@GetMapping("/simpleParam1") public String simpleParam1(@RequestParam(name="name")String username , Integer age){//形参名和请求参数名不一致 System.out.println(username+" : "+age); return "OK"; }

2.实体参数:简单实体对象

简单参数只适用于请求参数个数少的情况(有几个请求参数,就需要定义几个形参),参数多需要用实体参数,即将所有请求参数封装到一个实体类中,并保证请求参数名与实体类的属性名保持一致

在com.example.chapter2.pojo包下创建User.java实体类,存在两种编写实现方式:

方案 1:引入 Lombok 注解简化开发
package com.example.chapter2.pojo; import lombok.*;@Data @NoArgsConstructor @AllArgsConstructor public class User { private String name; private Integer age; private Address address; }
  1. 前置条件:项目 pom.xml 文件导入 lombok 依赖,IDE 安装 Lombok 插件,否则注解失效爆红;
  2. 核心注解及作用:
    • @Data自动生成全部属性的 get/set 方法、toString ()、equals ()、hashCode (),替代手动编写存取方法;
    • @NoArgsConstructor:自动生成无参构造方法,Spring 反射实例化实体对象必须依赖
    • @AllArgsConstructor:自动生成包含全部属性的全参构造方法,用于手动创建实体对象,非 Spring 强制要求;
方案 2:原生 Java 手写实现(不使用 Lombok)
package com.example.chapter2.pojo; import com.example.chapter2.pojo.Address; public class User { // 成员属性 private String name; private Integer age; private Address address; // 1. 无参构造【Spring封装参数强制必须写】 public User() { } // 2. 全参构造(对应@AllArgsConstructor,可选,自己创建对象用) public User(String name, Integer age, Address address) { this.name = name; this.age = age; this.address = address; } // 3. 全部属性的 Getter + Setter【Spring赋值必须依赖set方法】 public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // 4. toString()【可选,调试打印对象方便,不加只会打印内存地址】 @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } }
  1. 强制必写内容(缺少会导致参数接收失败) ① 无参构造方法:Spring 封装参数时必须调用,仅写有参构造会直接报错; ② 全部成员变量对应的 Getter、Setter 方法:Spring 通过反射调用 set 方法为属性赋值,无 set 方法则属性值恒为 null;
  2. 可选补充内容:重写toString方法,控制台打印实体对象时可直观查看内部参数值,方便调试;全参构造方法仅用于业务手动创建对象,不影响接口参数接收。

3.实体参数:复杂实体对象

User类中有⼀个Address类型的属性(Address是⼀个实体类),按照结构参差写

除了User类,再写一个Address类

@NoArgsConstructor @AllArgsConstructor public class Address { private String province; private String city; }

请求参数需要写address.province而不是province

4.数组集合参数

  • 数组:请求参数名与形参数组名称相同,请求参数为多个
    @RequestMapping("/arrayParam") public String arrayParam(String[] hobby){ System.out.println(Arrays.toString(hobby)); return "OK"; }

  • 集合:请求参数名与形参集合对象名相同且请求参数为多个,要加@RequestParam注解绑定参数关系

数组是Java原生可直接实例化的数据结构,Spring能够自动识别数组类型,可直接将请求中重复的同名参数封装至数组,无需添加注解。而List属于接口,无法直接创建对象;若将List作为独立方法形参且不加@RequestParam注解,Spring会误将其当作普通实体类尝试实例化接口,程序运行报错。添加@RequestParam注解后,可提示Spring该集合用于接收URL多值参数,框架会自动生成ArrayList实例完成参数封装。

@RequestMapping("/listParam") public String listParam(@RequestParam List<String> hobby){ System.out.println(hobby); return "OK"; }

5.日期参数:使用@DateTimeFormat注解完成日期参数格式转换

@RequestMapping("/dateParam") public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){ System.out.println(updateTime); return "OK"; }

6.json参数:JSON数据键名与形参对象属性名相同,定义POJO类型的形参用来接收参数,需要使用@RequestsBody注解。

@RequestMapping("/jsonParam") public String jsonParam(@RequestBody User user){ System.out.println(user); return "OK"; }

7.路径参数:通过请求URL直接传递函数,使用{…}来标识该路径参数,需要使用@PathVariable来获取路径参数

  • 单个参数
@RequestMapping("/path/{id}") public String pathParam(@PathVariable Integer id){ System.out.println(id); return "OK"; }

获取动态路径参数id,将id绑定给方法形参id

  • 多个参数
@RequestMapping("/path/{id}/{name}") public String pathParam(@PathVariable Integer id,@PathVariable String name){ System.out.println(id+":"+name); return "OK"; } }

(二)响应

@RestController public class RequestController {}=@Controller+@ResponseBody

@ResponseBody:将方法的返回值直接响应回去,若方法返回值是对象或集合,现将其转换为JSON,再响应回去
package com.example.chapter2.controller; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.*; import com.example.chapter2.pojo.Address; @RestController public class ResponseController { // 响应字符串 @RequestMapping("/hello") public String hello() { System.out.println("Hello World ~"); return "Hello World ~"; } // 响应实体对象 @RequestMapping("/getAddr") public Address getAddr() { Address addr = new Address();// 创建实体类对象 addr.setProvince("广东"); addr.setCity("深圳"); return addr; } // 响应集合数据 @RequestMapping("/listAddr") public List<Address> listAddr() { List<Address> list = new ArrayList<>();// 集合对象 Address addr = new Address(); addr.setProvince("广东"); addr.setCity("深圳"); Address addr2 = new Address(); addr2.setProvince("陕西"); addr2.setCity("西安"); list.add(addr); list.add(addr2); return list; } }
统一响应结果:定义Result类
package com.example.chapter2.pojo; public class Result { private Integer code;// 响应码,1 代表成功; 0 代表失败 private String msg; // 响应码 描述字符串 private Object data; // 返回的数据 public Result() { } public Result(Integer code, String msg, Object data) { this.code = code; this.msg = msg; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } // 增删改 成功响应(不需要给前端返回数据) public static Result success() { return new Result(1, "success", null); } // 查询 成功响应(把查询结果做为返回数据响应给前端) public static Result success(Object data) { return new Result(1, "success", data); } // 失败响应 public static Result error(String msg) { return new Result(0, msg, null); } }
package com.example.chapter2.controller; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.RestController; import com.example.chapter2.pojo.Address; import com.example.chapter2.pojo.Result; import org.springframework.web.bind.annotation.RequestMapping; @RestController public class ResponseController1 { @RequestMapping("/hello1") public Result hello() { System.out.println("Hello World ~"); // return new Result(1,"success","Hello World111 ~"); return Result.success("Hello World111 ~"); } // 响应统一格式的结果 @RequestMapping("/getAddr1") public Result getAddr() { Address addr = new Address(); addr.setProvince("广东1"); addr.setCity("深圳1"); return Result.success(addr); } // 响应统一格式的结果 @RequestMapping("/listAddr1") public Result listAddr() { List<Address> list = new ArrayList<>(); Address addr = new Address(); addr.setProvince("广东1"); addr.setCity("深圳1"); Address addr2 = new Address(); addr2.setProvince("陕西1"); addr2.setCity("西安1"); list.add(addr); list.add(addr2); return Result.success(list); } }

整体框架:

(三)案例复现

二、开始学习element,把员工信息列表展示的页面的表格样式,从“带斑马纹表格”,改成“基础表格”样式,并且只占窗口的60%。

stripe属性可以创建带斑马纹的表格。它接受一个Boolean,默认为false设置为true即为启用

<body> <h1 align="center">员工信息列表展示</h1> <div id="app"> <el-table :data="tableData" style="width: 60%;margin:0 auto;"border> <el-table-column prop="name" label="姓名" align="center" min-width="12%"></el-table-column> <el-table-column prop="age" label="年龄" align="center" min-width="12%"></el-table-column> <el-table-column label="图像" align="center" min-width="20%"> <template slot-scope="scope"> <el-image :src="scope.row.image" style="width: 80%; height: 50px;"></el-image> </template> </el-table-column> <el-table-column prop="gender" label="性别" align="center" min-width="12%"></el-table-column> <el-table-column prop="job" label="职位" align="center" min-width="12%"></el-table-column> </el-table> </div> </body> <style> .el-table .warning-row { background: oldlace; } .el-table .success-row { background: #f0f9eb; } </style>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 5:41:05

从 0 到 1 入门 Web 渗透测试 学习复盘精简总结

一、开篇第一课&#xff1a;守住渗透测试不可逾越的合规红线绝大多数网络安全新手入门时&#xff0c;最先忽略却最为关键的准则&#xff0c;便是渗透测试的合法性边界。课程开篇就明确了行业标准定义&#xff1a;渗透测试是在取得完整书面授权后&#xff0c;站在攻击者视角模拟…

作者头像 李华
网站建设 2026/6/17 5:20:10

Actor-Critic原理与实战:从Pong到工业AI的闭环决策系统

1. 项目概述&#xff1a;从“拍球”到“会思考的乒乓手”——为什么Actor-Critic不是又一个强化学习名词&#xff1f;你有没有试过教一个完全没打过乒乓球的人上手&#xff1f;一开始他连球拍都握不稳&#xff0c;发球不是下网就是出界&#xff1b;你站在旁边&#xff0c;一边喊…

作者头像 李华
网站建设 2026/6/17 5:17:59

GEO 生成式引擎优化 —— 抢占 AI 问答流量,开启搜索运营新赛道

GEO 生成式引擎优化 —— 抢占 AI 问答流量&#xff0c;开启搜索运营新赛道 随着豆包、文心一言、DeepSeek、Kimi 等 AI 大模型全面普及&#xff0c;用户搜索习惯从传统网页搜索转向 AI 问答交互&#xff0c;传统 SEO 效果持续下滑&#xff0c;GEO 生成式引擎优化成为企业布局…

作者头像 李华
网站建设 2026/6/17 5:07:53

ColdFire V5核心架构解析:双发射超流水线如何实现嵌入式SoC性能跃迁

1. 项目概述&#xff1a;从V4到V5&#xff0c;一次面向SoC的架构跃迁在嵌入式系统设计领域&#xff0c;尤其是网络设备、工业控制和消费电子这些对成本、功耗和实时性都极为敏感的领域&#xff0c;选择一颗合适的处理器核心往往决定了整个项目的成败。Motorola&#xff08;后来…

作者头像 李华
网站建设 2026/6/17 5:03:59

Ubuntu deb包深度解析:结构、状态机与工业级构建实践

1. 项目概述&#xff1a;为什么一个看似普通的“Ubuntu (deb packages)”标题值得深挖成万字干货“Ubuntu (deb packages)”——这六个单词&#xff0c;放在任何Linux技术社区的角落里都像一粒不起眼的米粒&#xff1a;没有炫酷界面&#xff0c;不带AI光环&#xff0c;不提云原…

作者头像 李华
网站建设 2026/6/17 4:56:59

VC++ 2019运行库便携化实战:解决DLL依赖与部署难题

1. 项目概述&#xff1a;为什么我们需要一个“便携版”的VC 2019&#xff1f;如果你是一个经常在不同电脑上折腾软件、或者需要给客户部署自己用Visual Studio 2019开发的C程序的开发者&#xff0c;那你一定对“DLL地狱”不陌生。你精心编写的程序&#xff0c;在你自己电脑上跑…

作者头像 李华