SpringMVC【文件上传(原生方式上传、上传多文件、异步上传、跨服务器上传 ) 】(五)-全面详解(学习总结---从入门到深化)

news2024/11/25 18:34:44

目录

SpringMVC文件上传_原生方式上传 

SpringMVC文件上传_SpringMVC方式上传

 SpringMVC文件上传_上传多文件

SpringMVC文件上传_异步上传

SpringMVC文件上传_跨服务器上传 


SpringMVC文件上传_原生方式上传 

 上传是Web工程中很常见的功能,SpringMVC框架简化了文件上传 的代码,我们首先使用JAVAEE原生方式上传文件:

1、创建新的SpringMVC项目,在web.xml中将项目从2.3改为3.1, 即可默认开启el表达式

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/webapp_3_1.xsd"
         id="WebApp_ID" version="3.1">

2、编写上传表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
   <title>上传</title>
    </head>
    <body>
        <h3>文件上传</h3>
       <%-- 上传表单的提交方式必须是post --%>
       <%-- enctype属性为multipart/formdata,意思是不对表单数据进行编码 --%>
        <form action="/fileUpload" method="post" enctype="multipart/formdata">
           <%-- 文件选择控件,类型是file,必须要有name属性--%>
           选择文件:<input type="file"name="upload"/>
            <input type="submit" value="上传"/>
        </form>
    </body>
</html>

3、接收请求体数据:

@RequestMapping("/fileUpload")
public String upload(HttpServletRequest request) throws Exception {
    // 获取输入流
    ServletInputStream is = request.getInputStream();
    // 从输入流获取请求体数据
    int i = 0;
    while ((i=is.read())!=-1){
        System.out.println((char)i);
   }
    return "index";
}

接下来需要分析请求体中的文件项,并将数据写入磁盘,此时需要 借助文件上传工具

 1、引入文件上传依赖:

<!-- 文件上传 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commonsfileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

2、编写控制器接收上传请求,控制器进行三步操作:

     2.1 创建文件夹,存放上传文件。

     2.2 分析请求体,找到上传文件数据。

     2.3 将文件数据写入文件夹。

@RequestMapping("/fileUpload")
public String upload(HttpServletRequest request) throws Exception {
    // 创建文件夹,存放上传文件
    // 1.设置上传文件夹的真实路径
    String realPath = request.getSession().getServletContext().getRealPath("/upload");
    // 2.判断该目录是否存在,如果不存在,创建该目录
    File file = new File(realPath);
    if(!file.exists()){
        file.mkdirs();
   }
    // 分析请求体,找到上传文件数据
    // 1.创建磁盘文件工厂
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 2.创建上传数据分析器对象
    ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
    // 3.利用分析器对象解析请求体,返回所有数据项
    List<FileItem> fileItems = servletFileUpload.parseRequest(request);
    // 4.遍历所有数据,找到文件项(非表单项)
    for (FileItem fileItem:fileItems){
        if(!fileItem.isFormField()){
            // 将文件数据写入文件夹
            // 1.获取文件名
            String name = fileItem.getName();
            // 2.将文件写入磁盘
            fileItem.write(new File(file,name));
            // 3.删除内存中的临时文件
            fileItem.delete();
       }
   }
    return "index";
}

SpringMVC文件上传_SpringMVC方式上传

 SpringMVC使用框架提供的文件解析器对象,可以直接将请求体中 的文件数据转为MultipartFile对象,从而省略原生上传中分析请求体的步骤。

1、在SpringMVC核心配置文件配置文件解析器

<!-- 文件解析器对象,id名称必须是 multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 支持一次上传文件的总容量。单位:字节 100M = 100*1024*1024-->
    <property name="maxUploadSize" value="104857600"/>
    <!-- 文件名的编码方式-->
    <property name="defaultEncoding" value="utf-8"/>
</bean>

2、创建JSP表单

<form action="/fileUpload2" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/>
    <input type="submit" value="上传"/>
</form>

3、编写控制器接收上传请求

// MultipartFile参数名必须和JSP文件空间的name
属性一致
@RequestMapping("/fileUpload2")
public String upload2(MultipartFile file,HttpServletRequest request) throws IOException {
    // 创建文件夹,存放上传文件
    String realPath = request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if(!dir.exists()){
        dir.mkdirs();
   }
    // 将上传的数据写到文件夹的文件中
    // 1.拿到上传的文件名
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    // 2.创建空文件
    File newFile = new File(dir,filename);
    // 3.将数据写入空文件中
    file.transferTo(newFile);
    return "index";
}

 SpringMVC文件上传_上传多文件

SpringMVC支持一次性上传多个文件,写法如下:

1、创建JSP表单

<form action="/fileUpload3" method="post" enctype="multipart/form-data">
   用户名:<input name="username"/>
   文件1:<input type="file" name="files"/>
   文件2:<input type="file" name="files"/>
    <input type="submit" value="上传"/>
</form>

2、编写控制器接收上传请求

// 处理多文件上传,参数类型为MultipartFile数组,参数名和JSP文件控件的name属性一致
@RequestMapping("/fileUpload3")
public String upload3(MultipartFile files[],String username,HttpServletRequest request) throws Exception {
    System.out.println(username);
    //1.设置上传文件保存的文件夹
    String realPath =request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if (!dir.exists()){
        dir.mkdirs();
   }
    //2.遍历数组,将上传文件保存到文件夹
    for(MultipartFile file:files){
        String filename =file.getOriginalFilename();
        filename =UUID.randomUUID()+"_"+filename;
        File newFile = new File(dir,filename);
        file.transferTo(newFile);
   }
    return "index";
}

SpringMVC文件上传_异步上传

 之前的上传方案,在上传成功后都会跳转页面。而在实际开发中, 很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如: 上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。

1、编写JSP页面,引入jQuery和jQuery表单上传工具

      jquery.form.js

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>上传</title>
    <script src="/js/jquery-2.1.1.min.js"></script>
    <script src="/js/jquery.form.js">
</script>
</head>
<body>
<h3>文件上传</h3>
<form id="ajaxForm" enctype="multipart/form-data" >
    <input type="file" name="file"/>
   <%-- 按钮类型不能是submit,否则会刷新页面  --%>
    <input type="button" value="上传头像"id="btn"/>
</form>
<%-- 上传头像后展示的位置 --%>
<img src="/" width="100" id="img">
<script>
    $(function () {
        $("#btn").click(function () {
            // 异步提交表单
            $("#ajaxForm").ajaxSubmit({
                url:"/fileUpload4",
                type:"post",
                success:function (data) {
                  $("#img").attr("src",data);
               }
           })
       })
   })
</script>
</body>
</html>

2、编写控制器接收异步上传请求

@RequestMapping("/fileUpload4")
//不进行页面跳转
@ResponseBody
public String upload3(HttpServletRequest request, MultipartFile file) throws Exception {
    // 创建文件夹,存放上传文件。
    String realPath = request.getSession().getServletContext().getRealPath("/upload");
    File dir = new File(realPath);
    if (!dir.exists()){
        dir.mkdirs();
   }
    // 拿到上传文件名
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    // 创建空文件
    File newFile = new File(dir, filename);
    // 将上传的文件写到空文件中
    file.transferTo(newFile);
    // 返回文件的路径
    return "/upload/"+filename;
}

SpringMVC文件上传_跨服务器上传 

 由于文件占据磁盘空间较大,在实际开发中往往会将文件上传到其 他服务器中,此时需要使用跨服务器上传文件。

1、解压tomcat作为图片服务器,在tomcat的webapps下创建 upload目录作为文件上传目录。

2、修改tomcat的 conf/web.xml 文件,支持跨服上传。

<servlet>    
    <init-param>        
        <param-name>readonly</param-name>
   
        <param-value>false</param-value>  
    </init-param>
</servlet>

3、修改tomcat的 conf/server.xml 文件,修改tomcat端口,修改完开启 tomcat服务器

<Connector port="8081" protocol="HTTP/1.1"
              connectionTimeout="20000" redirectPort="8443" />

4、编写JSP上传表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>上传</title>
        <script src="/js/jquery2.1.1.min.js"></script>
        <script src="/js/jquery.form.js"></script>
    </head>
    <body>
        <h3>文件上传</h3>
        <form id="ajaxForm" enctype="multipart/form-data" >
            <input type="file" name="file"/>
            <input type="button" value="上传头像" id="btn"/>
        </form>
        <img src="/" width="100" id="img">
        <script>
            $(function () {
                $("#btn").click(function() {
                  $("#ajaxForm").ajaxSubmit({url:"/fileUpload5",
                        type:"post",success:function(data) {
                          $("#img").attr("src",data);
                       }
                   })
               })
           })
        </script>
    </body>
</html>

5、添加跨服上传依赖

<!-- 跨服上传 -->
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.18.1</version>
</dependency>

6、创建控制器方法,该方法在接受到上传请求后将文件保存到其他服务器上。

@RequestMapping("/fileUpload5")
@ResponseBody
public String upload4(HttpServletRequest request, MultipartFile file) throws Exception {
    // 设置跨服上传的服务器路径
    String path = "http://localhost:8081/upload/";
    // 获取上传的文件名
    String filename = file.getOriginalFilename();
    filename = UUID.randomUUID()+"_"+filename;
    // 跨服上传:
    // 1.创建客户端对象
    Client client = Client.create();
    // 2.使用客户端对象连接图片服务器
    WebResource resource = client.resource(path + filename);
    //3.传输数据
    resource.put(file.getBytes());
    return path+filename;
}

复习

 SpringMVC参数获取_使用Servlet原生对象获取参数 

 SpringMVC也支持使用Servlet原生对象,在方法参数中定义 HttpServletRequest 、 HttpServletResponse 、 HttpSession 等类型的参数即可直接在 方法中使用。

// 使用Servlet原生对象
@RequestMapping("/c1/param8")
public void servletParam(HttpServletRequest request, HttpServletResponse response,
HttpSession session){  
       // 原生对象获取参数      
       System.out.println(request.getParameter("name"));
       System.out.println(response.getCharacterEncoding());    
       System.out.println(session.getId());
}

访问该方法即可:http://localhost:8080/c1/param8?name=bjwan

一般情况下,在SpringMVC中都有对Servlet原生对象的方法的 替代,推荐使用SpringMVC的方式代替Servlet原生对象。 

 SpringMVC参数获取_自定义参数类型转换器

 前端传来的参数全部为字符串类型,SpringMVC使用自带的转换器 将字符串参数转为需要的类型。如:

// 获取简单类型参数
@RequestMapping("/c1/param1")
public void simpleParam(String username,int age){
    System.out.println(username);    
    System.out.println(age);
}

请求路径:http://localhost:8080/c1/param1?username=bz&age =10

但在某些情况下,无法将字符串转为需要的类型,如:

@RequestMapping("/c1/param9")
public void dateParam(Date birthday){  
    System.out.println(birthday);
}

由于日期数据有很多种格式,SpringMVC没办法把所有格式的字符 串转换成日期类型。比如参数格式为 birthday=2025-01-01 时,SpringMVC 就无法解析参数。此时需要自定义参数类型转换器。

 1、定义类型转换器类,实现Converter接口

// 类型转换器必须实现Converter接口,两个泛型代表转换前的类型,转换后的类型
public class DateConverter implements Converter<String, Date> {
    /**
     * 转换方法
     * @param source 转换前的数据
     * @return 转换后的数据
     */
    @Override
    public Date convert(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(source);
       } catch (ParseException e) {
            e.printStackTrace();
       }
        return date;
   }
}

2、注册类型转换器对象

<!-- 配置转换器工厂 -->
<bean id="dateConverter" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!-- 转换器集合 -->
    <property name="converters">
        <set>
            <!-- 自定义转换器 -->
            <bean class="com.tong.converter.DateConverter"></bean>
        </set>
    </property>
</bean    
<!-- 使用转换器工厂 -->
<mvc:annotation-driven conversionservice="converterFactory">
</mvc:annotation-driven>

3、此时再访问http://localhost:8080/c1/param9?birthday=2025- 01-01时,SpringMVC即可将请求参数封装为Date类型的参数。

SpringMVC参数获取_编码过滤器 

 在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处 理post请求的中文乱码

1、编写jsp表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>编码过滤器</title>
    </head>
    <body>
        <form action="/cn/code" method="post">
           姓名:<input name="username">
            <input type="submit">
        </form>
    </body>
</html>

2、编写控制器方法

@RequestMapping("/cn/code")
public void code(String username){
    System.out.println(username);
}

SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过 滤器即可解决中文乱码问题:

<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
<filter>
    <filter-name>encFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

SpringMVC处理响应_配置视图解析器

 SpringMVC默认情况下会在控制器执行完成后跳转到视图页面,视 图解析器能找到相应的视图,之前的404异常就是由于没有配置视 图解析器导致找不到视图。

在SpringMVC中提供了13个视图解析器,用于支持不同的视图技术。InternalResourceViewResolver是SpringMVC的默认视图解析 器,用来解析JSP视图。

<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 视图前缀 -->
    <property name="prefix" value="/" />
    <!-- 视图后缀 -->
    <property name="suffix" value=".jsp" />
</bean>

SpringMVC处理响应_控制器方法的返回值

 我们可以通过控制器方法的返回值设置跳转的视图,控制器方法支 持以下返回值类型:

返回值为void

此时会跳转到名字是 前缀+方法路径名+后缀 的jsp页面

1、编写控制器方法

// 路径是helloMVC,方法执行完后会跳转到/helloMVC.jsp
@RequestMapping("/helloMVC")
public void helloMVC(){
    System.out.println("hello SpringMVC!");
}

2、编写helloMVC.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>MVC</title>
    </head>
    <body>
        <h1>欢迎来到SpringMVC</h1>
    </body>
</html>

返回值为String 

此时会跳转到名字是 前缀+返回值+后缀 的jsp页面

编写控制器方法

// 返回值为String
@RequestMapping("/c2/hello1")
public String helloMVC1(){
    System.out.println("hello SpringMVC!");
    // 方法执行完后会跳转到/helloMVC.jsp
    return "helloMVC";
}

返回值为ModelAndView

这是SpringMVC提供的对象,该对象可以向request域设置数据并 指定跳转的页面。该对象中包含Model对象和View对象。

1、Model:向request域中设置数据。

2、View:指定跳转的页面。

 1、编写控制器方法

// 返回值为ModelAndView
@RequestMapping("/c2/hello2")
public ModelAndView useMAV(){
    System.out.println("返回值类型为ModelAndView");
    // 1.创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    // 2.获取Model对象,本质是一个Map
    Map<String, Object> model = modelAndView.getModel();
    // 3.使用Model对象向request域设置数据
    model.put("name","程序员");
    // 4.使用View对象设置跳转的路径为/tong.jsp
    modelAndView.setViewName("baizhan");
    return modelAndView;
}

2、编写jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
    <head>
        <title>百千万</title>
    </head>
    <body>
        <h1>你好!${requestScope.name}</h1>
    </body>
</html>

3、修改web.xml命名空间,让jsp页面默认支持el表达式

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                            http://xmlns.jcp.org/xml/ns/javaee/webapp_3_1.xsd"
         version="3.1">
</web-app>

 

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

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

相关文章

17、SQL注入之二次、加解密、DNS等注入

目录 加解密二次注入DNSlog注入涉及资源:中转注入 加解密 %3D是等号 值在带入数据库之前是有一个解码的操作&#xff0c;明文在解码的时候&#xff0c;就会出现问题&#xff0c;进而影响到语句&#xff1b;密文和明文在一起&#xff0c;这种网站后台是识别不了的&#xff1b;只…

P1332 血色先锋队

血色先锋队 题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&…

银行家算法C语言代码

/*the code simulate blank algorithm to void deadlock*/ /*author:RongGong*/#include<stdio.h> #define MAX_RES_PROC 100//定义银行家算法的数据结构 int M; // 资源的个数 int N; // 进程的个数 int Available[MAX_RES_PROC] {0}; //可利用资源向量 int MaxNeed[MA…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

Grafana_数据可视化工具

目录 一、简介 二、安装部署 1、下载 2、安装 3、启用 三、使用简介 1、添加数据源 2、创建DashBoard 3、查看dashboard 4、选择查看的时间段 5、阈值颜色控制 源码等资料获取方法 一、简介 Grafana是一个跨平台开源的纯html/js编写的度量分析和可视化工具&#x…

Hydra(九头蛇)密码破解工具的详细使用教程

简介 Hydra是⼀款开源的暴⼒密码pojie⼯具&#xff0c;⽀持多种协议密码的破译。 可以对多种服务的账号和密码进行爆破&#xff0c;包括 数据库、SSH、FTP 等服务&#xff0c;在 Kali Linux 中自带 Hydra。有了这个工具就可以很方便的对密码进行破解。 其简单的使用参数如下&a…

【Java从入门到大牛】面向对象进阶上篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Java从入门到大牛 &#x1f320; 首发时间&#xff1a;2023年7月16日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

Python应用实例(二)数据可视化(二)

数据可视化&#xff08;二&#xff09; 1.随机漫步1.1 创建RandomWalk类1.2 选择方向1.3 绘制随机漫步图1.4 模拟多次随机漫步1.5 设置随机漫步图的样式 1.随机漫步 使用Python来生成随机漫步数据&#xff0c;再使用Matplotlib以引人瞩目的方式将这些数据呈现出来。随机漫步是…

服务器感染了.halo勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全威胁也日益猖獗&#xff0c;勒索病毒作为其中的一种&#xff0c;给个人和企业带来了巨大的威胁。.halo勒索病毒作为最近出现的一种恶意软件&#xff0c;以其高度复杂的加密算法和迅速的传播方式而备受关注。它通过…

【群智能算法改进】一种改进的猎人猎物优化算法 IHPO算法[1]【Matlab代码#49】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 原始HPO算法2. 改进后的IHPO算法2.1 Cubic映射初始化2.2 透镜成像折射反向学习2.3 强制切换策略 3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 原始HPO算法 此算法…

Vue3工程化项目搭建

Vue3工程化项目搭建 源码&#xff1a;vue3-quick-start 预览&#xff1a;vue3-quick-start 一、何为工程化 工程化概述 前端工程化大致可以分为模块化、组件化、规范化和自动化。 规范化 项目目录结构语法提示编码风格规范联调规范文件命名规范代码样式规范git flow 模块…

JS语法学习实战- 流程控制

JS语法学习实战- 流程控制 1. if - else2. switch3. for循环4. while循环5. 更多 JS语法学习实战系列合集 1. if - else if (条件1){条件1成立之后执行的代码 }else if(条件2){条件2成立之后执行的代码 }else{条件不成立之后执行的代码 }2. switch var daynew Date().getDay…

babel兼容低版本游览器

文章目录 1. webpack项目的搭建2. babel 命令行使用3. babel的预设与编译器流程4. babel项目中配置4.1 babel-loader与插件的使用4.2 babel-preset使用 5. 游览器兼容性使用5.1 browserslist工具与编写规则5.2 browserslist配置5.3 优化babel的配置文件 6. polyfill6.1 useBuil…

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版百度网盘免费下载

会声会影 Corel VideoStudio Ultimate 2023 v26.0.0.136 旗舰版是一款易于使用&#xff0c;初学者也可以轻使用的&#xff0c;可自定义的 3D 标题、新的面部效果、动画 AR 贴纸、GIF 和摄像机移动过渡&#xff0c;让您轻松、直观地制作最佳视频。探索高级编辑工具&#xff0c;如…

JavaWeb——垃圾回收

目录 一、垃圾回收定义 二、垃圾回收处理内存区域 三、垃圾标记 1、引用计数 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺陷 2、可达性分析 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、缺点 四、垃圾回收过程 1、标记清除 &…

SAP MM 创建双单位采购信息记录

SAP创建不同基本单位的信息记录 1、前台维护MM01 2、ME11维护信息记录 3、通过BAPIBDC实现&#xff1a;ME_INFORECORD_MAINTAIN_MULTIMEK1录屏 因为单独使用ME_INFORECORD_MAINTAIN_MULTI创建信息记录无法创建双单位&#xff0c;创建第一个单位时可以&#xff0c;第二个就会报…

企业邮箱的成本与收费:了解真相,合理选择

企业邮箱的成本对于希望迁移到云端的企业来说可能是一个问题。但这并不一定是必须的。企业邮箱对于今天的企业来说是必不可少的&#xff0c;因为它们提供必要的工具和服务来帮助您与客户、合作伙伴和商业社区保持联系。企业邮箱的收费贵不贵&#xff1f;成本高么&#xff1f; 对…

【Linux】进程间通信 -- 信号量

概念引入为什么要信号量&#xff1f;信号量操作接口1.申请信号量semget2.控制信号量semctl3.处理信号量semop IPC资源的组织方式 概念引入 信号量是什么&#xff1f; 本质是一个计数器&#xff0c;通常用来表示公共资源中&#xff0c;资源数量多少的问题 公共资源&#xff1a…

BUUCTF-JustEscape

目录 信息搜集 bypass 黑名单机制 绕过沙盒执行系统命令 总结 这是一道 Node.js 沙盒逃逸的题目&#xff0c;在此记录一些技巧。 信息搜集 进入题目环境&#xff1a; 直接给出了一个可执行任意代码的入口 /run.php?code<code>&#xff0c;直接复制第二个 demo 的路…

常见安装工具以及命令(工作常用)

dockermongodbnginxredis 1.docker 启动2.docker 安装 MongoDB3.启动nginx4.redis配置&#xff0b;安装4.1 Redis的启动和停止4.2 后台启动方式 1.docker 启动 安装docker # 1.安装gcc和g yum -y install gcc yum -y install gcc-c # 2. 安装需要的软件包 yum install -y yum…