学会Spring MVC文件上传、下载和JRebel的使用

news2024/11/17 17:37:23

 

目录

引言:

1.文件上传简介

文件上传在Web应用的重要性

2.单文件上传示例

导入依赖

配置文件上传解析器

 配置服务器存放文件地址

 导入PropertiesUtil工具类

 编写resource.properties

 添加sql

 主页面

文件上传方法

多文件上传示例

文件下载:

文件下载简介

文件下载的重要性

文件下载示例

什么是JRebel

1.安装JRebel

2.JRebel激活 

 3.设置jrebel离线模式


 

引言:

  • Spring MVC框架和其在Web应用中的重要性。

Spring MVC框架介绍:

Spring MVC(Model-View-Controller)是一个基于Java的开源框架,用于构建Web应用程序。它提供了一种组织Web应用的方法,将应用程序分为模型、视图和控制器三个部分,以促进代码的分层和模块化开发。

  • 模型(Model):模型代表应用程序的数据和业务逻辑。通常,它包括JavaBean或POJO(Plain Old Java Object)来表示数据对象,并包含与数据相关的处理逻辑。

  • 视图(View):视图负责呈现模型的数据给用户。它可以是JSP(JavaServer Pages)、Thymeleaf、FreeMarker等模板引擎,或者是前端技术如HTML、CSS、JavaScript等。

  • 控制器(Controller):控制器接受来自用户的请求,并协调模型和视图之间的交互。它处理请求参数、调用适当的业务逻辑(模型),并选择正确的视图来渲染响应。

Spring MVC在Web应用中的重要性:

Spring MVC在Web应用开发中具有重要作用,以下是其重要性的一些方面:

  1. 分层架构:Spring MVC采用MVC模式,鼓励将应用程序分成模型、视图和控制器三个独立的组件,促进了代码的模块化和分层开发,使项目更易于维护和扩展。

  2. 松耦合:Spring MVC使用依赖注入(DI)和控制反转(IoC)容器,降低了组件之间的耦合度,提高了代码的可测试性和可维护性。

  3. 灵活性:Spring MVC允许开发人员选择不同的视图技术,并支持RESTful风格的Web服务,使其非常灵活适应不同的项目需求。

  4. 强大的表单处理:Spring MVC提供了强大的表单处理功能,包括数据绑定、验证和错误处理,简化了表单处理的复杂性。

  5. 安全性:Spring框架提供了一套完整的安全性特性,与Spring MVC集成,可用于实现身份验证和授权。

  6. 社区支持:Spring MVC是一个广泛使用的框架,拥有强大的社区支持和大量的文档资源,开发人员可以轻松获取帮助和资源。

总之,Spring MVC框架提供了一种结构良好、高度可扩展和可维护的方式来构建Web应用程序,使开发人员能够更高效地开发和维护复杂的Web应用。

1.文件上传简介

文件上传在Web应用的重要性

文件上传在Web应用中非常重要,因为它使用户能够将文件(如图像、文档、音频、视频等)上传到服务器,从而实现了以下关键功能和用途:

  1. 数据共享和传输:允许用户将文件从本地计算机上传到Web服务器,从而实现了数据在客户端和服务器之间的共享和传输。这对于分享照片、文档、音乐、视频等内容至关重要。

  2. 数据备份:文件上传允许用户将重要文件备份到远程服务器,以防止本地数据丢失或损坏。这在避免数据丢失方面具有重要意义。

  3. 多媒体内容:对于许多Web应用程序,例如社交媒体平台、博客、论坛和云存储服务,文件上传是关键功能之一。它使用户能够共享图片、视频和音频内容,丰富了应用程序的多媒体体验。

  4. 数据处理:文件上传也对数据处理和分析非常重要。例如,用户可以上传CSV文件以进行数据分析,或上传图像以进行图像处理。

  5. 用户交互:文件上传允许用户与Web应用程序进行互动和参与,例如在社交媒体上分享照片,上传个人资料图片或更改头像。

  6. 在线协作:对于协作工具和云存储服务,文件上传使用户能够与团队成员协作,共享文档和文件,提高了工作效率。

  7. 电子商务:在线商店通常需要文件上传来允许卖家上传产品图片和商品描述,以便在网站上展示和销售产品。

  8. 个性化内容:文件上传使Web应用程序能够为用户提供个性化的体验,例如用户上传头像后,应用程序可以在页面上显示用户的头像。

总之,文件上传是Web应用中的一个重要功能,它不仅允许用户共享和传输数据,还丰富了用户体验,促进了在线合作和数据处理,对各种Web应用场景都至关重要。然而,需要确保安全性和数据完整性,以防止潜在的安全风险和数据损坏。

2.单文件上传示例

导入依赖

 
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

配置文件上传解析器

在spring-mvc.xml中配置文件上传解析器,代码如下:

<!--    处理文件下载-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 必须和用户JSP 的pageEncoding属性一致,以便正确解析表单的内容 -->
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 文件最大大小(字节) 1024*1024*50=50M-->
        <property name="maxUploadSize" value="52428800"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>

 配置服务器存放文件地址

第一步:

 第二步:

 第三步:选择路径

 

 导入PropertiesUtil工具类

package com.liao.utils;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 
public class PropertiesUtil {
	public static String getValue(String key) throws IOException {
		Properties p = new Properties();
		InputStream in = PropertiesUtil.class.getResourceAsStream("/resource.properties");
		p.load(in);
		return p.getProperty(key);
	}
	
}

 编写resource.properties

配置文件上传保存位置

dir=D:/temp/upload/
server=/upload/

 添加sql

<select id="listPager" resultType="com.liao.model.Work" parameterType="com.liao.model.Work" >
    select
    *
    from t_work-zw
    <where>
      <if test="dname != null">
        and dname like concat('%',#{dname},'%')
      </if>
    </where>
  </select>

 在mapper添加如下代码:

List<Work> listPager(Work work);

 PageController

package com.liao.web;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
 

@Controller
public class PageController {
 
    //<a href="order/preSave">新增</a> 
    @RequestMapping("/page/{page}")
    public String toPage(@PathVariable("page") String page){
        return page;
    }
 
    @RequestMapping("/page/{dir}/{page}")
    public String toDirPage(@PathVariable("dir") String dir,
                         @PathVariable("page") String page){
        return dir + "/" + page;
    }
 
}

 主页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link
            href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css"
            rel="stylesheet">
    <script
            src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
    <title>用户</title>
    <style type="text/css">
        .page-item input {
            padding: 0;
            width: 40px;
            height: 100%;
            text-align: center;
            margin: 0 6px;
        }
 
        .page-item input, .page-item b {
            line-height: 38px;
            float: left;
            font-weight: 400;
        }
 
        .page-item.go-input {
            margin: 0 10px;
        }
    </style>
</head>
<body>
<form class="form-inline"
      action="${pageContext.request.contextPath }/work/list" method="post">
    <div class="form-group mb-2">
        <input type="text" class="form-control-plaintext" name="uname"
               placeholder="请输入用户名">
        <!-- 			<input name="rows" value="20" type="hidden"> -->
        <!-- 不想分页 -->
        <input name="pagination" value="false" type="hidden">
    </div>
    <button type="submit" class="btn btn-primary mb-2">查询</button>
    <a class="btn btn-primary mb-2" href="${pageContext.request.contextPath }/work/preSave">新增</a>
</form>
 
<table class="table table-striped">
    <thead>
    <tr>
        <th scope="col">用户编号</th>
        <th scope="col">用户名</th>
        <th scope="col">用户头像</th>
        <th scope="col">用户年龄</th>
        <th scope="col">操作</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach  var="u" items="${lst }">
        <tr>
            <td>${u.uid }</td>
            <td>${u.uname }</td>
            <td>${u.uwork }</td>
            <td>${u.utp }</td>
            <td>
                <a href="${pageContext.request.contextPath }/work/preSave?did=${u.uid}">修改</a>
                <a href="${pageContext.request.contextPath }/work/del?did=${u.uid}">删除</a>
                <a href="${pageContext.request.contextPath }/page/work/upload?did=${u.uid}">图片上传</a>
                <a href="${pageContext.request.contextPath }/work/download?did=${u.uid}">图片下载</a>
            </td>
        </tr>
    </c:forEach>
    </tbody>
</table>
<!-- 这一行代码就相当于前面分页需求前端的几十行了 -->
<z:page pageBean="${pageBean }"></z:page>
${pageBean }
</body>
</html>

文件上传方法

//文件上传
    @RequestMapping("/upload")
    public String upload(Work work,MultipartFile m){
        try {
//      3.后端可以直接利用mutipartFile类,接受前端传递到后台的文件
        //上传的图片真实存放地址
        String dir = PropertiesUtil.getValue("dir");
        //网络访问地址
        String server = PropertiesUtil.getValue("server");
        String fileName = m.getOriginalFilename();
        System.out.println("文件名:"+fileName);
        System.out.println("文件类别:"+m.getContentType());
        //4.将文件转成流,然后写入服务器(某一个硬盘)
        FileUtils.copyInputStreamToFile(m.getInputStream(),new File(dir+fileName));
        work.setMpic(server+fileName);
        workBiz.updateByPrimaryKeySelective(work);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

图片上传操作页面 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户头像上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/work/upload" method="post" enctype="multipart/form-data">
    <label>用户编号:</label><input type="text" name="mid" readonly="readonly" value="${param.mid}"/><br/>
    <label>用户图片:</label><input type="file" name="m"/><br/>
    <input type="submit" value="上传图片"/>
</form>
<form method="post" action="${pageContext.request.contextPath}/work/uploads" enctype="multipart/form-data">
    <input type="file" name="files" multiple>
    <button type="submit">上传</button>
</form>
</body>
</html>

多文件上传示例

Controller层中加入以下代码

//多文件上传
    @RequestMapping("/uploads")
    public String uploads(HttpServletRequest req, Work work, MultipartFile[] files){
        try {
            StringBuffer sb = new StringBuffer();
            for (MultipartFile cfile : files) {
                //思路:
                //1) 将上传图片保存到服务器中的指定位置
                String dir = PropertiesUtil.getValue("dir");
                String server = PropertiesUtil.getValue("server");
                String filename = cfile.getOriginalFilename();
                FileUtils.copyInputStreamToFile(cfile.getInputStream(),new File(dir+filename));
                sb.append(filename).append(",");
            }
            System.out.println(sb.toString());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "redirect:list";
    }

文件下载:

文件下载简介

文件下载是一种通过互联网或内部网络将文件从一个位置传输到另一个位置的过程。这些文件可以包括各种类型的数据,如文档、图像、音频、视频、应用程序等。文件下载通常是用户从Web应用程序或服务器获取文件的方式之一。

文件下载的基本原理如下:

  1. 用户请求文件下载:通常,用户会在Web浏览器或应用程序中点击链接、按钮或执行特定的操作来请求文件下载。这个请求会发送到服务器或云存储,以获取所需文件。

  2. 服务器响应:一旦服务器收到文件下载请求,它会检查请求的有效性,并根据请求的参数和权限决定是否允许下载。如果一切正常,服务器会准备要下载的文件。

  3. 传输文件:服务器将文件分成小块(或使用分块传输)并通过HTTP或其他网络协议发送给用户的客户端设备。这通常涉及将文件数据包装成网络数据包,并在网络上传输。

  4. 保存文件:一旦文件数据到达用户设备,它们会被重新组装并保存在用户的本地存储中,通常是计算机硬盘或移动设备的存储。

  5. 完成下载:用户可以在其本地存储中找到下载的文件,并根据需要进行使用、查看或处理。

文件下载在Web应用程序和互联网上的应用非常广泛。它们用于提供软件更新、共享文档、提供多媒体内容、传输数据等各种场景。为了确保文件下载的安全性和合法性,通常会使用身份验证、权限控制和加密技术来保护文件和用户数据。

文件下载的重要性

文件下载对Web应用程序很重要,因为它提供了以下几个关键的功能和好处:

  1. 数据共享和传递:通过文件下载,Web应用程序可以向用户提供各种文件类型,如文档、图像、音频、视频等。这允许用户轻松地分享、保存或传递这些文件,以满足各种需求,如工作文档、娱乐媒体等。

  2. 离线访问:文件下载使用户能够将文件保存到本地设备,以便在没有互联网连接的情况下访问它们。这对于在线学习、阅读文档或查看媒体非常有用。

  3. 备份和恢复:用户可以通过下载文件来创建备份副本,以防文件丢失或损坏。这对于重要数据的长期保存和恢复非常有帮助。

  4. 提高性能:通过允许文件下载,Web应用程序可以减少服务器负载和带宽使用,因为文件可以从本地存储中获取,而不是每次都从服务器重新请求。

  5. 定制化和用户体验:文件下载允许Web应用程序根据用户需求提供不同的文件格式和选项,以满足其特定需求。这可以改善用户体验并增加用户满意度。

总之,文件下载是Web应用程序的重要组成部分,它提供了灵活性、可访问性和用户友好性,有助于满足用户多样化的需求。

文件下载示例

Controller层中加入以下代码

 //文件下载实现
    @RequestMapping(value="/download")
    public ResponseEntity<byte[]> download(Work work,HttpServletRequest req){
        try {
            //先根据文件id查询对应图片信息
            Work work = this.musworkicBiz.selectByPrimaryKey(work.getdid());
            String diskPath = PropertiesUtil.getValue("dir");
            String reqPath = PropertiesUtil.getValue("server");
 
            String realPath = work.getdtp().replace(reqPath,diskPath);
            String fileName = realPath.substring(realPath.lastIndexOf("/")+1);
            //下载关键代码
            File file=new File(realPath);
            HttpHeaders headers = new HttpHeaders();//http头信息
            String downloadFileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//设置编码
            headers.setContentDispositionFormData("attachment", downloadFileName);
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.OK);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;

什么是JRebel

JRebel 是一个用于Java开发的工具,旨在提高Java应用程序的开发效率。它的主要功能是允许开发人员在不重新启动应用程序的情况下即时查看和应用代码更改。以下是关于JRebel的介绍以及它如何提高Java应用程序的开发效率的解释:

JRebel的功能和作用:

  1. 实时代码重载:JRebel允许开发人员在运行中的Java应用程序中即时应用代码更改,而不需要重新启动应用程序。这大大加快了开发周期,因为开发人员可以立即查看他们的更改效果,而不必等待应用程序重新启动。

  2. 支持多种框架和服务器:JRebel支持各种Java开发框架和应用服务器,包括Spring、Hibernate、Tomcat、Jetty等。这意味着开发人员可以在不同的项目中广泛使用它。

  3. 无需重建工程:与传统的Java开发相比,使用JRebel不需要频繁地重建整个项目或重新编译代码。这节省了宝贵的时间,并提高了开发人员的工作效率。

  4. 减少开发人员的上下文切换:JRebel允许开发人员集中精力在代码编写上,而不必因为重新启动应用程序而中断工作流程。这有助于提高开发人员的专注度和生产力。

如何提高开发效率:

使用JRebel可以显著提高Java应用程序的开发效率,具体体现在以下方面:

  1. 快速反馈:JRebel允许即时查看代码更改的效果,减少了等待应用程序重新启动的时间。这使得开发人员可以更快地检测和解决问题,提高了调试和测试的效率。

  2. 持续集成:JRebel有助于支持持续集成和持续交付流程,因为它允许开发人员频繁地进行代码更改和测试,而无需中断开发流程。

  3. 降低开发成本:通过减少重启应用程序的次数,JRebel减少了开发时间和开发人员的精力消耗,从而降低了开发成本。

  4. 提高开发团队效率:JRebel可以帮助开发团队更快地迭代开发,加速项目交付。这对于满足紧迫的项目时间表非常有帮助。

总之,JRebel是一个强大的Java开发工具,通过实时代码重载的功能,显著提高了Java应用程序的开发效率。它减少了等待时间,降低了开发成本,并有助于开发人员更专注于代码编写,从而加速了项目的开发和交付。

安装和配置JRebel

1.安装JRebel

File--Settings--Plugins

搜索jrebel下载并且重启即可下载成功

2.JRebel激活 

2.1打开ReverseProxy_windows_amd64 

File--Settings--jrebel

 成功界面

 3.设置jrebel离线模式

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

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

相关文章

【VAE】

个人网站&#xff1a;https://tianfeng.space 一、VAE 与普通自动编码器一样&#xff0c;变分自动编码器有编码器Encoder与解码器Decoderi两大部分组成&#xff0c;原始图像从编码器输入&#xff0c;经编码器后形成隐式表示(Latent Representation)&#xff0c;之后隐式表示被…

GC 算法与种类

对于垃圾收集&#xff08;GC&#xff09;, 我们需要考虑三件事情&#xff1a;哪些内存需要回收&#xff1f;如何判断是垃圾对象&#xff1f;垃圾回收算法有哪些&#xff1f; 一、GC的工作区域 1、不是GC的工作区域 (1)程序计数器、虚拟机栈和本地方法栈三个区域是线程私有的&…

浅谈UI自动化测试

最近一直在学习python&#xff0c;正好部门技术结构调整&#xff0c;就开始了点工向UI自动化测试的转变&#xff0c;我要说瞌睡来了就掉枕头么&#xff1f; 不过还好&#xff0c;可以将python的学习成果在自动化测试中实践。。。 1、about自动化测试 定义&#xff1a;把人为驱…

SQL5 将查询后的列重新命名

描述 题目&#xff1a;现在你需要查看前2个用户明细设备ID数据&#xff0c;并将列名改为 user_infos_example,&#xff0c;请你从用户信息表取出相应结果。 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学…

springboot启动流程梳理

启动顺序主要针对SpringApplication.run&#xff08;&#xff09;方法的梳理 一 SpringApplication类的实例化 ApplicationContextInitializer 实现类的资源配置文件读取以及实现相关类的实例化 1&#xff09;.加载 ApplicationContextInitializer 实现类 &#xff0c;由 Spri…

【数据结构】串

串 串的顺序实现简单的模式匹配算法KMP算法KMP算法的进一步优化 串的顺序实现 初始化 #define MaxSize 50 typedef char ElemType;//顺序存储表示 typedef struct{ElemType data[MaxSize];int length; }SString;/*** 初始化串*/ void InitString(SString *string) {for (int …

【C++】构造函数分类 ③ ( 调用有参构造函数的方法 | 括号法 | 等号法 )

文章目录 一、在不同的内存中创建类的实例对象1、括号法调用构造函数2、等号法调用构造函数 二、完整代码示例 一、在不同的内存中创建类的实例对象 在上一篇博客 【C】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 ) 中 , …

从0到1学会Git(第三部分):Git的远程仓库链接与操作

写在前面:前面两篇文章我们已经学会了git如何在本地进行使用&#xff0c;这篇文章将讲解如何将本地的git仓库和云端的远程仓库链接起来并使用 为什么要使用远程仓库:因为我们需要拷贝我们的代码给别人以及进行协同开发&#xff0c;就需要有一个云端仓库进行代码的存储和同步&a…

nginx配置-gzip

1、想看nginx配置的时候&#xff0c;发现没有nginx命令&#xff0c;是没有配置环境变量。 cd etc/ vim profile 加入 unset i unset -f pathmunge PATH/usr/local/nginx/sbin:$JAVA_HOME/bin:$PATH //这一行 export JAVA_HOME/usr/local/soft/jdk8 expo…

qpushbutton 样式表

QPushButton {color:#ffffff; /*文字颜色*/background-color:qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop:0 #aa55ff, stop: 1 #1296db);/*背景色*/border-style:outset; /*边框风格*/border-width:2px;/*边框宽度*/border-color:#0055ff; /*边框颜色*/border-radius:10…

如何用 Java 找到字符串中的元音

这个题目其实不难&#xff0c;这是一个公司面试的时候要求的题目。 这个公司的面试有点意思&#xff0c;他们希望 Zoom 看我的电脑&#xff0c;然后让我解决问题。 题目 题目就非常简单了&#xff0c;他们给了我 2 个字符串。 其中一个是测试字符串&#xff0c;另外一个是元…

I2C 验证中需要注意的问题

I2C验证中需要注意的问题 1.NACK出现的时刻2.Restart和Start区别3.保持时间&#xff08;Thd&#xff09; 1.NACK出现的时刻 通常&#xff0c;在Master访问到错误的Device ID时&#xff0c;Slave会返回Nack&#xff0c;表示访问失败。此外&#xff0c;在Master对Slave读访问时&…

JWT认证、drf-jwt安装和简单使用、实战之使用Django auth的User表自动签发、实战之自定义User表,手动签发

一 JWT认证 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。 我们不再使用Session认证机制&#xff0c;而使用Json Web Token&#xff08;本质就是token&#xff09;认证机制。Json web token (JWT), 是为了在网络应用环境…

沙丁鱼优化算法(Sardine optimization algorithm,SOA)求解23个函数MATLAB

一、沙丁鱼优化算法 沙丁鱼优化算法(Sardine optimization algorithm,SOA)由Zhang HongGuang等人于2023年提出&#xff0c;该算法模拟沙丁鱼的生存策略&#xff0c;具有搜索能力强&#xff0c;求解精度高等特点。 沙丁鱼主要以浮游生物为食&#xff0c;这些生物包括细菌、腔肠…

性能测试 —— Jmeter定时器

固定定时器 如果你需要让每个线程在请求之前按相同的指定时间停顿&#xff0c;那么可以使用这个定时器&#xff1b;需要注意的是&#xff0c;固定定时器的延时不会计入单个sampler的响应时间&#xff0c;但会计入事务控制器的时间 1、使用固定定时器位置在http请求中&#xf…

5.9.Webrtc线程事件处理

在前面的课程中呢&#xff0c;我已经向你介绍了事件处理的一些基础知识&#xff0c;那今天呢&#xff0c;我们再来看一下外边儿rtc下事件处理的基本逻辑是什么&#xff1f; 那首先呢&#xff0c;我们来看一下事件是如何协调线程工作的&#xff0c;那就如果这张图所展示的有两个…

一起学数据结构(6)——栈和队列

上篇文章中&#xff0c;对栈的概念及特点进行了解释&#xff0c;并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构&#xff1a; 在给出队列的概念之前&#xff0c;先给出上篇文章中提到的栈的概念&#xff1a;一种只…

JVM系列 运行时数据区

系列文章目录 第一章 运行区实验 文章目录 系列文章目录前言一、堆&#xff08;Heap&#xff09;1.1、新生代/Young区1.1.1、Eden区1.1.2、Survival区 1.2、年老代&#xff08;old区&#xff09; 二、虚拟机栈&#xff08;Stack&#xff09;2.1、栈顶缓存技术2.2、溢出2.3、栈…

约瑟夫环(循环列表实现)

约瑟夫&#xff08;Joseph&#xff09;问题的一种描述是&#xff1a;编号为1&#xff0c;2&#xff0c;3&#xff0c;…&#xff0c;n的n个人按顺时针方向围坐一圈。每人持有一个密码&#xff08;正整数&#xff09;。一开始任选一个正整数作为报数上限值m&#xff0c;从第一个…

vscode c++解决包含头文件红色波浪线问题

安装c/c插件后&#xff0c;按ctrlshiftp&#xff0c; 点击打开了c_cpp_properties.json文件&#xff0c;对其中的IncludePath进行编辑&#xff0c;示例如下&#xff1a; "includePath": ["${workspaceFolder}/**","${workspaceFolder}/include/**&q…