当前位置: 首页 > 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.jsqmd.com/news/1027895/

相关文章:

  • 如何快速上手MediaInfo:视频音频文件信息检测的完整教程
  • 基于51单片机的步进电机控制系统—正/反转、加/减速
  • 马鞍山漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 业务流程自动化怎么落地?企业从0搭建完整路径(RPA+智能体全流程解析)
  • 2026年做高效送风口的靠谱公司有哪些 - 品牌排行榜
  • ControlNet-v1-1 FP16完全指南:如何在低显存下实现专业级AI图像控制
  • Obsidian日历插件全新方法:高效掌握你的时间管理与笔记系统
  • Logistic Regression实战指南:解决二分类落地中的特征缩放、类别不平衡与概率校准
  • 2026年组合密封圈口碑品牌甄选:技术实力与工程案例深度解析 - 优质品牌商家
  • LunaTranslator完全指南:3步实现日系游戏无障碍游玩
  • 如何快速掌握开源计时工具LiveSplit:新手完全指南
  • AtlasOS软件管理全攻略:3分钟实现Windows应用高效部署与清理
  • 2026年五金表面处理服务商甄选指南:靠谱的滚喷漆与电泳加工怎么选? - 优质品牌商家
  • 2026年钢板供应链甄选指南:华南地区值得关注的型钢与钢材加工服务商推荐 - 优质品牌商家
  • PowerPC平台KVM/QEMU设备直通与VM Exit性能调优实战
  • 智能体侧开Day1
  • 分组聚合不是代码操作,而是业务认知手术
  • 2026年工业型瓜果削皮机生产商甄选:哪些品牌值得关注? - 优质品牌商家
  • 数据科学远程训练营:概念、价值与实践选择指南
  • 青岛漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 2026年集装箱活动房行业推荐:绿色装配式空间解决方案甄选指南 - 优质品牌商家
  • Gemini 1.5 Pro中文技术工作流实战:6类高频工程场景拆解
  • 微信群如何发起报名活动,西瓜评选+云帆投票+腾讯投票,2026年最新投票平台深度对比测评 - 投票小程序
  • 嵌入式测试学习第 37 天:异常场景测试:断电、拔插、干扰、非法指令
  • 2026年墙体喷绘广告制作机构口碑观察:从设计到施工的多维评估 - 优质品牌商家
  • 无动力游乐设备价格,浙江凯奇文旅性价比高,怎么选择 - myqiye
  • 韶关漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • GLM-5自主Agent实战:上下文切片与工具调度的工程化实现
  • SecureCRT连接Linux文件无颜色?终端颜色显示原理与配置全解析
  • NLTK情感分析速查手册:句子级可解释打标实战指南