当前位置: 首页 > news >正文

Java中实现文件上传

目录

1、文件上传本地

1.1 原理

1.2 如何使用文件上传

1.2.1 引入文件上传的依赖

 1.2.2 配置文件上传拦截器

 1.2.3 完成文件上传的代码

2、文件上传oss服务器 

2.1 为什么需要上传到oss服务器

2.2 如何使用oss 

2.2.1 开启oss服务

 2.2.2 在Java中引入依赖

2.2.3 查看自己ID和密钥

2.2.4 代码

3、案例

3.1 引入相关依赖 

3.2  创建实体类

3.3 创建controller层

3.3.1 创建StudentController

3.3.2 创建UploadController

3.4 创建dao层

3.4.1 BaseDao

3.4.2 StudentDao

3.5 配置SpringMvc配置文件

3.6 编写upload.jsp文件


1、文件上传本地

1.1 原理

1.2 如何使用文件上传

1.2.1 引入文件上传的依赖

 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--jackson依赖:把controller层方法返回的java对象转化为json字符串--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!--文件上传依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency></dependencies>

 1.2.2 配置文件上传拦截器

    <!--文件上传解析器 id:必须为multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置文件上传的大小 单位为byte字节 1M=1024kb=1024b  10*1024*1024--><property name="maxUploadSize" value="10485760"/><!--设置编码--><property name="defaultEncoding" value="utf-8"/></bean>

 1.2.3 完成文件上传的代码

 <%--表单: 提交方式必须为post   enctype编码:multipart/form-data文件编码--%><form method="post" action="/upload" enctype="multipart/form-data"><%--input必须设置文件文件框 而且必须起名称--%>选择上传的文件:<input type="file" name="myfile"/><br><input type="submit" value="上传"/></form>
@Controller
public class UploadController {/**** @param myfile 接受你上传的文件对象信息封装到该类。该类中可以获取上传文件的信息。比如:文件名 文件大小 文件后缀等*               这个名称必须为文件上传表单的文件框的名称一致* @return*/@PostMapping("/upload")public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {//获取tomcat上下文中的指定目录的路径String realPath = request.getSession().getServletContext().getRealPath("/upload");//根据上面的路径创建一个文件对象File file=new File(realPath);//如果没有该目录则创建if (!file.exists()) {file.mkdirs();}//把上传的文件转移到upload目录下--重名覆盖了String uuid = UUID.randomUUID().toString().replace("-", "");File target=new File(realPath+"/"+(uuid+myfile.getOriginalFilename()));myfile.transferTo(target);return "success";}
}

2、文件上传oss服务器 

2.1 为什么需要上传到oss服务器

  1. 如果项目搭建了集群。那么导致文件数据无法共享。

  2. 如果项目的target删除了。导致文件数据丢失。

2.2 如何使用oss 

2.2.1 开启oss服务

oss服务器网址

点击上面链接,跳转到阿里云的oss服务器页面,完成登录后,会进入oss管理控制台,如图所示

 然后点击创建Bucket,操作如下图

 2.2.2 在Java中引入依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>

2.2.3 查看自己ID和密钥

2.2.4 代码

@PostMapping("/upload2")public String upload2(MultipartFile myfile){// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-beijing.aliyuncs.com";// 填写Bucket名称,例如examplebucket。String bucketName = "XXXXX";//上传到oss后的名字String objectName = UUID.randomUUID().toString().replace("-","")+myfile.getOriginalFilename();// 创建OSSClient实例。/*** String endpoint,自己的endpoint* String accessKeyId, 自己的id* String secretAccessKey自己的密钥*/String accessKeyId="XXXXXXX";String secretAccessKey="XXXXXXX";OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,secretAccessKey);try {InputStream inputStream = myfile.getInputStream();// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (Exception oe) {}finally {if (ossClient != null) {ossClient.shutdown();}}return "success";}

3、案例

springmvc+jdbc+elementui+vue

添加和展示所有的功能

3.1 引入相关依赖 

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ykq</groupId><artifactId>qy174-springmvc04</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><!--servlet依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--jackson依赖:把controller层方法返回的java对象转化为json字符串--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency><!--文件上传依赖--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version></dependency><!--oss的依赖--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency><!--mysql的jar--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency></dependencies>
</project>

3.2  创建实体类

@Data
public class Student implements Serializable {private Integer id;private String name;private String phone;private String email;private Integer age;private Byte gender;private Date createtime;private String head;}

3.3 创建controller层

3.3.1 创建StudentController

@Controller
@RequestMapping("/student")
public class StudentController {private StudentDao studentDao=new StudentDao();@GetMapping("/list")@ResponseBody //把java对象转化为json字符串public List<Student> list(){List<Student> list = studentDao.findAll();return list;}@PostMapping("/add")@ResponseBody //把java对象转化为json字符串public int add(@RequestBody Student student){int add = studentDao.add(student.getName(), student.getPhone(), student.getEmail(), student.getAge(), student.getGender(), student.getHead());return add;}
}

3.3.2 创建UploadController

@Controller
public class UploadController {/**** @param myfile 接受你上传的文件对象信息封装到该类。该类中可以获取上传文件的信息。比如:文件名 文件大小 文件后缀等*               这个名称必须为文件上传表单的文件框的名称一致* @return*/@PostMapping("/upload")public String upload(MultipartFile myfile, HttpServletRequest request) throws IOException {//获取tomcat上下文中的指定目录的路径String realPath = request.getSession().getServletContext().getRealPath("/upload");//根据上面的路径创建一个文件对象File file=new File(realPath);//如果没有该目录则创建if (!file.exists()) {file.mkdirs();}//把上传的文件转移到upload目录下--重名覆盖了String uuid = UUID.randomUUID().toString().replace("-", "");File target=new File(realPath+"/"+(uuid+myfile.getOriginalFilename()));myfile.transferTo(target);return "success";}@PostMapping("/upload2")@ResponseBodypublic String upload2(MultipartFile file){// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。String endpoint = "oss-cn-beijing.aliyuncs.com";// 填写Bucket名称,例如examplebucket。String bucketName = "qy174-8888";//上传到oss后的名字String objectName = UUID.randomUUID().toString().replace("-","")+file.getOriginalFilename();// 创建OSSClient实例。/*** String endpoint,自己的endpoint* String accessKeyId, 自己的id* String secretAccessKey自己的密钥* XX* XXX*/String accessKeyId="XXX";String secretAccessKey="XXX";OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,secretAccessKey);try {InputStream inputStream = file.getInputStream();// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 创建PutObject请求。PutObjectResult result = ossClient.putObject(putObjectRequest);String path="https://"+bucketName+"."+endpoint+"/"+objectName;return path;} catch (Exception oe) {}finally {if (ossClient != null) {ossClient.shutdown();}}return "失败";}
}

3.4 创建dao层

3.4.1 BaseDao

public class BaseDao {protected Connection conn;protected PreparedStatement ps;protected ResultSet rs;//数据源对象private static DataSource dataSource;//静态代码块中static {try {//创建一个属性对象Properties properties = new Properties();//加载属性文件InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");properties.load(inputStream);//获取连接池对象dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//获取连接对象public void getConn() throws Exception{conn = dataSource.getConnection();}//关闭资源public void closeAll(){if(rs!=null){try {rs.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(ps!=null){try {ps.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}//通用的增删改方法public int edit(String sql,Object...params){try {getConn();ps=conn.prepareStatement(sql);//为占位符赋值for(int i=0;i<params.length;i++){ps.setObject(i+1,params[i]);}int row = ps.executeUpdate();return row;} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return 0;}}
/**1. 四个属性: connection preparedStatement ResultSet  DataSource2. 静态代码块:[获取连接池]3. 获取连接对象的方法4. 关闭资源方法5. 通用的增删改方法*/

3.4.2 StudentDao

public class StudentDao extends BaseDao {//求总条数 select count(*) from t_studentpublic int getCount(){try {getConn();String sql="select count(*) as c from t_student";ps=conn.prepareStatement(sql);rs=ps.executeQuery();while (rs.next()){int c = rs.getInt("c");return c;}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return 0;}//查询所有学员信息--单元测试public List<Student> findAll(){List<Student> list=new ArrayList<Student>();try {getConn();String sql="select * from t_student";ps=conn.prepareStatement(sql);rs=ps.executeQuery();while (rs.next()){Student s=new Student();s.setId(rs.getInt("id"));s.setPhone(rs.getString("phone"));s.setEmail(rs.getString("email"));s.setAge(rs.getInt("age"));s.setName(rs.getString("name"));s.setCreatetime(rs.getDate("createtime"));s.setGender(rs.getByte("gender"));s.setHead(rs.getString("head"));list.add(s);}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return list;}//根据id查询学员信息public Student findById(String id){Student s=null;try {getConn();String sql="select * from t_student where id=?";ps=conn.prepareStatement(sql);ps.setObject(1,id);rs=ps.executeQuery();while (rs.next()){s=new Student();s.setId(rs.getInt("id"));s.setPhone(rs.getString("phone"));s.setEmail(rs.getString("email"));s.setAge(rs.getInt("age"));s.setName(rs.getString("name"));s.setCreatetime(rs.getDate("createtime"));s.setGender(rs.getByte("gender"));s.setHead(rs.getString("head"));}} catch (Exception e) {e.printStackTrace();} finally {closeAll();}return s;}//添加方法public int add(String name,String phone,String email,int age,int gender,String head){String sql="insert into t_student(id,name,phone,email,age,createtime,gender,head) values(null,?,?,?,?,now(),?,?)";return edit(sql,name,phone,email,age,gender,head);}//修改public int update(String id,String name,String phone,String email,int age,int gender){String sql="update t_student set name=?,phone=?,email=?,age=?,gender=?,createtime=now() where id=?";return edit(sql,name,phone,email,age,gender,id);}//删除方法public int delete(String id){String sql="delete from t_student where id=?";return edit(sql,id);}

3.5 配置SpringMvc配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--com.ykq 扫描该包以及该包下的子包--><context:component-scan base-package="com.Hs"/><!--开启注解驱动 不要导错mvc 默认使用的不是注解模式--><mvc:annotation-driven/><!--放行静态资源--><mvc:default-servlet-handler/><!--视图解析--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/views/"/><property name="suffix" value=".jsp"/></bean><!--文件上传解析器 id:必须为multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--设置文件上传的大小 单位为byte字节 1M=1024kb=1024b  10*1024*1024--><property name="maxUploadSize" value="10485760"/><!--设置编码--><property name="defaultEncoding" value="utf-8"/></bean></beans>

3.6 编写upload.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%--表单: 提交方式必须为post   enctype编码:multipart/form-data文件编码--%><form method="post" action="/upload2" enctype="multipart/form-data"><%--input必须设置文件文件框 而且必须起名称--%>选择上传的文件:<input type="file" name="myfile"/><br><input type="submit" value="上传"/></form>
</body>
</html>

相关文章:

Java中实现文件上传

目录 1、文件上传本地 1.1 原理 1.2 如何使用文件上传 1.2.1 引入文件上传的依赖 1.2.2 配置文件上传拦截器 1.2.3 完成文件上传的代码 2、文件上传oss服务器 2.1 为什么需要上传到oss服务器 2.2 如何使用oss 2.2.1 开启oss服务 2.2.2 在Java中引入依赖 2.2.3 查看自…...

一种别样的Unicode Python编码方式,完美转换表情和阿拉伯语

我们可能有时候在处理字符时需要处理到非ASCII的字符&#xff0c;比如将表情、阿拉伯语转换为Unicode字符&#xff0c;从而避免在传输时会出现乱码的情况。 Unicode验证网站&#xff1a; unicode转换网站 目的&#xff1a;转换下面除ASCII字符外的字符为Unicode字符&#x1f…...

小白的晋升之路

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…...

WebLogic:CVE-2017-10271[XML反序列化]

漏洞成因 Weblogic的WLS Security组件对外提供 webservice服务 其中使用了XMLDecoder来 解析用户传入的XML数据 在解析的过程中出现 反序列化漏洞 &#xff0c;导致可执行任意命令 原理&#xff1a;https://xz.aliyun.com/t/10172 靶场部署 1.进入靶场目录 cd /vulhub-maste…...

Day13--JavaWeb学习之Servlet后端渲染界面

基于Day12中登录页面实现的修改&#xff0c;这里实现的是如果登录成功&#xff0c;跳到LoginSuccess页面中展示后端查询到数据库中的信息&#xff0c;并实现在浏览器实现插入数据和删除数据&#xff08;mybaits&#xff09;。 当输入账号密码正确后进入LoginSuccess页面&#x…...

【MySQL】全面剖析索引失效、回表查询与索引下推

1.索引失效的情况 以tb_user表举例&#xff0c;id为主键索引、name和phone字段上建立了一个普通索引&#xff0c;name和phone均为varchar类型。 索引列运算 当在 WHERE 子句或 JOIN 子句中对列使用函数或表达式时&#xff0c;索引会失效。 执行以下语句&#xff0c;可以发现执…...

1、爬⾍概述

1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Crawler&#xff09;是一种通过编写程序自动访问并提取互联网上数据的技术。爬虫可以帮助我们在浏览网页时自动收集和保存一些有用的数据&#xff0c;例如图片、视频和文本信息。简单来说&#xff0c;爬虫就是自动化的浏览器。…...

科普文:微服务之分布式链路追踪SkyWalking单点服务搭建

1. 概述 1.1 概念 SkyWalking 是什么&#xff1f; SkyWalking 极简入门 | Apache SkyWalking FROM Apache SkyWalking 分布式系统的应用程序性能监视工具&#xff0c;专为微服务、云原生架构和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架构而设计。 提供分布式追…...

R 语言学习教程,从入门到精通,R的安装与环境的配置(3)

1、R 基础语法 一门新的语言学习一般是从输出 “Hello, World!” 程序开始&#xff0c;R 语言的 “Hello, World!” 程序代码如下&#xff1a; myString <- "Hello, World!" print ( myString )以上示例将字符串 “Hello, World!” 赋值给 myString 变量&#x…...

【Pageadmin】之cms漏洞

方法一&#xff1a;上传模块拿webshell 首页如下 第一步&#xff1a;访问admin/login&#xff0c;登录后台 第二步&#xff1a;使用哥斯拉工具生成payload 然后自动生成了一个asp的payload 第三步&#xff1a;上传文件 将asp文件压缩为压缩包&#xff0c;上传。 解压访问1.asp…...

AIGC重塑设施农业:让农事操作更智能,生产效率更高

设施农业是现代农业的重要组成部分,随着人工智能等前沿技术的快速发展,这个领域迎来了新的变革机遇。尤其是大语言模型(Large Language Model,LLM)技术的崛起,其强大的语言理解和知识汇聚能力,为设施农业智能化发展带来了新的想象空间。本文将深入探讨大模型技术在设施农业生产…...

netty应用-手写RPC

文章目录 手写RPC之案例定位与通信过程介绍RPC框架案例定位服务端与客户端架构通信过程1. 服务注册与发现2. 请求序列化与传输3. 请求处理与响应4. 响应反序列化与结果处理实现细节1. 服务端2. 客户端技术选型关键挑战总结手写RPC之请求响应通信协议定制协议结构示例消息头格式…...

私域流量变迁与精细移动化趋势下的AI智能名片小程序源码应用探索

摘要&#xff1a;随着移动互联网技术的飞速发展&#xff0c;私域流量的价值日益凸显&#xff0c;成为企业营销战略的重要组成部分。私域流量的精细化和移动化趋势不仅改变了传统的营销格局&#xff0c;也为新兴技术的应用提供了广阔空间。本文深入探讨了私域流量的变迁历程&…...

数据结构初阶之排序(下)

前言 上一期内容中我们了解了基本排序中的插入与选择排序&#xff0c;今天我将为大家带来剩下的几种排序算法 快速排序 快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;…...

RGB图像的读取与保存

目录 1、安装imageio 2、读取照片 3、保存照片 4、resize 5、示例代码 1、安装imageio pip install imageio -i https://pypi.tuna.tsinghua.edu.cn/simple 2、读取照片 import imageio img imageio.imread(image_path) 3、保存照片 import imageio import numpy as…...

江协科技51单片机学习- p35 AD/DA模拟/数字采样

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

C#裁剪图像的几种方法总结

前言 我们在上位机软件开发过程中经常需要裁剪图像&#xff0c;本文就是对c#中常见的裁剪图像方法进行总结。 1、克隆 直接调用Bitmap的Clone函数&#xff0c;然后指定需要裁剪的区域即可裁剪图像&#xff0c;该种方法不会损失精度 public static Bitmap CropImage_Clone(Bi…...

被遗忘的哑终端 —— 键盘键位演变的启发者

注&#xff1a;机翻&#xff0c;未校对。 The Forgotten World of Dumb Terminals 被遗忘的哑终端世界 A quick journey through the lost age of “glass teletypes.” 快速穿越失落的“玻璃电传打字机”时代。 From the earliest days of digital computers, researchers o…...

APACHE安装与应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

预警器件控制思考

预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是&#xff0c; 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...