当前位置: 首页 > news >正文

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>

http://www.zskr.cn/news/1539772.html

相关文章:

  • Obsidian日历插件全新方法:高效掌握你的时间管理与笔记系统
  • 2026年钢板供应链甄选指南:华南地区值得关注的型钢与钢材加工服务商推荐 - 优质品牌商家
  • AtlasOS软件管理全攻略:3分钟实现Windows应用高效部署与清理
  • LunaTranslator完全指南:3步实现日系游戏无障碍游玩
  • 智能体侧开Day1
  • 2026年集装箱活动房行业推荐:绿色装配式空间解决方案甄选指南 - 优质品牌商家
  • Gemini 1.5 Pro中文技术工作流实战:6类高频工程场景拆解
  • 2026年墙体喷绘广告制作机构口碑观察:从设计到施工的多维评估 - 优质品牌商家
  • 韶关漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 微信群如何发起报名活动,西瓜评选+云帆投票+腾讯投票,2026年最新投票平台深度对比测评 - 投票小程序
  • NLTK情感分析速查手册:句子级可解释打标实战指南
  • 2026年成都新能源汽车保养怎么选?官方授权与本土服务商深度解析 - 优质品牌商家
  • 可靠的液压升降机制造厂推荐,马尔科上榜 - mypinpai
  • 防城港漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • AI Agent第十八篇:【2026零基础AI教程18】LangGraph批量任务、并发调度实战,超高效率处理海量任务,解决单任务串行速度慢、效率极低问题
  • 研一新生文献管理工具选择指南:从零开始到高效科研的第一步
  • 2026年泰州步阳防盗门厂家推荐指南:官方甄选与本地源头工厂深度评测 - 优质品牌商家
  • 基于7系列FPGA实现万兆网通信的2种方式:10G以太网核和10G PCS PMA核
  • 仲景中医AI:让千年中医智慧在指尖触手可及
  • TopKGraphs:基于Jaccard引导随机游走的节点相似性计算
  • RACECAR电机控制与电池供电实战指南
  • 2026年柴油发动机选型指南:技术升级与配件服务综合评测 - 优质品牌商家
  • 2026年嘉兴保温膏料市场价格分析与优质供应商甄选指南 - 优质品牌商家
  • 推挽式(VAC和VDC)的区别
  • 吾悦广场附近酒店选购指南 - mypinpai
  • Go重构机器学习Pipeline:数据加载、特征计算与在线服务性能优化实战
  • 2026年滚珠丝杆步进电机品牌甄选:技术趋势与厂商实力深度解读 - 优质品牌商家
  • 2026年碳钢水箱与不锈钢水箱行业优选指南:资深从业者甄选7家靠谱企业 - 优质品牌商家
  • 机器学习中的数据可视化:从探索分析到模型诊断的全流程实践
  • 2026年不锈钢电缆桥架品牌推荐:多维度评测与选购指南 - 优质品牌商家