[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…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
