Springboot知识点小结

SpringBoot中的server.context-path 书接上回,首先,先看一张图片。 阅读详情

Springboot项目热部署

一、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional><!-- 防止将devtools依赖传递到其他模块中 -->
</dependency>

二、IDEA中的设置

1、File | Settings | Build, Execution, Deployment | Compiler -----> build project automatically 对勾;

2、ctrl+shift+alt+/ Registry;

3、选择compiler.automake.allow.when.app.running在后面的方框中打上√;

4、在IDEA工具类上方的Application再点击Edit Configurations...

springboot中Running Application Update Policies,下方两个选项,选择Update classes and resources。

springboot项目中加载properties文件

//confpath为properties文件的地址  如: "/license/licenseMakeConf.properties"
public LicenseMake(String confPath) {
    // 获取参数
    Properties prop = new Properties();
    try (InputStream in = getClass().getResourceAsStream(confPath)) {
        prop.load(in);
    } catch (IOException e) {
        log.error("CreateLicense Properties load inputStream error.", e);
    }
    //common param 使用参数
    priAlias = prop.getProperty("private.key.alias");
    privateKeyPwd = prop.getProperty("private.key.pwd");
    keyStorePwd = prop.getProperty("key.store.pwd");
    subject = prop.getProperty("subject");
    priPath = prop.getProperty("priPath");
}

@RequestBody、@RequestParam

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);使用@RequestBody接收数据时,一般都用POST方式进行提交。

在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

使用@requestBody注解时:

一般传递对象,以JSON的形式进行传递,请求用POST方式提交;
如果对象某个参数没有值,直接不写这个属性即可。

@RequestParam的使用方法:

public String requestparam(  
@RequestParam(value="username", required=true, defaultValue="zhang") String username)

如果传递多个值,我们可以适当改变username的类型。

三、springboot项目打war包,部署到tomcat

1.配置项目

a.修改启动类

继承SpringBootServletInitializer类,并重写覆盖configure方法,代码如下:

public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

b.剔除依赖

pom文件中添加一下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-start-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

设置项目打包方式

为打war包,注意添加第四行到对应位置就好

<groupId>com.zony</groupId>
<artifactId>PEP_PDFSecurity</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>PEP_PDFSecurity</name>
2.通过Maven的clean package进行打包
3.在第2步过程中,可能会出现错误

解决方案: 在pom.xml文件中引入以下依赖

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>3.1.0</version>
     <scope>provided</scope>
</dependency>
4.部署

把target目录下的war包放到tomcat的webapps目录下,
去bin文件夹startup.bat启动tomcat,即可自动解压war包,并部署。

5.测试

localhost:8080/Ingship/user/info?token=admin-token

Ingship是war包解析后的文件夹的名称,相当与IDEA项目中配置的content-path

四、日志

1.配置文件中添加配置
logging:
  level:
    root: INFO          #日志文件名称
  config: classpath:logback-spring.xml
2.新建日志文件配置信息

和yml配置文件在统一目录下

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<!--    <property name="LOG_HOME" value="C:/log" />D:\log-->
    <property name="LOG_HOME" value="./my-logs" />
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--设置控制台的输出级别为“ERROR”级别-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!--设置控制台的日志输出格式-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH} [%thread] %-5level %logger{50} - %msg  %n</pattern>
        </encoder>
    </appender>

    <!--info级别的日志文件设置-->
    <appender name="INFO_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志级别设置-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!--临时文件的保存位置及名称-->
        <File>${LOG_HOME}/my-info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--临时文件大小保存到一定要求后,更改文件名,成为历史日志文件-->
            <fileNamePattern>${LOG_HOME}/info-%d{yyyyMMdd}.log.%i</fileNamePattern>
            <!--保存文件的要求,达到要求后,创建新的日志文件-->
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--控制日志信息保存格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH} %-5level %logger -%msg%n</pattern>
        </layout>
    </appender>

    <!--error级别的日志文件设置-->
    <appender name="ERROR_FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <File>${LOG_HOME}/my-error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/error-%d{yyyyMMdd}.log.%i
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>20MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!--控制日志信息保存格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH} %-5level %logger -%msg%n</pattern>
        </layout>
    </appender>

    <!-- 日志输出级别 -->
    <root level="ERROR">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="ERROR_FILE"/>
        <appender-ref ref="INFO_FILE"/>
    </root>
</configuration>

五、IE浏览器下ajax请求不走后台

1.问题出现原因
1、在ie浏览器下,chrome浏览器没有此问题
2、请求的url和参数和上一次的请求一样
3、请求方式为get而不是post
2.解决办法
与出现原因对应的解决方法
1、不使用ie浏览器(不太符合实际情况)
2、在正常已有的请求参数后加一个随机数或时间戳
3、将请求类型设为post  (通常选择这种方式解决此问题)
4、将ajax的cache属性设为false(默认为true),这样就不会使用浏览器的缓存

六、项目中读取配置文件的绝对路径

//获取项目的文件夹绝对路径  GlobalsUtil当前类名称
//path不以"/"开头:当前类所在的包目录
//path以"/"开头:class path,即当前项目
sysRootDir = GlobalsUtil.class.getResource("/").getPath();
try {
    //解决路径中文乱码
    sysRootDir = URLDecoder.decode(sysRootDir, "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
System.out.println("-------------------路径:"+sysRootDir);

七、文件流读取文件并作为参数传递

当文件下载后保存在本地服务器,其他服务器想要获取本地的文件时,可以使用此方法将文件作为流传递出去。

public void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) {
    //++++++此处为返回对象+++++++
    ServletOutputStream ouStream = null;
    InputStream inStream = null;
    String responseFileName;// 显示文件名
    String responseContentType;// 显示文件类型
    int responseContentLength;// 显示字节数
    try {
        //++++++此处为返回对象+++++++
        ouStream = response.getOutputStream();
        File tmpFile = new File(filePath);
        responseFileName = tmpFile.getName();
        responseContentType = ConvertType.getType(tmpFile.getName());
        responseContentLength = (int) tmpFile.length();
        inStream = new FileInputStream(tmpFile);
        response.setContentType(responseContentType);
        response.setHeader("Content-disposition", "attach;filename=" + UriUtils.encode(responseFileName, "UTF-8"));
        response.setHeader("Pragma", "no-cache");
        response.setContentLength(responseContentLength);
        byte[] buffer = new byte[5242880];
        int len;
        while ((len = inStream.read(buffer)) > 0) {
            //++++++将文件写入+++++++
            ouStream.write(buffer, 0, len);
        }
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (inStream != null) {
            try {
                inStream.close();
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
        if (ouStream != null) {
            try {
                ouStream.flush();
                ouStream.close();
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
    }

八、MultipartFile和FIle类型相互转换

MultipartFile转换为FIle

file为MultipartFile,转换完成后在本地c盘下可看到对应的文件
String filePath = "c:\\";
File receiveFile = new File(filePath);
//MultipartFile转换为File
file.transferTo(receiveFile);

File转换为MultipartFIle

引入依赖

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
//根据文件路径获取MultipartFile文件
FileItem fileItem = getMultipartFile(file,"tempItem");
CommonsMultipartFile multipartFile = new CommonsMultipartFile(fileItem);

九、清空某个文件夹

public static boolean deleteDir(String path){
    File file = new File(path);
    if(!file.exists()){//判断是否待删除目录是否存在
        System.err.println("The dir are not exists!");
        return false;
    }

    String[] content = file.list();//取得当前目录下所有文件和文件夹
    for(String name : content){
        File temp = new File(path, name);
        if(temp.isDirectory()){//判断是否是目录
            deleteDir(temp.getAbsolutePath());//递归调用,删除目录里的内容
            temp.delete();//删除空目录
        }else{
            if(!temp.delete()){//直接删除文件
                System.err.println("Failed to delete " + name);
            }
        }
    }
    return true;
}

十、springboot集成数据库mysql和hibernate

1.导入依赖
<!--连接mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!--添加JDBC依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- jpa配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>
<!--lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>
2.在springboot的yml配置文件里配置mysql的连接信息
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/pep_pdfsecurity?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
  servlet:
    multipart:
      #上传每个文件的配置最大为1GB
      max-file-size: 1GB
      #单次请求的文件的总数不能大于4GBMB
      max-request-size: 4GB
3.创建工具类Result
package com.zony.lngship.util;

/**
*@Description 返回结果数据
*@Param
*@Return
*@Author ChuXu
*@Date 2021/11/18
*@Time 9:45
*/
public class Result {
    //相应码
    private Integer code;
    //信息
    private String message;
    //返回数据
    private Object data;

    public Result() {
    }

    public Result(Integer code, String message, Object data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
4.创建实体类对应数据库表
package com.zony.app.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
/**
*@Description 文件表
*@Param
*@Return
*@Author ChuXu
*@Date 2022/3/24
*@Time 17:08
*/
@Entity     //表名
@Table(name = "file_info")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class FileInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private String id;

    @Column(name = "file_name")
    private String fileName;

    @Column(name = "file_path")
    private String filePath;

    @Column(name = "file_size")
    private String fileSize;

    @Column(name = "page")
    private String page;

    @Override
    public String toString() {
        return "File{" +
            "id='" + id + '\'' +
            ", fileName='" + fileName + '\'' +
            ", filePath='" + filePath + '\'' +
            ", fileSize='" + fileSize + '\'' +
            ", page='" + page + '\'' +
            '}';
    }
}
5.创建Repository 数据库的访问接口
package com.zony.app.respository;

import com.zony.app.entity.FileInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

												//表名称     主键类型
public interface FileInfoDao extends JpaRepository<FileInfo,String> {

    //根据id查询文件信息
    @Query(value = "select * from file_info where id = ?1",nativeQuery = true)
    FileInfo seleteFileInfoById(String id);

    //根据id删除文件信息
    @Transactional
    @Modifying
    @Query(value = "delete from file_info where id = ?1",nativeQuery = true)
    void deleteFileInfoById(String id);

    //修改文件信息
    @Transactional
    @Modifying
    @Query(value = "update file_info f set f.file_name = ?2,f.file_path = ?3,f.file_size = ?4,f.page = ?5 where f.id = ?1",nativeQuery = true)
    void updateFileInfo(String id,String fileName,String filePath,String fileSize,String page);
}
6.创建服务层service
package com.zony.app.service;

import com.zony.app.entity.FileInfo;

import java.util.List;

public interface FileInfoService {

    public List<FileInfo> selectAllFileInfo();

    public FileInfo seleteFileInfoById(String id);

    public void insertFileInfo(FileInfo fileInfo);

    public void deleteFileInfoById(String id);

    public void updateFileInfo(FileInfo fileInfo);
}
7.创建实现类impl
package com.zony.app.service.serviceimpl;
import com.zony.app.entity.FileInfo;
import com.zony.app.respository.FileInfoDao;
import com.zony.app.service.FileInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class FileInfoServiceImpl implements FileInfoService {
    @Autowired
    private FileInfoDao fileInfoDao;

    @Override
    public List<FileInfo> selectAllFileInfo() {
        List<FileInfo> fileInfoList = fileInfoDao.findAll();
        return fileInfoList;
    }

    @Override
    public FileInfo seleteFileInfoById(String id) {
        FileInfo fileInfo = fileInfoDao.seleteFileInfoById(id);
        return fileInfo;
    }

    @Override
    public void insertFileInfo(FileInfo fileInfo) {
        fileInfoDao.save(fileInfo);
    }

    @Override
    public void deleteFileInfoById(String id) {
        fileInfoDao.deleteFileInfoById(id);
    }

    @Override
    public void updateFileInfo(FileInfo fileInfo) {
        fileInfoDao.updateFileInfo(fileInfo.getId(),fileInfo.getFileName(),fileInfo.getFilePath(),fileInfo.getFileSize(),fileInfo.getPage());
    }
}
8.创建controller层
package com.zony.app.controller;

import com.zony.app.entity.FileInfo;
import com.zony.app.service.FileInfoService;
import com.zony.app.util.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
*@Description 文件信息记录到数据库中
*@Param
*@Return
*@Author ChuXu
*@Date 2022/3/24
*@Time 17:47
*/
@RestController
@RequestMapping("/FileInfoController")
public class FileInfoController {

    private final static Logger log = LoggerFactory.getLogger(FileInfoController.class);

    @Autowired
    private FileInfoService fileInfoService;

    /**
    *@Description 向文件信息表中添加一条信息
    *@Param [variables]
    *@Return com.zony.app.util.Result
    *@Author ChuXu
    *@Date 2022/3/25
    *@Time 10:56
    */
    @RequestMapping(value = "/insertFileInfo", method = RequestMethod.POST)
    public Result insertFileInfo(@RequestBody Map<String, Object> variables) {
        Result result = new Result();

        FileInfo fileInfo = new FileInfo();
        fileInfo.setFileName((String) variables.get("fileName"));
        fileInfo.setFilePath((String) variables.get("filePath"));
        fileInfo.setFileSize((String) variables.get("fileSize"));
        fileInfo.setPage((String) variables.get("page"));

        fileInfoService.insertFileInfo(fileInfo);

        result.setCode(200);
        result.setMessage("success");
        return result;
    }

    /**
    *@Description 根据id删除文件信息
    *@Param [id]
    *@Return com.zony.app.util.Result
    *@Author ChuXu
    *@Date 2022/3/25
    *@Time 10:59
    */
    @RequestMapping(value = "/deleteFileInfoById", method = RequestMethod.POST)
    public Result deleteFileInfoById(@RequestParam(value = "id") String id) {
        Result result = new Result();

        fileInfoService.deleteFileInfoById(id);

        result.setCode(200);
        result.setMessage("success");
        return result;
    }

    /**
    *@Description 修改文件信息
    *@Param [variables]
    *@Return com.zony.app.util.Result
    *@Author ChuXu
    *@Date 2022/3/25
    *@Time 11:04
    */
    @RequestMapping(value = "/updateFileInfo", method = RequestMethod.POST)
    public Result updateFileInfo(@RequestBody Map<String, Object> variables) {
        Result result = new Result();

        FileInfo fileInfo = new FileInfo();
        fileInfo.setId((String) variables.get("id"));
        fileInfo.setFileName((String) variables.get("fileName"));
        fileInfo.setFilePath((String) variables.get("filePath"));
        fileInfo.setFileSize((String) variables.get("fileSize"));
        fileInfo.setPage((String) variables.get("page"));

        fileInfoService.updateFileInfo(fileInfo);

        result.setCode(200);
        result.setMessage("success");
        return result;
    }

    /**
    *@Description 查询单个文件信息
    *@Param [id]
    *@Return com.zony.app.util.Result
    *@Author ChuXu
    *@Date 2022/3/25
    *@Time 11:05
    */
    @RequestMapping(value = "/seleteFileInfoById", method = RequestMethod.POST)
    public Result seleteFileInfoById(@RequestParam(value = "id") String id) {
        Result result = new Result();

        FileInfo fileInfo = fileInfoService.seleteFileInfoById(id);

        result.setCode(200);
        result.setMessage("success");
        result.setData(fileInfo);
        return result;
    }

    /**
    *@Description 查询所有文件信息
    *@Param []
    *@Return com.zony.app.util.Result
    *@Author ChuXu
    *@Date 2022/3/25
    *@Time 11:07
    */
    @RequestMapping(value = "/selectAllFileInfo", method = RequestMethod.POST)
    public Result selectAllFileInfo() {
        Result result = new Result();

        List<FileInfo> fileInfoList = fileInfoService.selectAllFileInfo();

        result.setCode(200);
        result.setMessage("success");
        result.setData(fileInfoList);
        return result;
    }
}

十一、controller层传参

1.map集合

一般用来传递实体类的JSON,使用postman传参直接传递一个JSON至后端。

@RequestBody Map<String, Object> variables
2.单个参数

一般用来传递单个参数,如人员的ID等。

使用postman传参直接在param中添加key,value即可。

@RequestParam(value = "id") String id

@RequestBody和@RequestParam的作用都是用来将前端传递过来的参数,直接绑定到后端controller控制器设置的参数中,区别在于:

@RequestBody限定了前端传递的参数必须为JSON格式,并且前端不能使用GET方式提交数据,而是使用POST方式提交,而且@RequestBody只能有一个。

@RequestParam用于接收url中key-value传递的参数,通常用于GET请求,POST请求也可以使用,可以有很多个。

3.文件流

传递文件流,后台一般用MultipartFile类接收,postman设置好后直接选择本地文件即可。

postman:Body–>form-data–>添加key,value即可,key类型选择file。

@RequestPart(name = "file") MultipartFile file

十一、controller层传参

1.map集合

一般用来传递实体类的JSON,使用postman传参直接传递一个JSON至后端。

@RequestBody Map<String, Object> variables
2.单个参数

一般用来传递单个参数,如人员的ID等。

使用postman传参直接在param中添加key,value即可。

@RequestParam(value = "id") String id

@RequestBody和@RequestParam的作用都是用来将前端传递过来的参数,直接绑定到后端controller控制器设置的参数中,区别在于:

@RequestBody限定了前端传递的参数必须为JSON格式,并且前端不能使用GET方式提交数据,而是使用POST方式提交,而且@RequestBody只能有一个。

@RequestParam用于接收url中key-value传递的参数,通常用于GET请求,POST请求也可以使用,可以有很多个。

3.文件流

传递文件流,后台一般用MultipartFile类接收,postman设置好后直接选择本地文件即可。

postman:Body–>form-data–>添加key,value即可,key类型选择file。

@RequestPart(name = "file") MultipartFile file
KUKA .RSI 软件包 KUKA RSI软件包通过XML文件使得机器人与外部设备(传感器通讯)通讯成为了可能,但仍存在诸多限制,该模块最多允许9台设备进行连接,有限的IO口,匮乏的功能,并且需要投入大量精力琢磨相关说明文档。为此开发人员针对KUKA实时通讯,做了一些开源的接口使得上位机与机械臂的通讯更为简单。 阅读详情

相关推荐

FPGA_AD9361实战

1.参考网站。

Pual_Georg的博客 748

springboot contentPath问题

背景: 今天一个系统(springboot 后端 前端h5)需要接入其他的app,其他app要求给一个统一的域名和端口进行代理,该域名需要能够访问到前端h5也要能够访问到后端的服务。但是我现在的h5和后端服务是两个不同的域名,所以需要搭建一个通用域名。 网络管理人员提示,h5和后端服务都是直接根目录访问,所以不能够配置同一个域名,需要h5或者后端服务更改路径,不能通过跟路劲访问,所以此时用到了contentPath来设置一层目录。 之前直接这么用的: server.context-path=/m

weixin_38972910的博客 2699

前端零代码丨UIOTOS + NodeRed:无代码搭建工控上位机的绝配组合!

用户类型价值硬件产品商软硬一体方案,无代码GUI上位机成新卖点软件服务商售前原型演示利器,交付成本降低至1/3平台开发商融合无代码技术,同质化竞争中脱颖而出🚀 总结UIOTOS的前端零代码设计(页面嵌套、属性继承、节点连线)与NodeRed的后端流程自动化,堪称工控与IoT开发的黄金组合。无论是串口通信、SCADA监控还是业务管理,均能实现“无代码交付”,真正让前端不求人,硬件交互触手可及!探索更多案例:UIOTOS官网在线体验。

2502_91192798的博客 757

Springboot中的context-path (url前缀)

文章目录作用注意项以及采坑注意项踩坑参考 1.定义   Context path of the application. 应用的上下文路径,也可以称为项目路径,是构成url地址的一部分。 2.如何配置   SpringBoot 2.0.0.RELEASE版本以及之后: server: servlet: context-path: /myapp1 SpringBoot 2.0.0.RELEASE版本以及之前 server: context-path: /myapp1 作用 假设我的应用有个

m0_45406092的博客 3万+

【杰理AC696X】ADKEY复用指示灯不定时出现灯不亮或按键失灵的问题

测试SDK版本:《ac696n_soundbox_sdk_v1.5.0-20211217》ADKEY复用指示灯的做法多用于蓝牙小音箱,IC引脚越来越少,复用也就用的越多了,不过,在使用前应评估好功能,因为复用的做法,肯定会牺牲点东西的,如果体验感啥的。 比如这个图,(V-)按键按下时,LED是会一直导通发光的,按不同阻值的按键还有亮度不一致的问题,这样的问题有的客户是不接受的,这就要另寻他法了。某天调好案子,放在一边测试时,发现指示灯不亮了,按键也不起作用,想起之前AC692系列也有类似的问题,很快就定位到

xx842678的博客 1656

Spring AI实现RAG(检索增强生成)详解与实践

支持多种文件格式的文档加载实现高效的向量存储和检索构建智能的问答系统提供可追溯的知识服务RAG技术为AI应用提供了强大的知识增强能力,使得模型能够基于实际文档生成准确、可靠的回答。

beiduofen2011的专栏 1238

springboot之context-path

springboot之context-path context-path是应用的上下文,所有该应用下web层的url地址都需要添加上下文,另外配置context-path对于使用nginx分发请求也很有帮助 upstream task{ server 100.100.88.152:8097; check interval=30000 rise=2 fall=3 timeout=10...

红豆的博客 5303

【可信数据空间-部署方案】

此部署架构体现了以下几个核心原则:去中心化: 数据存储和处理完全分布在各个参与者端,运营方只提供核心的协调和信任基础设施。安全边界清晰: 通过VPC、DMZ、防火墙、K8s命名空间等技术,在每个层级都建立了严格的安全边界。高可用与弹性: 所有关键服务均以集群方式部署,避免单点故障,并能根据负载动态伸缩。云原生: 全面采用容器化和Kubernetes编排,简化部署、管理和运维复杂度。合规性: 架构设计天然满足数据驻留要求(数据留在企业本地),并为所有操作提供不可篡改的审计追踪能力。

u014716614的博客 771

springboot简介及知识点小结

个人笔记,如有疑问,请联系。

lingdu6633的博客 1095

论文必备 - YOLO26统计数据集中大、中、小目标数量,附完整代码和详细使用步骤

数据集是由微软开发维护的大型图像数据集。数据集标注类型对应任务包括物体检测、关键点检测、实例分割、stuff分割(没有特定形状的物体),全景分割人体关键点, 人体密度检测等。官网数据规模和样本特点数据规模大:总共包含32.8万张图像)。其中标注过的图像超过 20 万张,拥有 150 万个目标实例,数据量丰富,能够为模型训练提供充足的信息。类别丰富:包含80个目标类别和91个“stuff”类别。目标类别涵盖了日常生活中常见的各种物体,如人、动物、交通工具、生活用品等;stuff。

Limiiiing的博客 265

基于潜在空间分数匹配的混合型表格数据合成方法

然而,在我们的模型中,β 预计会更小,因为我们不需要嵌入的分布精确地遵循标准高斯分布,因为我们还有一个额外的扩散模型。受 Transformer 在表格数据分类/回归任务中取得成功的启发,我们首先为每一列学习一个独特的标记器,然后将标记(列)级表示输入到 Transformer 中,以捕捉列之间错综复杂的关系。在第 4 节中,我们证明了通过这种设计,TABSYN 可以在不到 20 次函数评估(NFE)的情况下生成高质量的合成表格数据,这比其他基于扩散的表格数据合成方法要少得多。是标记器的可学习参数。

步子哥的博客 853

SpringBoot知识点小结

1. 什么是 spring boot? spring boot 是为 spring 服务的,是用来简化新 spring 应用的初始搭建以及开发过程的。 2. 为什么要用 spring boot? 配置简单 独立运行 自动装配 无代码生成和 xml 配置 提供应用监控 易上手 提升开发效率 3. spring boot 核心配置文件是什么? spring boot 核心的两个配置文件: appl...

kuaimeidong的博客 183

大模型工作流Dify面试题及参考答案

设计一个基于 Dify 的智能摘要与重点提取 Agent,需结合Prompt 工程、模型能力配置和工作流优化,确保对长文本的高效解析和关键信息提炼。1. 明确任务需求与输入输出输入:长文本内容(如文章、报告、会议记录)或文本 URL输出摘要:简洁概括原文核心内容,控制在原文长度的 10%-20%重点列表:分点列出关键数据、结论、行动项等可选:关键词提取、情感倾向分析示例场景输入:一篇 5000 字的行业报告。

大模型大数据攻城狮的专栏 2510

Springboot — 知识点小结(学习、面试必备)

1. SpringBoot 简介 SpringBoot 是简化 Spring 应用开发的一个框架。他整合了 Spring 的技术栈,提供各种标准化的默认配置。使得我们可以快速开发 Spring 项目,免掉 xml 配置的麻烦。降低 Spring 项目的成本。 2. SpringBoot 的优缺点 使编码配置部署都变得很简单。缺点可能就是自动注入的 bean ,不是特别清楚,有可能会冲突。 由于篇幅有限,这里只展示一部分,完整版我已经整理成了文档,有需要的朋友可以点一点下方链接免费领取 链接:1103806

weixin_48655626的博客 487

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

spring boot之session知识点小结

一、 session简介 1.服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session。session中默认保存的是当前用户的信息。因此,在需要保存其他用户数据时,我们可以自己给session添加属性。session(会话)可以看为是一种标识,通过带session的请求,可以让服务器知道是谁...

qq_29964641的博客 754

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SpringBoot 系列教程之事务隔离级别知识点小结

SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读、不可重复读、幻读的具体场景 I. 基础知识 在进入正文之前,先介绍一下事务隔离级别的一些基础知识点,详细内容,推荐参考博文 mysql 之锁与事务...

小灰灰blog的专栏 574

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【SpringBoot MQ 系列】RabbitMq 核心知识点小结

【MQ 系列】RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 AMQP 协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍 rabbitmq 的一些基本知识点 特点 基本概念 消息投递消费的几种姿势 事务 集群 I. 基本知识...

小灰灰blog的专栏 523

【SpringBoot WEB系列】异步请求知识点与使用姿势小结

【SpringBoot WEB系列】异步请求知识点与使用姿势小结 在 Servlet3.0 就引入了异步请求的支持,但是在实际的业务开发中,可能用过这个特性的童鞋并不多? 本篇博文作为异步请求的扫盲和使用教程,将包含以下知识点 什么是异步请求,有什么特点,适用场景 四种使用姿势: AsyncContext 方式 Callable WebAsyncTask DeferredResult ...

小灰灰blog的专栏 1130

深入浅出Spring Boot框架--6个知识点小结!

一、SpringBoot简介 1.什么是SpringBoot 产生背景:Spring开发比较繁琐,配置文件很多,部署流程复杂,整合第三方框架难度大。这会降低开发效率 SpringBoot是一个简化Spring应用创建和开发的框架 整合了整个Spring技术栈,是JavaEE开发一站式解决方案 2.为什么使用SpringBoot 优点: 可以快速构架Spring项目,并与主流框架进行集成 内置Servlet容器,不需要手动部署war包 使用starter管理依赖并进行版本控制 大量自动配置,简化开发 提供准

SQY0809的博客 477

springboot testcontext @sql_SpringBoot 系列教程之事务隔离级别知识点小结

SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上,并通过实例演示不同的事务隔离级别下,脏读、不可重复读、幻读的具体场景I. 基础知识 在进入正文之前,先介绍一下事务隔离级别的一些基础知识点,详细内容,推荐参考博文mysql 之锁与事务[1]1. 基...

weixin_39534208的博客 216

springboot profile_Springboot — 知识点小结(学习、面试必备)

1. SpringBoot 简介SpringBoot 是简化 Spring 应用开发的一个框架。他整合了 Spring 的技术栈,提供各种标准化的默认配置。使得我们可以快速开发 Spring 项目,免掉 xml 配置的麻烦。降低 Spring 项目的成本。2. SpringBoot 的优缺点使编码配置部署都变得很简单。缺点可能就是自动注入的 bean ,不是特别清楚,有可能会冲突。由于篇幅有限,这...

weixin_39896256的博客 112

Java学习知识点小结20(SpringBoot框架)

目录????Spring Boot入门????Spring Boot使用 ????Spring Boot入门 简介: SpringBoot用来简化Spring应用开发,是整个Spring技术栈的大整合,约定大于配置 优点: 快速创建独立运行的Spring项目 使用嵌入式的Servlet容器,应用无需打成WAR包 starters(启动器)自动依赖与版本控制 大量的自动配置,简化开发,也可修改默认值 无需配置XML,无代码生成,开箱即用 准生产环境的运行时应用监控 与云计算天然集成 微服务: 是一种架构风

Hsiao99的博客 613

【SpringBoot WEB 系列】异步请求知识点与使用姿势小结

一个正常调用,吭哧吭哧执行完毕之后直接返回,这个叫同步;接收到调用,自己不干,新开一个线程来做,主线程自己则去干其他的事情,等后台线程吭哧吭哧的跑完之后,主线程再返回结果,这个就叫异步。

程序员高级码农的博客 1032

异步接口同步返回_【SpringBoot WEB系列】异步请求知识点与使用姿势小结

【SpringBoot WEB系列】异步请求知识点与使用姿势小结 在 Servlet3.0 就引入了异步请求的支持,但是在实际的业务开发中,可能用过这个特性的童鞋并不多?本篇博文作为异步请求的扫盲和使用教程,将包含以下知识点什么是异步请求,有什么特点,适用场景四种使用姿势: AsyncContext 方式CallableWebAsyncTaskDeferredResultI. 异步请求 异步对于我...

weixin_39850167的博客 1166
上一篇: License文档
下一篇: Springboot
策马出凉州
博客等级 码龄7年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值