ModelMapper 一文读懂

news2024/11/27 22:21:40

目录

1、ModelMapper简介

1.1 引入ModelMapper 的依赖 

1.2 进行Mapping映射

1.3 ModelMapper 工作原理 

2、ModelMapper 基础操作 

2.1 ModelMapper 基本映射

2.2  ModelMapper 集合转换

 2.3  ModelMapper 指定默认值

 2.4  ModelMapper 属性值转换

 2.5  ModelMapper 属性值跳过

 2.6 ModelMapper  条件映射

2.7 ModelMapper  转换

2.8 ModelMapper 提供者


1、ModelMapper简介

ModelMapper是一个旨在简化对象映射框架,它根据约定处理对象之间的映射方式,为处理特定对象提供一个简单的、安全的、可重构安全API。

1.1 引入ModelMapper 的依赖 

在pom.xml文件添加modelMapper相关依赖

<dependency>
         <groupId>org.modelmapper</groupId>
         <artifactId>modelmapper</artifactId>
         <version>2.4.2</version>
</dependency>

1.2 进行Mapping映射

使用ModelMapper来映射对象,主要分为以下两大类:

  • Source model: 源数据对象
  • Destination model:模板数据对象

1.3 ModelMapper 工作原理 

        在ModelMapper 调用map() 方法时,先分分析源对象和目标对象类型,根据匹配策略和其他配置确定那些属性需要进行隐式匹配,然后根据这些匹配映射数据。

        即使源对象和目标对象的属性不同,ModelMapper 也会尽最大努力根据配置的匹配策略,将源对象和目标对象的属性进行匹配。

        在实际项目开发过程中进行对象类型转换,经常出现如下操作:

  • Controller层接受到客户端的DTO 对象,通过ModelMapper 框架将DTO对象转换为Service层可操作执行的BO对象。
  • Service层调用Dao 层方法时,通过ModelMapper框架将BO对象转换为Dao 层可操作执行的PO对象。如果调用Dao 层有结果对象返回,又需要ModelMapper 框架将PO对象转换为BO对象进行返回。
  • Controller层调用Service 层有对象返回,需要通过ModelMapper框架对象将BO对象转换为VO对象返回给客户端。

2、ModelMapper 基础操作 

2.1 ModelMapper 基本映射

创建ModelMapper映射步骤总结:

1、添加ModelMapper 依赖Jar 包。

2、实例化ModelMapper类,调用map 方法,传入源对象和目标对象。

实战:创建Order和OrderDTO 类定义,通过ModelMapper实现Order类实例对象转换OrderDTO 类实例对象。

package com.zzg.modelmapper.po.source;

import lombok.Data;

@Data
public class Order {
    private Address address;
    private Customer customer;
}


package com.zzg.modelmapper.po.source;

import lombok.Data;

@Data
public class Address {
    private String street;
    private String city;
}


package com.zzg.modelmapper.po.source;

import lombok.Data;

@Data
public class Customer {
    private Name name;
}


package com.zzg.modelmapper.po.source;

import lombok.Data;

@Data
public class Name {
    private String firstName;
    private String lastName;
}
package com.zzg.modelmapper.po.target;

import lombok.Data;

@Data
public class OrderDTO {
    private String customerFirstName;
    private String customerLastName;
    private String addressStreet;
    private String addressCity;
}

测试:

package com.zzg.modelmapper.po.test;

import com.alibaba.fastjson.JSON;
import com.zzg.modelmapper.po.source.Address;
import com.zzg.modelmapper.po.source.Customer;
import com.zzg.modelmapper.po.source.Name;
import com.zzg.modelmapper.po.source.Order;
import com.zzg.modelmapper.po.target.OrderDTO;
import org.modelmapper.ModelMapper;

public class OneTest {
    public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();
        Order order = new Order();
        Customer customer = new Customer();
        Name name = new Name();
        name.setLastName("周");
        name.setFirstName("程宇");
        customer.setName(name);
        Address address = new Address();
        address.setCity("深圳");
        address.setStreet("龙岗区横岗街道");
        order.setCustomer(customer);
        order.setAddress(address);
        OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
        String jsonString = JSON.toJSONString(orderDTO);
        System.out.println("jsonString = " + jsonString);

    }
}

执行效果截图:

2.2  ModelMapper 集合转换

功能要求:将List<Order> 转换为List<OrderDTO>

功能实现:通过modelMapper.map(源对象Class, new TypeToken<List<目标读写Class>>() {}.getType());

测试:

     Order order = new Order();
        Customer customer = new Customer();
        Name name = new Name();
        name.setLastName("周");
        name.setFirstName("程宇");
        customer.setName(name);
        Address address = new Address();
        address.setCity("深圳");
        address.setStreet("龙岗区横岗街道");
        order.setCustomer(customer);
        order.setAddress(address);

        Order order2 = new Order();
        Customer customer2 = new Customer();
        Name name2 = new Name();
        name2.setLastName("周");
        name2.setFirstName("晨曦");
        customer2.setName(name2);
        Address address2 = new Address();
        address2.setCity("深圳");
        address2.setStreet("盐田区梅沙街道");
        order2.setCustomer(customer2);
        order2.setAddress(address2);

        List<Order> containers =  new ArrayList<>();
        containers.add(order);
        containers.add(order2);

        ModelMapper modelMapper = new ModelMapper();
        List<OrderDTO> orderDTOs = modelMapper.map(containers, new TypeToken<List<OrderDTO>>() {}.getType());
        String jsonString = JSON.toJSONString(orderDTOs);
        System.out.println("jsonString = " + jsonString);
    }

执行效果截图:

 2.3  ModelMapper 指定默认值

功能要求:Order类实例对象 转换OrderDTO 类实例对象时,将street属性值设置为:龙岗区横岗街道"。

功能实现:

  public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();
        Order order = new Order();
        Customer customer = new Customer();
        Name name = new Name();
        name.setLastName("周");
        name.setFirstName("程宇");
        customer.setName(name);
        Address address = new Address();
        address.setCity("深圳");
        address.setStreet("盐田区梅沙街道");
        order.setCustomer(customer);
        order.setAddress(address);

        modelMapper.createTypeMap(Order.class, OrderDTO.class)
                .addMappings(mapper-> mapper.using((Converter<String, String>) context ->{
                   return "龙岗区横岗街道" ;
                }).map(it-> it.getAddress().getStreet(),OrderDTO::setAddressStreet));

        OrderDTO orderDTO = modelMapper.map(order, OrderDTO.class);
        String jsonString = JSON.toJSONString(orderDTO);
        System.out.println("jsonString = " + jsonString);
    }

执行效果截图:

 2.4  ModelMapper 属性值转换

功能要求:OrderDTO类对象新增cityTest 和streetTest 属性,对应属性值为Order类实例对象Address 属性对象中的city 和street属性。

package com.zzg.modelmapper.po.target;

import lombok.Data;

@Data
public class OrderDTO {
    private String customerFirstName;
    private String customerLastName;
    private String addressStreet;
    private String addressCity;
    /**
     * 新增属性
     */
    private String cityTest;
    private String streetTest;
}

测试:

public static void main(String[] args) {
        ModelMapper modelMapper = new ModelMapper();
        Order order = new Order();
        Customer customer = new Customer();
        Name name = new Name();
        name.setLastName("周");
        name.setFirstName("程宇");
        customer.setName(name);
        Address address = new Address();
        address.setCity("深圳");
        address.setStreet("盐田区梅沙街道");
        order.setCustomer(customer);
        order.setAddress(address);

        OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                .addMappings(mapper-> {
                            // 自定义属性转换
                            mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                            mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        }).map(order);

        String jsonString = JSON.toJSONString(orderDTO);
        System.out.println("jsonString = " + jsonString);
    }

执行效果截图:

 拓展功能需求:OrderDTO 类对象新增枚举对象属性:OrderSource orderSource, 对应属性值为Order类实例对象新增字符串属性:String orderSource

package com.zzg.modelmapper.po.target;

import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public enum OrderSource {
    Mobile("1", "移动端"),
    Web("2", "网页端"),
    Other("3", "其他");
    private String type;
    private String message;

    OrderSource(){

    }

    OrderSource(String type, String message) {
        this.type = type;
        this.message = message;
    }

    /**
     * 枚举转Map
     */
    private static Map<String, OrderSource> map = Stream.of(OrderSource.values()).collect(Collectors.toMap(OrderSource::getType, Function.identity(), (v1, v2) -> v1));

    public static OrderSource getInstance(String type){
        return map.get(type);
    }
    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }


    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
package com.zzg.modelmapper.po.target;

import lombok.Data;

@Data
public class OrderDTO {
    private String customerFirstName;
    private String customerLastName;
    private String addressStreet;
    private String addressCity;
    /**
     * 新增属性
     */
    private String cityTest;
    private String streetTest;
    private OrderSource orderSource;
}
package com.zzg.modelmapper.po.source;

import lombok.Data;

@Data
public class Order {
    private Address address;
    private Customer customer;
    /**
     * 新增订单来源属性
     */
    private String orderSource;
}

测试:

 public static void main(String[] args) {
            ModelMapper modelMapper = new ModelMapper();
            Order order = new Order();
            Customer customer = new Customer();
            Name name = new Name();
            name.setLastName("周");
            name.setFirstName("程宇");
            customer.setName(name);
            Address address = new Address();
            address.setCity("深圳");
            address.setStreet("盐田区梅沙街道");
            order.setCustomer(customer);
            order.setAddress(address);
            order.setOrderSource("1");

            OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                    .addMappings(mapper-> {
                        // 自定义属性转换
                        mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                        mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                                return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
                    }).map(order);

            String jsonString = JSON.toJSONString(orderDTO);
            System.out.println("jsonString = " + jsonString);
        }

执行效果截图:

 2.5  ModelMapper 属性值跳过

ModelMapper 隐式创建从源类型到目标类型中每个属性的映射,但有时可能需要跳过某些目标属性的映射。

功能要求:跳过OrderDTO类实例对象的addressStreet 和addressCity 属性值映射。

测试:

public static void main(String[] args) {
    ModelMapper modelMapper = new ModelMapper();
    Order order = new Order();
    Customer customer = new Customer();
    Name name = new Name();
    name.setLastName("周");
    name.setFirstName("程宇");
    customer.setName(name);
    Address address = new Address();
    address.setCity("深圳");
    address.setStreet("盐田区梅沙街道");
    order.setCustomer(customer);
    order.setAddress(address);
    order.setOrderSource("1");

    OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
            .addMappings(mapper-> {
                //  跳过属性
                mapper.skip(OrderDTO::setAddressStreet);
                mapper.skip(OrderDTO::setAddressCity);
                // 自定义属性转换
                mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                // 字符串转枚举
                mapper.using((Converter<String, OrderSource>) context ->{
                    return OrderSource.getInstance(context.getSource()) ;
                }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
            }).map(order);

    String jsonString = JSON.toJSONString(orderDTO);
    System.out.println("jsonString = " + jsonString);
}

执行效果截图:

 2.6 ModelMapper  条件映射

ModelMapper 提供Condition条件接口,判断是否执行源属性到模板属性映射。

功能要求:在Order类中添加订单金额字段:amount, 在OrderDTO 类中添加订单金额字段:amount和订单优先级字段priority,如果金额大于1000, priority 设置为最高基本=3,其他设置为普通基本=2。

 public static void main(String[] args) {
            ModelMapper modelMapper = new ModelMapper();
            Order order = new Order();
            Customer customer = new Customer();
            Name name = new Name();
            name.setLastName("周");
            name.setFirstName("程宇");
            customer.setName(name);
            Address address = new Address();
            address.setCity("深圳");
            address.setStreet("盐田区梅沙街道");
            order.setCustomer(customer);
            order.setAddress(address);
            order.setOrderSource("1");
            order.setAmount(100000);

            OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                    .addMappings(mapper-> {
                        //  添加判断条件 + 添加自定义转换条件
                        mapper.when((Condition<Integer, String>) context -> context.getSource() > 0).using((Converter<Integer, String>) context ->{
                                return context.getSource() >=1000 ? "3":"2" ;
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);
                        // 自定义属性转换
                        mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                        mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                            return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
                    }).map(order);

            String jsonString = JSON.toJSONString(orderDTO);
            System.out.println("jsonString = " + jsonString);
        }

订单金额大于10000,执行效果截图:

订单金额小于10000,执行效果截图:

 拓展功能:如果没有设置订单金额,将priority 设置为异常订单=1。

测试:

  public static void main(String[] args) {
            ModelMapper modelMapper = new ModelMapper();
            Order order = new Order();
            Customer customer = new Customer();
            Name name = new Name();
            name.setLastName("周");
            name.setFirstName("程宇");
            customer.setName(name);
            Address address = new Address();
            address.setCity("深圳");
            address.setStreet("盐田区梅沙街道");
            order.setCustomer(customer);
            order.setAddress(address);
            order.setOrderSource("1");

            OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                    .addMappings(mapper-> {
                        //  添加判断条件 + 添加自定义转换条件
                        mapper.when((Condition<Integer, String>) context -> {
                            if(context.getSource() != null && context.getSource()> 0){
                                return true;
                            }
                            return false;
                        }).using((Converter<Integer, String>) context ->{
                                return context.getSource() >=1000 ? "3":"2" ;
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);
                        // 自定义属性转换
                        mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                        mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                            return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
                    }).map(order);

            String jsonString = JSON.toJSONString(orderDTO);
            System.out.println("jsonString = " + jsonString);
        }

 订单金额无,执行效果截图:

结果:由于没有设置订单金额,导致OrderDTO 类对象中的 priority 属性字段没有对应 映射,这与我们提出的功能要求不符,需要添加以下业务逻辑处理:

如果订单金额为空 或者为0,需要将OrderDTO 类对象中的 priority 属性字段映射为1(异常订单类型)

   public static void main(String[] args) {
            ModelMapper modelMapper = new ModelMapper();
            Order order = new Order();
            Customer customer = new Customer();
            Name name = new Name();
            name.setLastName("周");
            name.setFirstName("程宇");
            customer.setName(name);
            Address address = new Address();
            address.setCity("深圳");
            address.setStreet("盐田区梅沙街道");
            order.setCustomer(customer);
            order.setAddress(address);
            order.setOrderSource("1");

            OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                    .addMappings(mapper-> {
                        //  添加判断条件 + 添加自定义转换条件
                        mapper.when((Condition<Integer, String>) context -> {
                            if(context.getSource() != null && context.getSource()> 0){
                                return true;
                            }
                            return false;
                        }).using((Converter<Integer, String>) context ->{
                                return context.getSource() >=1000 ? "3":"2" ;
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);
                        // 添加判空添加 + 添加默认值
                        mapper.when((Condition<Integer, ?>) condition ->{
                            if(condition.getSource() == null ||  condition.getSource() == 0){
                                return true;
                            }
                            return false;
                        }).using((Converter<Integer, String>) converter->{
                            return "1";
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);

                        // 自定义属性转换
                        mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                        mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                            return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
                    }).map(order);

            String jsonString = JSON.toJSONString(orderDTO);
            System.out.println("jsonString = " + jsonString);
        }
}

订单金额无,执行效果截图:

2.7 ModelMapper  转换

转换器允许在将源映射到目标属性时进行自定义转换。ModelMapper 提供Converter转换接口,实现源映射到目标属性时自定义转换。

示例代码片段:

                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                            return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);

2.8 ModelMapper 提供者

ModelMapper 提供Provide接口,返回源属性到模板属性映射值。

功能要求:Order 类属性amount 为null, 设置OrderDTO 类属性amount  = 0

测试:

 public static void main(String[] args) {
            ModelMapper modelMapper = new ModelMapper();
            Order order = new Order();
            Customer customer = new Customer();
            Name name = new Name();
            name.setLastName("周");
            name.setFirstName("程宇");
            customer.setName(name);
            Address address = new Address();
            address.setCity("深圳");
            address.setStreet("盐田区梅沙街道");
            order.setCustomer(customer);
            order.setAddress(address);
            order.setOrderSource("1");

            OrderDTO orderDTO =modelMapper.typeMap(Order.class, OrderDTO.class)
                    .addMappings(mapper-> {
                        //  添加判断条件 + 添加自定义转换条件
                        mapper.when((Condition<Integer, String>) context -> {
                            if(context.getSource() != null && context.getSource()> 0){
                                return true;
                            }
                            return false;
                        }).using((Converter<Integer, String>) context ->{
                                return context.getSource() >=1000 ? "3":"2" ;
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);
                        // 添加判空添加 + 添加默认值
                        mapper.when((Condition<Integer, ?>) condition ->{
                            if(condition.getSource() == null ||  condition.getSource() == 0){
                                return true;
                            }
                            return false;
                        }).using((Converter<Integer, String>) converter->{
                            return "1";
                        }).map(it-> it.getAmount(),OrderDTO::setPriority);
                        // 通过Provider 设置默认值
                        mapper.with((Provider<Integer>) provider ->{
                            return 0;
                        }).map(it-> it.getAmount(),OrderDTO::setAmount);

                        // 自定义属性转换
                        mapper.map(src -> src.getAddress().getStreet(), OrderDTO::setStreetTest);
                        mapper.map(src -> src.getAddress().getCity(), OrderDTO::setCityTest);
                        // 字符串转枚举
                        mapper.using((Converter<String, OrderSource>) context ->{
                            return OrderSource.getInstance(context.getSource()) ;
                        }).map(src -> src.getOrderSource(), OrderDTO::setOrderSource);
                    }).map(order);

            String jsonString = JSON.toJSONString(orderDTO);
            System.out.println("jsonString = " + jsonString);
        }

效果展示:

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

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

相关文章

node.js创建服务器及知识点

node.js创建服务器及知识点用http协议创建web服务器http协议知识点用express创建web服务器express中路由知识点fs文件系统模块文件流querystring查询字符串模块URL模块中间件挂载路由器node.js和mysql项目实战知识点完整代码注意点用http协议创建web服务器 //引入http const h…

【强训】Day07

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、选择二、编程1. Fibonacci数列2. 合法括号序列判断 ☆答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 Math.round(11.5) 等于&#xff08;&#xff09; A 11 B 11.5 C 12 D 12.5 以下对继承的描…

Spring Boot(五十四):SpringBoot事件监听机制

1 Java监听机制 SpringBoot 的监听机制&#xff0c;其实是对Java提供的事件监听机制的封装。 Java中的事件监听机制定义了以下几个角色&#xff1a; 事件&#xff1a;Event&#xff0c;继承 java.util.EventObject 类的对象事件源&#xff1a;Source &#xff0c;任意对象Ob…

Unet网络解析

1 Unet网络概述 论文名称&#xff1a;U-Net: Convolutional Networks for Biomedical Image Segmentation 发表会议及时间 &#xff1a;MICCA ( 国际医学图像计算和 计算机辅 助干预会 议 ) 2 0 1 5 Unet提出的初衷是为了解决医学图像分割的问题。 Unet网络非常的简单&…

leetcode 2246. Longest Path With Different Adjacent Characters(不同相邻字母的最长路径)

给一棵以节点0为根的树&#xff08;不一定是二叉树&#xff09;&#xff0c;共有n个节点&#xff0c;0&#xff5e;n-1&#xff0c; 同样的&#xff0c;有长度为n的数组parent, parent[i]表示第 i 个节点的parent, 0的parent是-1. 长度为n的字符串&#xff0c;s(i)表示第i个节点…

JSPmvc

一、JSP 概述 JSP&#xff08;全称&#xff1a;Java Server Pages&#xff09;&#xff1a;Java 服务端页面。是一种动态的网页技术&#xff0c;其中既可以定义HTML、JS、CSS等静态内 容&#xff0c;还可以定义 Java代码的动态内容&#xff0c;也就是 JSP HTML Java 。如下就…

【金融】新成立基金建仓时点、行业分布与市场行情关系探究

需要进一步交流&#xff0c;获取数据和代码的同学欢迎私信奥~基于新成立基金建仓带入市场的巨量资金会推动市场行情这一逻辑&#xff0c;开展了一系列研究。首先提出了通过基金净值识别建仓行为&#xff08;累计绝对值涨跌幅法&#xff09;和通过基金β值识别建仓行为&#xff…

Vue知识系列-VS Code的安装+Vue环境的搭建+Vue指令

一、VS Code下载地址 Visual Studio Code - Code Editing. Redefined 二、VS Code初始化设置 1.安装插件 在安装好的VSCode软件的扩展菜单中查找安装如下4个插件 2、创建项目 vscode本身没有新建项目的选项&#xff0c;所以要先创建一个空的文件夹&#xff0c;如project_xx…

自主异常检测算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AppScan 扫描web应用程序

系列文章 AppScan介绍和安装 第二节-AppScan 扫描web应用程序 1.环境布置 我们准备了如下一个靶场用来做实验 2.扫描步骤 1.启动AppScan 2.选择 【扫描web应用程序】 3.输入起始URL&#xff0c;点击【下一步】 http://127.0.0.1:83/4.选择【不使用代理】,点击【下一…

ctfshow php特性[125-135]

&#x1f60b;大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白&#xff0c;自学ing。 本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;一起学习&#x1f497;&#xff0c;一起进步⭐。⭐此后如竟没有炬火&#xff0c;我便是唯一的光。⭐web 125<?php…

word怎么转换成pdf?其实很简单,看这里即可!

转眼间又到了校招的季节&#xff0c;想必许多小伙伴都在忙着编辑自己的简历吧。不过&#xff0c;咱们编辑的时候常常用到的都是word文件&#xff0c;但是当我们要将文件投递出去的时候就需要用到pdf了。其实不仅仅是投递简历&#xff0c;许多地方在要求我们发送正式文件的时候都…

vue+node+mysql全栈项目完整记录

文章目录vuenodemysql全栈项目完整记录写在前面项目最终界面展示项目框架搭建后端创建后端项目编写入口文件数据库及数据库使用前端创建前端项目使用elementUI必要包安装设置跨域访问&#xff0c;全局挂载axios删除无用的文件和代码设置统一的页面样式主页面页面设计路由设计登…

【C语言】柔性的数组是什么?C/C++程序的内存开辟又是?

本文主要讲解柔性数组的相关知识点&#xff0c;并穿插一下C/C程序的内存开辟&#xff0c;涉及到动态内存管理函数&#xff0c;如有不了解的&#xff0c;请参考这一篇文章【C语言】小王带您轻松实现动态内存管理&#xff08;简单易懂&#xff09;_小王学代码的博客-CSDN博客 目录…

【C++】类和对象【下篇】--初始化列表,static成员,友元,内部类,匿名对象

文章目录一、再谈构造函数1.构造函数体赋值2.初始化列表1.概念2.特性二、隐式类型转换1.概念2.构造函数的类型转换3.explict关键字4.类型转换的意义三、Static成员1.概念2.static成员变量3.static成员函数四、友元1.友元函数2.友元类五、内部类六、匿名对象七、拷贝对象时的一些…

深入使用noexcept

深入使用noexcept简介好处坏处适用场景不适用场景实验结果总结参考资料简介 noexcept是C11引入的&#xff0c;表明函数是否会抛出异常。正确使用它可以优化性能&#xff0c;错误使用则会带来麻烦。 noexcept使用语法有两种&#xff1a; noexcpetnoexcept(expression) 第二种…

如何提高系统稳定性?

1、系统稳定性的评判标准 在开始谈稳定性保障之前&#xff0c;我们先来聊聊业内经常提及的一个词SLA&#xff01;业内喜欢用SLA &#xff08;服务等级协议&#xff0c;全称&#xff1a;service level agreement&#xff09;来衡量系统的稳定性&#xff0c;对互联网公司来说&am…

测试开发知识总结(一)

本文内容顺序&#xff1a;测试基础理论、测试岗经常被问到的场景题、智力题、测试岗高频算法题、数据库、Linux知识点。常用自动化测试工具1、Appium官网&#xff1a;http://appium.ioAppUI自动化测试Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台…

为什么很少拿神经网络来直接做滤波器呢?

其实无论是IIR&#xff08;RNN&#xff09;还是FIR(CNN)滤波器都可以看成一个简单神经网络&#xff0c;而且有严格的推理&#xff0c;可解释性比神经网络强多了&#xff0c;而已易于工程实现&#xff0c;因此在工程中大量应用。你说的含色噪声和其他乱七八糟的噪声难以滤除时&a…

ROS | Realsense中的IMU解算orientation

文章目录概述一、定义介绍二、操作教程(一)、下载并编译imu_tools功能包1.创建工作空间并初始化2.下载imu_tools并编译(二)、修改配置1.修改imu_tools源码2.修改launch文件3.启动解算概述 本文详细介绍了如何使用ROS自带的工具解算6轴IMU&#xff0c;获取其位姿。 一、定义介绍…