[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 总结

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/96269.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果iOS16曝出新漏洞:飞行模式下依旧可连接网络

近日&#xff0c;网络安全研究人员发现iOS 16存在一种新的漏洞利用后持久化技术&#xff0c;即使受害者的苹果设备处于离线状态&#xff0c;也可以利用该技术悄无声息地访问该设备。 Jamf Threat Labs 的研究人员 Hu Ke 和 Nir Avraham 在与 The Hacker News 分享的一份报告中…

【C++】AVL树(平衡二叉树)

目录 一、AVL树的定义二、AVL树的作用三、AVL树的插入操作插入——平衡因子的更新插入——左单旋插入——右单旋插入——左右双旋插入——右左双旋 四、ALVL树的验证五、AVL树的性能 一、AVL树的定义 AVL树&#xff0c;全称 平衡二叉搜索&#xff08;排序&#xff09;树。 二…

广州华锐互动:3D数字孪生开发编辑器助力企业高效开发数字孪生应用

3D数字孪生开发编辑器是一种新兴的技术&#xff0c;它可以帮助企业更好地管理和维护其物联网设备。这些工具可以帮助企业实现对设备的实时监控、故障排除和优化&#xff0c;从而提高生产效率和降低成本。 数字孪生系统是一种将物理世界与数字世界相结合的技术&#xff0c;它可以…

openGauss学习笔记-43 openGauss 高级数据管理-事件触发器

文章目录 openGauss学习笔记-43 openGauss 高级数据管理-事件触发器43.1 语法格式43.2 参数说明43.3 示例 openGauss学习笔记-43 openGauss 高级数据管理-事件触发器 触发器会在指定的ddl事件发生时自动执行函数。目前事件触发器仅在PG兼容模式下可用。 43.1 语法格式 创建事…

BIO、NIO和AIO

一.引言 何为IO 涉及计算机核心(CPU和内存)与其他设备间数据迁移的过程&#xff0c;就是I/O。数据输入到计算机内存的过程即输入&#xff0c;反之输出到外部存储&#xff08;比如数据库&#xff0c;文件&#xff0c;远程主机&#xff09;的过程即输出。 I/O 描述了计算机系统…

韦东山-电子量产工具项目:页面系统

代码结构 所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 common.h #ifndef _COMMON_H #define _COMMON_Htypedef struct Region {int iLeftUpX; //区域左上方的坐标int iLeftUpY; //区域左下方的坐标int iWidth; //区域宽度…

爬虫逆向实战(三)--天某云登录

一、数据接口分析 主页地址&#xff1a;天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密&#xff1f; 无…

Lnton羚通关于PyTorch的保存和加载模型基础知识

SAVE AND LOAD THE MODEL (保存和加载模型) PyTorch 模型存储学习到的参数在内部状态字典中&#xff0c;称为 state_dict, 他们的持久化通过 torch.save 方法。 model models.shufflenet_v2_x0_5(pretrainedTrue) torch.save(model, "../../data/ShuffleNetV2_X0.5.pth…

港科夜闻|香港科大校长叶玉如教授、香港科大(广州)校长倪明选教授等两校领导共同出席香港科大(广州)首批本科新生见面会...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大校长叶玉如教授、香港科大(广州)校长倪明选教授等两校领导共同出席香港科大(广州)首批本科新生见面会。8月16日&#xff0c;香港科大(广州)首批本科新生参加了一次具有特殊意义的见面会。香港科大、香港科大(广州…

山西电力市场日前价格预测【2023-08-20】

日前价格预测 预测明日&#xff08;2023-08-20&#xff09;山西电力市场全天平均日前电价为341.71元/MWh。其中&#xff0c;最高日前电价为367.66元/MWh&#xff0c;预计出现在20: 30。最低日前电价为318.47元/MWh&#xff0c;预计出现在04: 15。 价差方向预测 1&#xff1a; 实…

Flink CDC系列之:基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

Flink CDC系列之&#xff1a;基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 一、技术路线二、MySQL数据库建表三、PostgreSQL数据库建表四、在 Flink SQL CLI 中使用 Flink DDL 创建表五、关联订单数据并且将其写入 Elasticsearch 中六、Kibana查看商品和物流信息的…

【Hibench 】完成 HDP-Spark 性能测试

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

【C++】map和set的封装

回顾&#xff1a;之前我们一起学习了map&#xff0c;set&#xff0c;multimap&#xff0c;multiset的接口和相关介绍map和se详细介绍 还实现了AVL树以及RB树&#xff0c;旋转&#xff0c;旋转变色相信大家已经很熟悉啦手撕AVL和红黑树 本文将带大家一起封装map和set 目录 1.找…

在海外如何进行应用商店的关键词优化

分析市场&#xff0c;了解我们的应用类别&#xff0c;将我们的应用与竞争对手的优点和缺点进行比较&#xff0c;找到市场上的空白或所谓未满足的需求&#xff0c;并思考如何填补。 1、应用商店关键词优化。 关键词优化的目的是找到最相关的关键词 &#xff0c;并测试应用元数据…

[保研/考研机试] KY26 10进制 VS 2进制 清华大学复试上机题 C++实现

题目链接&#xff1a; 10进制 VS 2进制http://www.nowcoder.com/share/jump/437195121691738172415 描述 对于一个十进制数A&#xff0c;将A转换为二进制数&#xff0c;然后按位逆序排列&#xff0c;再转换为十进制数B&#xff0c;我们称B为A的二进制逆序数。 例如对于十进制…

创作的1024天 分享月入5K的副业心得

机缘 今天早上醒来打开电脑&#xff0c;和往常一样点开csdn&#xff0c;看见有一封私信&#xff0c;原来是系统通知&#xff0c;今天是我成为创作者的1024天&#xff0c;那就趁着这个机会&#xff0c;分享一下目前我月入5K的副业心得。我是一个普通人&#xff0c;最初想成为创…

ARM 作业1

一、思维导图 二、 1. 2. .text 文本段 .globl _start 声明_start:mov r0,#0mov r1,#0fun:cmp r1,#100bhi stopadd r0,r0,r1add r1,r1,#1b fun stop:b stop .end

【python办公自动化】PysimpleGUI中的popup弹窗中的按钮设置居中

PysimpleGUI中的popup弹窗中的按钮设置居中 背景问题解决背景 默认的popup弹窗中的OK按钮是在最下面偏左侧一些,有时需要将按钮放置居中 问题解决 首先找到pysimplegui源代码文件中popup的部分 然后定位到19388行,源文件内容如下 关于popup弹窗OK按钮的设置,将pad属性…

《合成孔径雷达成像算法与实现》Figure3.10

代码复现如下&#xff1a; clc clear close all% 参数设置 TBP 100; % 时间带宽积 T 7.2e-6; % 脉冲持续时间 t_0 1e-6; % 脉冲回波时延% 参数计算 B TBP/T; …

STM32 cubemx CAN

接收用到的结构体如下&#xff1a;CAN概念&#xff1a; 全称Controller Area Network&#xff0c;是一种半双工&#xff0c;异步通讯。 物理层&#xff1a; 闭环&#xff1a;允许总线最长40m&#xff0c;最高速1Mbps&#xff0c;规定总线两端各有一个120Ω电阻&#xff0c;闭环…