[JavaWeb]【六】web后端开发-请求响应
前言:请求响应
目录
一 引子
二 请求
2.1 Postman
2.1.1 安装
2.1.2 创建工作空间
2.1.3 添加接口
2.2 简单参数
2.2.1 原始方式(不推荐)
2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)
2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)
2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)
2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)
2.3 实体参数
2.3.1 简单的实体类参数
2.3.1.1 创建实体类User
2.3.1.2 创建接口
2.3.2 复杂实体参数
2.3.2.1 创建实体类Address
2.3.2.2 修改实体类User
2.3.2.3 创建接口
2.4 数组集合参数
2.4.1 数组参数
2.4.2 集合参数
2.5 日期参数
2.6 Json参数
2.7 路径参数
2.7.1 单个路径参数
2.7.2 多个路径参数
2.8 总结
三 响应
3.1 @Responbody响应示例(发现不便管理、难以维护)编辑
3.1.1 创建类ResponseController
3.1.2 执行结果
3.1.2.1 返回字符串
编辑3.1.2.2 返回对象json
编辑 3.1.2.3 返回集合json
编辑3.2 统一响应结果
3.2.1 统一结果处理类Result
3.2.2 优化类ResponseController
3.2.3 执行结果(返回统一)
3.3 总结
3.4 统一响应结果的案例
3.4.1 分析步骤
3.4.2 引入dom4j
3.4.3 引入工具类XmlParserUtils
3.4.4 引入实体类 Emp
3.4.5 引入emp.xml文件
3.4.6 引入前端页面
3.4.7 新增EmpController类
3.4.8 访问
3.4.9 思考
四 分层解耦
4.1 三层架构
4.1.1 概述
4.1.2 Dao层
4.1.2.1 新增EmpDao接口
4.1.2.2 新增EmpDaoA实现类
4.1.3 Service层
4.1.3.1 新增EmpService接口
4.1.3.2 新增EmpServiceA实现类
4.1.3 Controller层
4.1.3.1 优化EmpController
4.1.4 对比
4.2 分层解耦
4.2.1 解耦
4.3 IOC(控制反转) & DI(依赖注入)入门
4.3.1 优化EmpDaoA实现类
’4.3.2 优化EmpServiceA实现类
4.3.3 优化EmpController类
4.3.4 如何更改为:实现类EmpserviceB
4.3.5 总结
4.4 IOC详解
4.4.1 优化EmpDaoA实现类
’4.4.2 优化EmpServiceA实现类
4.4.3 优化EmpController类
4.4.4 bean组件扫描
4.4.5 总结
4.5 DI详解
4.5.1 @Primary
4.5.2 @Qualifier
4.5.3 @Resource
4.5.3 总结
一 引子


二 请求
2.1 Postman


2.1.1 安装
略
2.1.2 创建工作空间


2.1.3 添加接口



2.2 简单参数
2.2.1 原始方式(不推荐)




2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)



2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)

![]()
2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)

参数不同 获取null


2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)

此问题是解决2.2.4的问题
package com.runa.controller;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}
}

2.3 实体参数

2.3.1 简单的实体类参数

2.3.1.1 创建实体类User

package com.runa.pojo;public class User {private String name;private Integer age;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;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
2.3.1.2 创建接口
package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}}


2.3.2 复杂实体参数

2.3.2.1 创建实体类Address

package com.runa.pojo;public class Address {private String province;private String city;public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}
2.3.2.2 修改实体类User
package com.runa.pojo;public class User {private String name;private Integer age;private Address address;public String getName() {return name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}
2.3.2.3 创建接口
package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.1 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}}


2.4 数组集合参数

2.4.1 数组参数

package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}}


2.4.2 集合参数

package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}// 3.2 集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "ok";}}


2.5 日期参数

package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}// 3.2 集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "ok";}// 4 日期时间参数@RequestMapping("/dataParam")public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "ok";}}


2.6 Json参数

package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}// 3.2 集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "ok";}// 4 日期时间参数@RequestMapping("/dataParam")public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "ok";}// 5 json 参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "ok";}}


2.7 路径参数

2.7.1 单个路径参数
package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}// 3.2 集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "ok";}// 4 日期时间参数@RequestMapping("/dataParam")public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "ok";}// 5 json 参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "ok";}// 6 路径 参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id){System.out.println(id);return "ok";}}


2.7.2 多个路径参数

package com.runa.controller;import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;@RestController
public class RequestController {// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)//获取请求参数System.out.println(username + ":" + age);return "ok";}// 2 实体参数//2.1 简单的实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){//获取请求参数System.out.println(user);return "ok";}//2.2 复杂的实体参数@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "ok";}// 3 数组集合参数// 3.1 数组参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "ok";}// 3.2 集合参数@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "ok";}// 4 日期时间参数@RequestMapping("/dataParam")public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "ok";}// 5 json 参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "ok";}// 6 路径 参数// 6。1 单个路径 参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id){System.out.println(id);return "ok";}// 6。2 多个路径 参数@RequestMapping("/path/{id}/{name}")public String pathParam(@PathVariable Integer id, @PathVariable String name){System.out.println(id + ":" + name);return "ok";}}


2.8 总结

三 响应

3.1 @Responbody响应示例(发现不便管理、难以维护)
3.1.1 创建类ResponseController

package com.runa.controller;import com.runa.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** 测试响应数据*/@RestController
public class ResponseController {@RequestMapping("/helloWorld")public String helloWorld(){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;}}
3.1.2 执行结果
3.1.2.1 返回字符串
3.1.2.2 返回对象json
3.1.2.3 返回集合json
3.2 统一响应结果

3.2.1 统一结果处理类Result

package com.runa.pojo;/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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(Object data){return new Result(1, "success", data);}public static Result success(){return new Result(1, "success", null);}public static Result error(String msg){return new Result(0, msg, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
3.2.2 优化类ResponseController
package com.runa.controller;import com.runa.pojo.Address;
import com.runa.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** 测试响应数据*/@RestController
public class ResponseController {@RequestMapping("/helloWorld")public Result helloWorld(){System.out.println("Hello World ~");
// return new Result(1,"success","Hello World`");return Result.success("Hello World ~");}@RequestMapping("/getAddr")public Result getAddr(){Address addr = new Address();addr.setProvince("云南");addr.setCity("大理");return Result.success(addr);}@RequestMapping("/listAddr")public Result 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 Result.success(list);}}
3.2.3 执行结果(返回统一)



3.3 总结

3.4 统一响应结果的案例

3.4.1 分析步骤


3.4.2 引入dom4j
<!-- 解析XML -->
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
</dependency>

3.4.3 引入工具类XmlParserUtils

package com.runa.utils;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class XmlParserUtils {public static <T> List<T> parse(String file , Class<T> targetClass) {ArrayList<T> list = new ArrayList<T>(); //封装解析出来的数据try {//1.获取一个解析器对象SAXReader saxReader = new SAXReader();//2.利用解析器把xml文件加载到内存中,并返回一个文档对象Document document = saxReader.read(new File(file));//3.获取到根标签Element rootElement = document.getRootElement();//4.通过根标签来获取 user 标签List<Element> elements = rootElement.elements("emp");//5.遍历集合,得到每一个 user 标签for (Element element : elements) {//获取 name 属性String name = element.element("name").getText();//获取 age 属性String age = element.element("age").getText();//获取 image 属性String image = element.element("image").getText();//获取 gender 属性String gender = element.element("gender").getText();//获取 job 属性String job = element.element("job").getText();//组装数据Constructor<T> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);constructor.setAccessible(true);T object = constructor.newInstance(name, Integer.parseInt(age), image, gender, job);list.add(object);}} catch (Exception e) {e.printStackTrace();}return list;}}
3.4.4 引入实体类 Emp

package com.runa.pojo;public class Emp {private String name;private Integer age;private String image;private String gender;private String job;public Emp() {}public Emp(String name, Integer age, String image, String gender, String job) {this.name = name;this.age = age;this.image = image;this.gender = gender;this.job = job;}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 String getImage() {return image;}public void setImage(String image) {this.image = image;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}@Overridepublic String toString() {return "Emp{" +"name='" + name + '\'' +", age=" + age +", image='" + image + '\'' +", gender='" + gender + '\'' +", job='" + job + '\'' +'}';}
}
3.4.5 引入emp.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<emps><emp><name>金毛狮王</name><age>55</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image><!-- 1: 男, 2: 女 --><gender>1</gender><!-- 1: 讲师, 2: 班主任 , 3: 就业指导 --><job>1</job></emp><emp><name>白眉鹰王</name><age>65</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/2.jpg</image><gender>1</gender><job>1</job></emp><emp><name>青翼蝠王</name><age>45</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/3.jpg</image><gender>1</gender><job>2</job></emp><emp><name>紫衫龙王</name><age>38</age><image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/4.jpg</image><gender>2</gender><job>3</job></emp>
</emps>
3.4.6 引入前端页面

3.4.7 新增EmpController类

package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {@RequestMapping("/listEmp")public Result list(){// 1 加载并解析XML 文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);// 2 对数据进行转换处理 gender jobempList.stream().forEach(emp ->{// 处理gender 1 男 2 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}// 处理 job 1 讲师 2 班主任 3 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");}else if ("3".equals(job)) {emp.setJob("就业指导");}});// 3 响应数据return Result.success(empList);}
}
3.4.8 访问
浏览器
http://localhost:8080/emp.html



3.4.9 思考

四 分层解耦
4.1 三层架构
4.1.1 概述




4.1.2 Dao层

4.1.2.1 新增EmpDao接口
package com.runa.dao;import com.runa.pojo.Emp;import java.util.List;public interface EmpDao {// 获取员工列表数据public List<Emp> listEmap();
}
4.1.2.2 新增EmpDaoA实现类
package com.runa.dao.impl;import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;import java.util.List;public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmap() {// 1 加载并解析XML 文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);return emplist;}
}
4.1.3 Service层
4.1.3.1 新增EmpService接口
package com.runa.service;import com.runa.pojo.Emp;import java.util.List;public interface EmpService {// 获取员工列表public List<Emp> listEmp();
}
4.1.3.2 新增EmpServiceA实现类
package com.runa.service.impl;import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;import java.util.List;public class EmpServiceA implements EmpService {private EmpDao empDao = new EmpDaoA();@Overridepublic List<Emp> listEmp() {//1 调用dao, 获取数据List<Emp> empList = empDao.listEmap();// 2 对数据进行转换处理 gender jobempList.stream().forEach(emp ->{// 处理gender 1 男 2 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}// 处理 job 1 讲师 2 班主任 3 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");}else if ("3".equals(job)) {emp.setJob("就业指导");}});return empList;}
}
4.1.3 Controller层
4.1.3.1 优化EmpController
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list(){// 1 调用service,获取数据List<Emp> empList = empService.listEmp();// 2 响应数据return Result.success(empList);}}
启动

4.1.4 对比

4.2 分层解耦

4.2.1 解耦



4.3 IOC(控制反转) & DI(依赖注入)入门

4.3.1 优化EmpDaoA实现类
package com.runa.dao.impl;import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;import java.util.List;@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmap() {// 1 加载并解析XML 文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);return emplist;}
}
’4.3.2 优化EmpServiceA实现类
package com.runa.service.impl;import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.List;@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpServiceA implements EmpService {
// private EmpDao empDao = new EmpDaoA();@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入private EmpDao empDao; //解耦@Overridepublic List<Emp> listEmp() {//1 调用dao, 获取数据List<Emp> empList = empDao.listEmap();// 2 对数据进行转换处理 gender jobempList.stream().forEach(emp ->{// 处理gender 1 男 2 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}// 处理 job 1 讲师 2 班主任 3 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");}else if ("3".equals(job)) {emp.setJob("就业指导");}});return empList;}
}
4.3.3 优化EmpController类
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class EmpController {
// private EmpService empService = new EmpServiceA();@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入private EmpService empService; //解耦@RequestMapping("/listEmp")public Result list(){// 1 调用service,获取数据List<Emp> empList = empService.listEmp();// 2 响应数据return Result.success(empList);}}

4.3.4 如何更改为:实现类EmpserviceB
如果要更换成新的实现类EmpserviceB,只需要将EmpserviceA 的注解@Component 去掉,实现类EmpserviceB加上注解@Component
4.3.5 总结


4.4 IOC详解

4.4.1 优化EmpDaoA实现类
package com.runa.dao.impl;import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;import java.util.List;//@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
@Repository
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmap() {// 1 加载并解析XML 文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);return emplist;}
}
’4.4.2 优化EmpServiceA实现类
package com.runa.service.impl;import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.List;
//@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
@Service
public class EmpServiceA implements EmpService {
// private EmpDao empDao = new EmpDaoA();@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入private EmpDao empDao; //解耦@Overridepublic List<Emp> listEmp() {//1 调用dao, 获取数据List<Emp> empList = empDao.listEmap();// 2 对数据进行转换处理 gender jobempList.stream().forEach(emp ->{// 处理gender 1 男 2 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");} else if ("2".equals(gender)) {emp.setGender("女");}// 处理 job 1 讲师 2 班主任 3 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");} else if ("2".equals(job)) {emp.setJob("班主任");}else if ("3".equals(job)) {emp.setJob("就业指导");}});return empList;}
}
4.4.3 优化EmpController类
package com.runa.controller;import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController //有@RestController就不需要使用 @Controller ,因为他包含了
public class EmpController {
// private EmpService empService = new EmpServiceA();@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入private EmpService empService; //解耦@RequestMapping("/listEmp")public Result list(){// 1 调用service,获取数据List<Emp> empList = empService.listEmp();// 2 响应数据return Result.success(empList);}}

4.4.4 bean组件扫描

4.4.5 总结

4.5 DI详解

4.5.1 @Primary

4.5.2 @Qualifier


4.5.3 @Resource

4.5.3 总结

相关文章:
[JavaWeb]【六】web后端开发-请求响应
前言:请求响应 目录 一 引子 二 请求 2.1 Postman 2.1.1 安装 2.1.2 创建工作空间 2.1.3 添加接口 2.2 简单参数 2.2.1 原始方式(不推荐) 2.2.2 SpringBoot方式-GET(参数名与形参变量名相同) 2.2.3 SpringBoot方式-POST(参数名与形参…...
uniapp websocket机制 心跳 重连
在开发程序过程中通信功能还是比较常用到的,本文主要介绍的是uniapp中websocket的使用 websocket建立连接后,断开、心跳机制重新链接的一个过程。 关于uni.connectSocket可仔细阅读uniapp官网中的uni.connetSocket以及连接socket创建的实例SocketTask …...
labelme安装以及标注自己的目标检测数据集
目录 一、labelme安装指令 二、使用教程 三、 快捷键 一、labelme安装指令 winR之后在弹出的对话框中输入cmd按回车进入终端 conda activate 虚拟环境名称 pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/ 二、使用教程 安装成功之后在终端输入label…...
归并排序JS
当然,下面是使用JavaScript编写的归并排序的示例代码。归并排序是一种分治算法,其基本思想是将数组分成两半进行排序,然后将排序后的结果合并在一起。 function mergeSort(arr) {if (arr.length < 1) {return arr;}const middle Math.fl…...
matlab 计算点云平均密度
目录 一、算法原理二、代码实现三、结果展示四、C++版计算结果本文由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 采样设备不同、设备距离场景远近不同,会使点云密度产生差异。现有的对点云密度的估算方法有基…...
c++ | uint8_t、uint16_t、unint32_t 和size_t
头文件 #include <stdint.h> // for C #include <cstdint> // for Cuint8_t、uint16_t、unint32_t 这三个分别是表示无符号整型,不同点是他们的长度不同,分别是8位机器位、16、32,也就是一个字节、两个字节、四个字节 注意在…...
mysql 超大 sql 文件导入过程
问题 最近遇到 2 个超大 sql 文件导入,好一通折腾 文档在哪里 调优参数太多,文档都看不过来 找到这些参数也费劲, ubuntu 在 /etc/mysql/mysql.conf.d/mysqld.cnf 中找到这个链接 ...... # # The MySQL Server configuration file. # # For explanat…...
【悬挂绝缘子的串效模型】测量每个绝缘子盘之间的电压并测量串效研究(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
P3957 [NOIP2017 普及组] 跳房子
题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一。 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 nn 个格子,这些…...
VR数字工厂多元化展现,打造数字企业工厂名片
5G时代,各种营销都在走数字化的路子,VR数字工厂用VR赋能工厂数字升级,将企业环境、工厂生产、产品研发、质检运输等流程,无死角720度的展示在客户面前,不仅可以提升自身企业的实力,还可以提高客户的信任感。…...
uniapp封装组件,选中后右上角显示对号√样式(通过css实现)
效果: 一、组件封装 1、在项目根目录下创建components文件夹,自定义组件名称,我定义的是xc-button 2、封装组件代码 <template><view class"handle-btn"><view :class"handleIdCode 1 ? select : unSelec…...
华为OD面试(部分)
笔试与性格测验 一面 问题和算法题都挺简单的 二面 Java内存泄漏 算法题思路不对,没写完只说了下思路:Leetcode516. Longest Palindromic Subsequence hr面(资面) 最后告诉我hr面挂了。其实这不是最重要的,因为还…...
从零做软件开发项目系列之一综论软件项目开发
1 引言 有一个三个泥瓦匠的故事。 三个泥瓦匠在砌墙,一个人走过来,问他们在干什么。 第一个泥瓦匠没好气地说,你没看见吗?我在辛苦地砌墙呢。 第二个回答,我们正在建一座高楼。 第三个则洋溢着喜悦说&…...
msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法
装好软件或游戏之后,一打开就跳出各种报错信息的情况小伙伴一定见过,其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪,用得好好的电脑,怎么会缺文件呢?为啥其他游戏/应用就没事呢?其实这些“丢失”的…...
【报错】git push --set-upstream origin XXXX重名
您在尝试将分支推送到远程仓库时遇到了错误。错误信息表明,由于已经存在名为 refs/heads/xingfan/demo 的文件夹,Git 无法创建分支 refs/heads/xingfan。 要解决此问题,您可以尝试重命名本地分支,然后将其推送到远程仓库。以下是…...
探索树算法:C语言实现二叉树与平衡树
探索树算法:C语言实现二叉树与平衡树 树是计算机科学中一个重要且广泛应用的数据结构,它在许多领域都有着重要作用。本篇博客将深入介绍两种常见的树算法:二叉树遍历和平衡二叉树(AVL树),并提供在C语言中的…...
Ubuntu 20.04(服务器版)安装 Anaconda
0、Anaconda介绍 Anaconda是一个开源的Python发行版本,包含了包括Python、Conda、科学计算库等180多个科学包及其依赖项。因此,安装了Anaconda就不用再单独安装CUDA、Python等。 CUDA,在进行深度学习的时候,需要用到GPU…...
IDEA项目实践——JavaWeb简介以及Servlet编程实战
系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——Spring当…...
【Freertos基础入门】队列(queue)的使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么?二、队列的操作二、示例代码总结 前言 本系列基于stm32系列单片机来使用freerots FreeRTOS是一个广泛使用的开源实时操作系统&…...
从零构建深度学习推理框架-8 卷积算子实现
其实这一次课还蛮好理解的: 首先将kernel展平: for (uint32_t g 0; g < groups; g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k 0; k < k…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
