【SpringBoot】请求与响应参数 IoC与DI 总结

news2024/12/27 11:24:48

文章目录

  • ① —— 请求 ——
  • 一、简单参数 @RequestParam
    • 1.1 参数与形参 命名相同
    • 1.2 参数与形参 命名不同
  • 二、实体参数
    • 2.1 简单实体对象
    • 2.2 复杂实体对象
  • 三、数组集合参数
    • 3.1 数组
    • 3.2 集合 @RequestParam
  • 四、日期参数 @DateTimeFormat
  • 五、JSON参数 @RequestBody
  • 六、路径参数 @PathVariable
  • 七、请求头参数 @RequestHeader
  • ② —— 响应 ——
  • 八、@ResponseBody
  • 九、统一响应结果(Result工具类)
    • 9.1 Result工具类代码:
    • 9.2 静态资源
  • 十、案例测试 (解析xml前端显示数据)
    • 10.1 解析xml文件
    • 10.2 加载解析xml 数据转换处理
    • 10.3 问题分析
  • 十一、分层解耦
    • 11.1 三层架构
    • 11.2 分层解耦
    • 11.3 解耦思路
    • 11.4 IoC & DI
      • 11.4.1 IoC 详解
      • 11.4.2 组件扫描
      • 11.4.3 DI 详解
  • 总结


① —— 请求 ——

一、简单参数 @RequestParam

1.1 参数与形参 命名相同

参数名与形参变量名相同,定义形参即可接收参数。

@RestController
@RequestMapping("hello")
public class HelloController {

    @GetMapping("show")
    public String show(String name,String age){
        System.out.println(name+"! Hello World! !" + age);
        return name+" Hello World! " + age ;
    }
}

1
参数名或形参名不同 传入传出数值为空Null
1
1

1.2 参数与形参 命名不同

使用注解 @RequestParam 当形参名字不同时,绑定与参数对应的新名字!通过注解完成映射!

// name : 命名
// required : 默认为TRUE 即必须有;FALSE允许没有即为可以空Null
@RequestParam(name = "age",required = false) String age

挂载注解后,默认required默认为TRUE,即必须传参,否则报错!
1

二、实体参数

@Data
public class User {
    private String name;
    private Integer age;
}

2.1 简单实体对象

    @GetMapping("show1")
    public String show1(User user){
        System.out.println(user);
        return user.toString();
    }

1
1

  • 参数名和实体类属性名需要一致 : 否则属性为空Null

2.2 复杂实体对象

Address 实体类:

@Data
public class Address {
    private String province;
    private String city;
}
  • User类中有一个Address类型的属性(Address是一个实体类)
  • 请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。
  • 1

contoller:

    @GetMapping("show1")
    public String show1(User user){
        System.out.println(user);
        return user.toString();
    }

1

三、数组集合参数

数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。
1
多个值是怎么提交的呢?其实多个值也是一个一个的提交。
在这里插入图片描述

后端程序接收上述多个值的方式有两种:

  1. 数组
  2. 集合

3.1 数组

controller

    @GetMapping("show2")
    public String show2(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return Arrays.toString(hobby);
    }

1

3.2 集合 @RequestParam

集合参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系

    @GetMapping("show3")
    public String show3(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return hobby.toString();
    }

1

四、日期参数 @DateTimeFormat

在一些特殊的需求中,可能会涉及到日期类型数据的封装:
1

因为日期的格式多种多样(如:2023-12-12 10:05:45 、2023/12/12 10:05:45),那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式

    @GetMapping("show4")
    public String show4(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return updateTime.toString();
    }
  • @DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。
  • 后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。
    1

五、JSON参数 @RequestBody

服务端Controller方法接收JSON格式数据:

  • 传递json格式的参数,在Controller中会使用实体类进行封装。
  • 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
  • 1
  • @RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)

controller

    @PostMapping("list")
    public String list(@RequestBody User user){
        System.out.println(user);
        return user.toString();
    }

1

六、路径参数 @PathVariable

路径参数:直接在请求的URL中传递参数:
http://localhost:8080/hello/path/wake/20
1

    @GetMapping("path/{name}/{id}")
    public String path(@PathVariable String name,@PathVariable Integer id){
        System.out.println(name+" "+id);
        return name+" "+id;
    }

1

七、请求头参数 @RequestHeader

    @GetMapping("head")
    public String head(@RequestHeader String name){
        System.out.println(name);
        return name;
    }

1


② —— 响应 ——

八、@ResponseBody

  • 类型:方法注解、类注解
  • 位置:写在Controller方法上或类上
  • 作用:将方法返回值直接响应给浏览器
    • 如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器

1

直接在上加 @RestController 即可 :
@RestController = @Controller + @ResponseBody

@RestController源码:

@Target({ElementType.TYPE})   //元注解(修饰注解的注解)
@Retention(RetentionPolicy.RUNTIME)  //元注解
@Documented    //元注解
@Controller   
@ResponseBody 
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

类上有@RestController注解或@ResponseBody注解时:

  • 表示当前类下所有的方法返回值做为响应数据

  • 方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器

测试:

  • 回显对象数据
    @GetMapping("show1")
    public User show1(User user){
        System.out.println(user);
        user.setAge(99);
        return user;
    }

1

  • 回显集合数据
    @PostMapping("list")
    public List<User> list(@RequestBody User user){
        List<User> list = new ArrayList<>();
        user.setName("DougWake");
        list.add(user);
        return list;
    }

1

九、统一响应结果(Result工具类)

前面所编写的这些Controller方法中,返回值各种各样,没有任何的规范:
1在真实的项目开发中,无论是哪种方法,我们都会定义一个统一的返回结果。方案如下:
1

前端:只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码 code:当前请求是成功,还是失败

  • 状态码信息 msg:给页面的提示信息

  • 返回的数据 data:给前端响应的数据(字符串、对象、集合)

9.1 Result工具类代码:

Result工具类:

package com.wake.utils;

/**
 * 全局统一返回结果类
 */
public class Result<T> {
    // 返回码
    private Integer code;
    // 返回消息
    private String message;
    // 返回数据
    private T data;
    public Result(){}
    // 返回数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }
    /**
     * 操作成功
     * @param data  baseCategory1List
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }
    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }
    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }
    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}

Result 响应码 枚举类:

package com.wake.utils;

/**
 * 统一返回结果状态信息类
 */
public enum ResultCodeEnum {

    SUCCESS(200, "success"),
    USERNAME_ERROR(501, "usernameError"),
    PASSWORD_ERROR(503, "passwordError"),
    NOTLOGIN(504, "notLogin"),
    USERNAME_USED(505, "userNameUsed");

    private Integer code;
    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

返回统一的响应结果:
在这里插入图片描述

9.2 静态资源

资源地址可以在yml配置文件中修改,改完就直接覆盖默认路径。

在SpringBoot项目中,静态资源默认可以存放的目录:

  • classpath:/static/
  • classpath:/public/
  • classpath:/resources/
  • classpath:/META-INF/resources/

classpath:

  • 代表的是类路径,在maven的项目中,其实指的就是 src/main/resources 或者 src/main/java,但是java目录是存放java代码的,所以相关的配置文件及静态资源文档,就放在 src/main/resources下。

【SpringBoot3】整合SpringMVC_静态资源处理

前端资源放这了:
1

十、案例测试 (解析xml前端显示数据)

10.1 解析xml文件

dom4j的依赖,用于解析XML文件:

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

解析XML的工具类XMLParserUtils:

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;
    }
}

10.2 加载解析xml 数据转换处理

案例:读取xml 加载数据转换解析 显示在前端页面

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
    private String name;
    private Integer age;
    private String image;
    private String gender;
    private String job;
}

controller:

@RestController
public class EmpController {
    @RequestMapping("/listEmp")
    public Result list(){
        //1. 加载并解析emp.xml
        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        //System.out.println(file);
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);

        //2. 对数据进行转换处理 - gender, job
        empList.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);
    }
}

http://localhost:8080/emp.html :
1

10.3 问题分析

我们会发现案例中:解析XML数据,获取数据的代码,处理数据的逻辑的代码,给页面响应的代码全部都堆积在一起了,全部都写在controller方法中了。
1

十一、分层解耦

单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
1

  • 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。Dao/Mapper
  • 逻辑处理:负责业务逻辑处理的代码。service
  • 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。controller

11.1 三层架构

1

  • Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
  • Service:业务逻辑层。处理具体的业务逻辑。
  • Dao/Mapper:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

基于三层架构的程序执行流程:
1

  • 前端发起的请求,由Controller层接收(Controller响应数据给前端)
  • Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
  • Service层进行业务处理(MD5加密等),调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)
  • Dao层与数据库相关联(Dao拿到的数据会返回给Service层)
    1

11.2 分层解耦

【Java】面向对象 OOP_OOP三大特性之一:封装_为什么需要封装
1

程序中高内聚的体现:
1
程序中耦合代码的体现:
1

高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。
1

11.3 解耦思路

1
不能在EmpController中使用new对象。

  • 提供一个容器,容器中存储一些对象(例:EmpService对象)
  • controller程序从容器中获取EmpService类型的对象

11.4 IoC & DI

  • 控制反转:
    • Inversion Of Control,简称IOC。
    • 对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
    • 这个容器称为:IOC容器或Spring容器
  • 依赖注入:
    • Dependency Injection,简称DI。
    • 容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
    • 程序运行时需要某个资源,此时容器就为其提供这个资源。
    • 例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象

IOC容器中创建、管理的对象,称之为:bean对象

使用IOC容器 把需要的资源 装进去,使用DI将容器内的资源拿来用!

【Spring】IoC容器 控制反转 与 DI依赖注入 概念 第一期
【Spring】IoC容器 控制反转 与 DI依赖注入 三种实现方式 总结 第五期

11.4.1 IoC 详解

注解说明位置
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合,用的少)
@Component声明bean的基础注解不属于以上三类时,用此注解

其实底层都是@Component注解
在这里插入图片描述

在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。
如果没有指定,默认为类名首字母小写。
1

注意事项:

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。

11.4.2 组件扫描

bean想要生效,还需要被组件扫描

  • 模拟测试
    1
    运行程序后,报错:
    1
    使用四大注解声明的bean,要想生效,还需要被组件扫描注解@ComponentScan扫描

@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了引导类声明注解 @SpringBootApplication 中,
默认扫描的范围是SpringBoot启动类所在包及其子包
1

  • 也可以:手动添加@ComponentScan注解,指定要扫描的包(不建议)
    1
  • 推荐做法:
  • 将我们定义的controller,service,dao这些包,都放在引导类所在包com.wake下:这样我们定义的bean就会被自动的扫描到
  • 1

11.4.3 DI 详解

@Autowired 注解:

  • 自动装配
  • 默认是按照类型进行自动装配的
  • (去IOC容器中找某个类型的对象,然后完成注入操作)

如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?
1
程序报错:显示需要一个单一Bean,但是存在两个。
1
如何解决上述问题呢?Spring提供了以下几种解决方案:

  • @Primary

  • @Qualifier

  • @Resource

  1. @Primary注解
    确定默认的实现
    1
  2. @Qualifier注解
  • 指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。
  • @Qualifier注解不能单独使用,必须配合@Autowired使用
    1
  1. @Resource注解
  • 是按照bean的名称进行注入。
  • 通过name属性指定要注入的bean的名称。
    1

面试题 : @Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入

总结

使用自动构建SpringBoot 报错!
1

错误: 找不到或无法加载主类 com.wake.SpringbootTestPartApplication 原因: java.lang.ClassNotFoundException: com.wake.SpringbootTestPartApplication

解决: maven

clean 
comlile

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vmware虚拟机使用过程中断电后无法重启处理

背景 今天在用新装的虚拟机进行测试的过程中&#xff0c;忽然笔记本关机了&#xff08;没插电源线&#xff09;&#xff0c;重启电脑后发现虚拟机提示“正在使用中“&#xff0c;具体如下所示&#xff1a; 解决 在相关虚拟机文件夹内查找以 .lck 结尾的文件&#xff0c;名称一…

如何优化使用Nginx

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容数据压缩负载均衡安装OpenResty或ngx_http_lua_module配置Nginx以启用Lua编写Lua脚本配置upstream块以使用Lua变量测试配置 合并请求1. 确保SSI模块已启用2. 配置Nginx以使用SSI3. 使用SSI指令4. 重新加载或重启Nginx 集成…

【Maven入门篇】(2)IDEA集成Maven环境的具体操作

&#x1f38a;专栏【Maven入门篇】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f354;配置Maven环境⭐方法一&#xff08;当前工程&…

选频网络与串联谐振回路

选频网络概述 在高频电子线路中&#xff0c;常以选频网络作为负载。选频网络能选出我们需要的频率分量和滤除不需要的频率分量。 选频网络分类&#xff1a; 1、振荡回路&#xff08;由L、C组成&#xff0c;也称谐振回路&#xff09;&#xff1a;包括单振荡回路、耦合振荡回路…

Java项目:58 ssm012医院住院管理系统+vue

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员&#xff1b;首页、个人中心、医护人员管理、科室管理、病人管理、病房管理、病人信息管理、病历管理、医嘱管理、手术安排管理、药品信…

【linux】搜索所有目录和子目录下的包含.git的文件并删除

一、linux命令搜索所有目录和子目录下的包含.git的文件 在Linux系统中&#xff0c;要搜索所有目录和子目录下的包含.git的文件&#xff0c;可以使用find命令。find命令允许指定路径、表达式和操作来查找文件。 以下是使用find命令搜索包含.git的文件的方法&#xff1a; 1. 基…

masm下载和配置

masm下载和配置 1&#xff09;masm32官网下载地址选择Austrlia 1。 2&#xff09;解压masm32v11r.zip,点击install.exe安装&#xff08;一直下一步即可&#xff09;。 3&#xff09;安装完成后得到一个masm文件夹。 4&#xff09;关联DOSBox与masm&#xff1a; 在DOSBox安…

Halcon识别文字案例

识别文字并显示到页面上 read_image (Image, needle1.png) * 打开窗口 dev_open_window (0, 0, 512, 512, black, WindowHandle) dev_display (Image)* 画矩形 gen_rectangle1 (ROI_0, 52.4648, 99.0391, 256.758, 354.063) * 裁剪 reduce_domain (Image, ROI_0, ImageReduced)…

InnoDB B+树索引

没有索引的查找 在一个页中的查找 假设目前表中的记录比较少&#xff0c;所有的记录都可以被存放到一个页中&#xff0c;在查找记录的时候可以根据搜索条件的不同分为两种情况&#xff1a; 以主键为搜索条件 这个查找过程我们已经很熟悉了&#xff0c;可以在页目录中使用二分法…

17双体系Java学习之数组的长度

数组的长度 //获取数组长度 arrays.lengthfor (int i 0; i <nums.length; i) {sum sum nums[i];}System.out.println("总和为&#xff1b;"sum);

【电机芯片】以STM32F103C8T6举例——持续更新

【电机芯片】以STM32F103C8T6举例——持续更新 文章目录 前言一、PWM二、IIC三、UART四、看门狗watchdog五、ADC六、定时器中断七、EEPROM与flash八、时钟九、IAP-Bootloader&#xff0c;APP十、OTA十一、GPIO模式十二、SPI十三、STLINK-DEBUG模式总结 前言 提示&#xff1a;以…

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

DC-1靶机渗透测试

DC-1靶机渗透测试 一、信息搜集1、嗅探寻找存活主机2、查找开放端口3、查找敏感目录 二、漏洞利用1、web访问2、寻找Drupal 的config文件3、寻找网站登录密码4、寻找靶机的用户名和密码5、远程登录6、提权 一、信息搜集 1、嗅探寻找存活主机 命令&#xff1a;arp-scan -l 找到…

Redis 三种集群方案

原文连接 : [Redis] 你了解 Redis 的三种集群模式吗&#xff1f; - 个人文章 - SegmentFault 思否 Redis 支持三种集群方案 主从复制模式Sentinel&#xff08;哨兵&#xff09;模式Cluster 模式 Redis 集群的三种模式 主从复制模式 主从复制的作用 通过持久化功能&#xff…

TypeScript -哲学 Mapped types

1、快速复制另一个类型 2、对之前的类型进行重写 3、 4、 注意&#xff1a;这里直接 报错&#xff1a;因为模版字符串只能包含 不能退出 k的来源&#xff0c;所以报错。 Remove a property from a type

C#,图论与图算法,寻找图(Graph)中的桥(Bridge)算法与源代码

1 图(Graph)中的桥(Bridge) 如果删除无向连通图中的边会断开该图的连接,则该边就是桥。对于断开连接的无向图,定义类似,桥接是一种边移除,它增加了断开连接的组件的数量。 与连接点一样,网桥代表连接网络中的漏洞,对于设计可靠的网络非常有用。例如,在有线计算机网…

C语言例:设 int a=11; 则表达式 a+=a-=a*a 的值

注&#xff1a;软件为VC6.0 代码如下&#xff1a; #include<stdio.h> int main(void) {int a11, b;b (aa-a*a); //a*a121 -->a-121结果为a-110 -->a-110结果为a-220printf("表达式aa-a*a 的值为&#xff1a; %d\n",b);return 0; } //优先级&#x…

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…

linux查看top与修改root密码

top perf top -g -p 进程名 使用top命令&#xff0c;同时输入大写的P&#xff0c;会按照cpu使用率从大到小排列 linux修改用户登录密码 输入Ctrlx进入下面的界面 分别输入mount -o remount, rw / 注意rw后面又两个空格 输入passwd root 修改root密码 输入新密码2次 ex…

栈与队列|150.逆波兰表达式求值

力扣题目链接 class Solution { public:int evalRPN(vector<string>& tokens) {// 力扣修改了后台测试数据&#xff0c;需要用longlongstack<long long> st; for (int i 0; i < tokens.size(); i) {if (tokens[i] "" || tokens[i] "-&qu…