JavaWeb学习-Servlet处理解析JSON文件导出Excel实例

2023-11-05


前言

这里是javaweb小白第一次尝试写博客,主要是想记录一下自己在学习JavaWeb的成长历程、记录在编写程序时解决的一些问题。也想借此帮助自己对知识点的消化和对代码结构体系上的深入理解,如果能帮助到同样正在学习这部分内容的小伙伴,那是莫大的荣幸!

回到正题,该篇讲解的是一个利用Servlet处理页面上传的JSON文件,对其解析后以表格形式呈现在响应页面,并可勾选相应的行下载导出excel文件。


一、实例要求

在这里插入图片描述

二、主要问题点

1.保存请求中的文件

首先我们要了解文件在http请求消息中的格式

我们通过表单向服务器发送包含了用户在浏览器页面上传的文件的http请求

<form enctype="multipart/form-data" method="post" action="fileUpload.do">
    <table border="1px">
        <tr>
          <td colspan="2" style="text-align: center">文件上传</td>
        </tr>

        <tr>
          <td>会员号:</td>
          <td><input type="text" name="mnumber" size="30"></td>
        </tr>

        <tr>
          <td>文件名:</td>
          <td><input type="file" name="fname" size="30"></td>
        </tr>

        <tr>
          <td style="text-align: right"><input type="submit" value="提交"></td>
          <td style="text-align: left"><input type="reset" value="重置"></td>
        </tr>
    </table>

</form>

在form标签内 定义了编码类型enctype="multipart/form-data",并以POST方法发送请求。

关于enctype属性,在POST请求方法下默认为application/x-www-form-urlencoded,在这种编码格式下,数据会被编码成以被&分隔的健-值对的形式,健-对值之间以=分隔,也就是key=value

另一种text/plain纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。这里不做过多介绍。

还有一种编码方式就是例中所用的multipart/form-data指定传输数据为二进制类型,比如图片、mp3、文件。表明表单数据为复合类型数据,包含多个子部分,这种方式提交的表单在我们的数据分离后,会以boundary开头、last boundary结尾。其中每个部分的描述都有HTTP头部描述子包体,如Content-type

对表单编码方式的介绍参考这篇文章,想要了解更详细内容可以点此查看该文章

我们使用wireshark抓取这个请求消息进一步解析
http请求消息
看到请求头Content-Type正文类型为multipart/form-data,对应了form标签内定义的编码类型。

表单的包体在http报文的正文内容,使用MIME多功能网际邮件拓展协议
MIME包体
图中第三行First boundary开始为第一个子包体,name="mnumber",是<input type="text" name="mnumber" size="30">对应的请求参数名,该子包体以Boundary为标志结束

第二个part是请求中JSON文件,Content-Type:application/json表示了这个资源的类型,name="fname"是该资源的请求参数名,之后的代码中我们就会借助这个参数名来获取这个part,filename="javascore.json"是资源文件名

报文最后以Last boundary来结尾表明所有的资源文件都传输完毕。

由此条抓取的报文印证了multipart/form-data方式,复合型、多个部分、以boundary边界分隔的结构特征,能帮助我们从代码层面对请求包资源的操作理解。

String mNumber=request.getParameter("mnumber");
//获取上传的文件、request.getPart(“属性名”)用于获取使用multipart/form-data格式传递的http请求的请求体,通常用于获取上传文件。
//part.getSubmittedFileName();拿到文件名
Part part= request.getPart("fname");
//将上传的文件内容写入服务器文件中
part.write(fileSavingPath);

附上相应的代码语句,是不是就能更好地理解这些方法的含义

对于保存上传的文件到服务器,本例中采取了指定绝对路径的做法,这样做的缺点是只适用于一台服务器,不好做迁移。更好的解决办法是获取web项目在硬盘的绝对路径,再保存文件到web应用根目录的相对路径上。

为此我们可以使用servlet中用ServlertContext域的getRealPath()这个方法来动态的获取web应用的绝对路径(关于ServlertContext域将在后文介绍)

//参数"/"获取web应用输出根目录
String fileSavingFolder = this.getServletContext().getRealPath("/");

此方法有时候会遇到获取的路径在target文件夹下,这时需要更改tomcat服务器项目部署的输出目录至webapp文件夹下
更改输出目录

2.JSON的简单处理

简单介绍一下JSON的格式

JSON三种格式:

(一)简单值:数字、字符串、布尔值
(二)对象形式:
对象形式
(三)数组形式
数组形式
本例中的测试案例:
在这里插入图片描述
使用FastJson对JSON解析,当然也可以以字符串类型手动解析,只是比较繁琐。

FastJson环境配置非常简单,只需在pom.xml文件中加入以下依赖项,重新加载maven即可

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

解析的思路:先读取文件内容到字符串数组再使用JSON.parseArray()转化为JSON数组,逐个取出对象进行解析

代码如下(示例):

        //获取存储在请求对象中的文件路径
        String filePath=String.valueOf(request.getAttribute("fileSavingPath"));
        //存储文件路径至全局作用域对象ServletContext中
        ServletContext application=request.getServletContext();
        application.setAttribute("filePath",filePath);
        //读取文件内容到字符串
        StringBuilder strJson= new StringBuilder();
        try {
            //设置字符编码UTF-8
            BufferedReader br=new BufferedReader(new FileReader(filePath, StandardCharsets.UTF_8));
            String str="";
            while((str=br.readLine())!=null){
                strJson.append(str);
            }

            br.close();
        }catch (IOException e){
            e.printStackTrace();
        }

        //转为JSON数组
        JSONArray jsonArray= JSON.parseArray(String.valueOf(strJson));
        System.out.println(jsonArray);

3.Servlet共享数据

因为对JSON文件的解析和导出excel的实现在两个不同servlet实现,所以需要servlet共享JSON文件路径,可以通过ServletContext对象来存储数据。

Web容器在加载每个Web程序时会创建一个唯一的ServletContext实例对象,该对象称为Servlet上下文对象。

//两种获取servletcontext的方法
ServletContext application=request.getServletContext();
ServletContext application=getServletConfig().getServletContext();

使用setAttribute(String name,Object object)getAttribute(String name,Object object)存储和提取数据

实现勾选信息导出为excel

实现样例:
table显示信息
思路: 通过getParameterValues()方法获取被选中的checkboxvalue数组
输出查看选中的value
依据数组选择对应顺序的JSON对象写入excel

设置报头Content-Encoding编码类型为gb2312
Content-Disposition是 MIME 协议的扩展,指示回复的内容、浏览器要以何种形式展示(以内联的形式即网页或者页面的一部分 or 以附件的形式下载并保存到本地)。
这里的字段值为"attachment; filename=\"学生成绩\""分别指定了文件以附件的形式下载和默认文件名。
Content-Type类型为"application/vnd.ms-excel;charset=gb2312"

三、源码

fileUpload.html

<!--fileUpload.html-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
      form{
        margin-right: auto;
        margin-left: auto;
        width: max-content;
      }
    </style>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="fileUpload.do">
    <table border="1px">
        <tr>
          <td colspan="2" style="text-align: center">文件上传</td>
        </tr>

        <tr>
          <td>会员号:</td>
          <td><input type="text" name="mnumber" size="30"></td>
        </tr>

        <tr>
          <td>文件名:</td>
          <td><input type="file" name="fname" size="30"></td>
        </tr>

        <tr>
          <td style="text-align: right"><input type="submit" value="提交"></td>
          <td style="text-align: left"><input type="reset" value="重置"></td>
        </tr>
    </table>

</form>

</body>
</html>

FileUploadServlet.java

package com.example.excel;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "FileUploadServlet", value = "/fileUpload.do")
@MultipartConfig(fileSizeThreshold = 1024)
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out=response.getWriter();

        String mNumber=request.getParameter("mnumber");
        //获取上传的文件、request.getPart(“属性名”)用于获取使用multipart/form-data格式传递的http请求的请求体,通常用于获取上传文件。
        //part.getSubmittedFileName();拿到文件名
        Part part= request.getPart("fname");
        //反馈信息字符串
        String message="";

        //上传文件大小不能超过1MB
        if(part.getSize()>1024*1024){
            part.delete();
            message="文件太大,不能上传!";
        }else {


            //获得webapp根目录
            String fileSavingFolder = this.getServletContext().getRealPath("/");
            System.out.println(fileSavingFolder);
            //获得存储上传文件的完整路径(文件夹路径+文件名)
            //文件夹位置固定,文件夹采用与上传文件的原始名字相同
            String fileSavingPath = "C:\\Users\\Hana-bi\\Documents\\webfile" + File.separator + "students" + File.separator + mNumber;
            //如果存储上传文件的文件夹不存在,则创建文件夹
            System.out.println("文件路径:"+fileSavingPath);

            File f = new File(fileSavingPath);

            if (!f.exists()) {
                System.out.println("文件不存在!");
                f.mkdirs();
                System.out.println("目录已创建");
            }

            //获取HTTP头信息headerInfo=(form-data; name="file" filename="文件名")
            String headerInfo = part.getHeader("content-disposition");
            //从HTTP头信息中获取文件名fileName=(文件名)
            String fileName = headerInfo.substring(headerInfo.lastIndexOf("=") + 2, headerInfo.length() - 1);

            fileSavingPath+=File.separator+fileName;

            //将上传的文件内容写入服务器文件中
            part.write(fileSavingPath);

            message="文件上传成功~!";

            //使用request对象存储数据
            request.setAttribute("fileSavingPath",fileSavingPath);
            //获取转发对象
            RequestDispatcher rd=request.getRequestDispatcher("/Parsejson.do");
            //转发请求响应
            rd.forward(request,response);
        }

    }
}

ParseJsonServlet.java

package com.example.excel;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "ParseJsonServlet", value = "/Parsejson.do")
public class ParseJsonServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*
        第一步读取文件
         */

        //获取存储在请求对象中的文件路径
        String filePath=String.valueOf(request.getAttribute("fileSavingPath"));
        //存储文件路径至全局作用域对象ServletContext中
        ServletContext application=request.getServletContext();
        application.setAttribute("filePath",filePath);
        //读取文件内容到字符串
        StringBuilder strJson= new StringBuilder();
        try {
            //设置字符编码UTF-8
            BufferedReader br=new BufferedReader(new FileReader(filePath, StandardCharsets.UTF_8));
            String str="";
            while((str=br.readLine())!=null){
                strJson.append(str);
            }

            br.close();
        }catch (IOException e){
            e.printStackTrace();
        }

        //转为JSON数组
        JSONArray jsonArray= JSON.parseArray(String.valueOf(strJson));
        System.out.println(jsonArray);

        /*
        响应消息写入浏览器
         */
        PrintWriter out=response.getWriter();

        out.println("<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <title>成绩</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "<form action=\"exportScore.do\" method=\"post\" style=\"margin-right: auto;margin-left: auto;width: max-content;text-align: center\">");
        out.println("<br><span style=\" font-size: xx-large\">学生成绩列表</span>");
        out.println("<br><table border=1px><tr><td></td><td>序号</td><td>学号</td><td>姓名</td><td>课程名</td><td>成绩</td></tr>");
        int no=1;

        //foreach或使用iterator
        for (Object ob:jsonArray) {
            JSONObject jsonOb=(JSONObject) ob;
            String stuid=jsonOb.getString("stuid");
            String name=jsonOb.getString("name");
            String courseName=jsonOb.getString("courseName");
            String score=jsonOb.getString("score");

            out.println("<tr><td><input type=\"checkbox\" name=\"C\" value=\""+(no-1)+"\"></td><td>"+no+"</td>"+"<td>"+stuid+"</td>"+"<td>"+name+"</td>"+"<td>"+courseName+"</td>"+"<td>"+score+"</td></tr>");
            no++;
        }
        out.println("</table>");
        out.println("<br><input type=\"submit\" value=\"导出表格\">");
        out.println("</form></body></html>");


    }
}

ExportScoreServlet.java

package com.example.excel;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

@WebServlet(name = "ExportScoreServlet", value = "/exportScore.do")
public class ExportScoreServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //注意编码为gb2312
        response.setHeader("Content-Encoding","gb2312");
        response.setHeader("Content-Disposition","attachment; filename="+ URLEncoder.encode("学生成绩.xls", StandardCharsets.UTF_8));
        response.setContentType("application/vnd.ms-excel;charset=gb2312");

        PrintWriter out=response.getWriter();
        out.println("序号\t学号\t姓名\t课程名\t成绩");


        //获取勾选的checkbox参数
        String []checks=request.getParameterValues("C");
        System.out.println(Arrays.toString(checks));

        //通过全局作用域对象获取先前存储的文件路径
        ServletContext application=request.getServletContext();
        String filePath=String.valueOf(application.getAttribute("filePath"));
        System.out.println(filePath);

        //读取文件内容到字符串
        StringBuilder strJson= new StringBuilder();
        try {
            //设置字符编码UTF-8
            BufferedReader br=new BufferedReader(new FileReader(filePath, StandardCharsets.UTF_8));
            String str="";
            while((str=br.readLine())!=null){
                strJson.append(str);
            }

            br.close();
        }catch (IOException e){
            e.printStackTrace();
        }

        //转为JSON数组
        JSONArray jsonArray= JSON.parseArray(String.valueOf(strJson));
        System.out.println(jsonArray);

        //将JSON对象写入excel
        try {
            for (String i:checks) {
                JSONObject jsonOb=jsonArray.getJSONObject(Integer.parseInt(i));
                String line=(Integer.parseInt(i)+1)+"\t"+jsonOb.getString("stuid")+"\t"+jsonOb.getString("name")+"\t"+jsonOb.getString("courseName")+"\t"+jsonOb.getString("score");
                out.println(line);
            }
        }catch (NumberFormatException e){
            e.printStackTrace();
        }


    }
}


总结

这是一个简单的Servlet上传、转发、响应的实例,同时也需要对html请求和响应消息格式、JSON格式的解析处理、ServletContext等作用域对象有清楚的理解,才能对程序有更好的实现。

第一次写这种技术文章,在整体逻辑的表达上还有欠缺,我也只是个初识JavaWeb的初学者,对相关知识的掌握比较浅显,如有纰漏和错误,欢迎指出!如果您有更好的实现方法也欢迎评论交流~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaWeb学习-Servlet处理解析JSON文件导出Excel实例 的相关文章

  • 按下按钮时清除编辑文本焦点并隐藏键盘

    我正在制作一个带有编辑文本和按钮的应用程序 当我在 edittext 中输入内容然后单击按钮时 我希望键盘和焦点在 edittext 上消失 但我似乎无法做到这一点 我在 XML 中插入了这两行代码 android focusable tr
  • 我们如何测试我们的 Java UI?

    我们正在寻找记录和回放类型的测试工具来自动化我们的一些 UI 功能测试 我们已经研究了从 Silke 到 QTP 的大多数常见嫌疑 但没有一个起作用 当需要右键单击才能从右键单击菜单中选择某些内容时 或者当您必须在网格的下拉列表中选择一个值
  • 使用 java 的 RAR 档案 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 获取TextView的高度

    我有一些文字将被放入TextView 我这样做是使用setText 现在我需要找到文本在文本中占据的行数或高度TextView 我尝试使用getHeight 但它总是返回 0 无论如何 有没有办法获得文本中存在的文本的高度TextView
  • Jodatime 日期格式

    是否可以格式化 JodaTime 日期 这是代码 private static LocalDate priorDay LocalDate date1 do date1 date1 plusDays 1 while date1 getDayO
  • 总结二维数组

    鉴于我当前的程序 我希望它在用户输入所有值后计算每列和每行的总和 我当前的代码似乎只是将数组的值加倍 这不是我想要做的 例如 如果用户输入具有以下值 1 2 3 2 3 4 3 4 5 的 3x3 矩阵 则看起来就像我在下面的程序中对其进行
  • 在Java中使用BufferedWriter写入文件时监视文件大小?

    我正在将一个可能很长的项目列表写入文件 我正在写的项目的长度是可变的 如果生成的文件大小大于10M 则应将其分成多个文件 为了提高性能 我目前使用 BufferedWriter 如下所示 final FileOutputStream fos
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • 在java中是否可以使用反射创建没有无参数构造函数的“空白”类实例?

    我有一个没有默认构造函数的类 我需要一种方法来获取此类的 空白 实例 空白 意味着实例化后所有类字段都应具有默认值 如 null 0 等 我问这个问题是因为我需要能够序列化 反序列化大对象树 而且我无法访问该对象类的源 并且类既没有默认构造
  • 我们必须将 .class 文件放在 Tomcat 目录中的位置

    我必须把我的 class文件在 Tomcat 目录中 在我的 Java Complete Reference 书中 他们告诉将其放入C Program Files Apache Tomcat 4 0 webapps examples WEB
  • 在 Java 中使用 Inflater 解压缩 gzip 数据

    我正在尝试使用以下方法解压缩 gzip 数据Inflater 根据文档 如果参数 nowrap 为 true 则 ZLIB 标头和校验和 字段将不会被使用 这提供了与 GZIP 和 PKZIP 使用的压缩格式 注意 使用 nowrap 选项
  • wsdl 没有服务元素

    我必须使用 WCF Web 服务并获得 WSDL 外部的 因此无法控制 WSDL 在 WSDL 定义中 我没有找到包含服务 端口和地址元素的服务元素 WSDL 中不存在这种情况正常吗 这对于 WCF WSDL 来说很常见吗 我正在尝试使用轴
  • 链表中的虚拟节点

    问 什么时候使用它们 作业问题 列表中的第一个和最后一个节点 有时用作列表中的第一个和最后一个节点 从未用作列表中的第一个和最后一个节点 维基百科说 哨兵节点是与链接一起使用的专门指定的节点 列表和树作为遍历路径终止符 哨兵节点的作用是 不
  • 将变量从 jenkins 传递到 testng.xml

    我想根据从詹金斯传递的变量运行测试用例 例如 选择您要运行的测试用例 测试用例一 测试用例二 在 pom xml maven 中
  • 计算移动的球与移动的线/多边形碰撞的时间(2D)

    我有一个多边形 里面有一个移动的球 如果球撞到边界 它应该反弹回来 My current solution I split the polygon in lines and calculate when the ball hits the
  • Checkstyle - 方法按修饰符排序

    是否可以添加到 checkstyle 规则以按修饰符对类中的方法进行排序 我的意思是开头的公共方法和最后的私有方法 MethodsOrderCheck做这个工作 检查文档 https www qulice com qulice checks
  • spring data jpa 过滤 @OneToMany 中的子项

    我有一个员工测试实体是父实体并且FunGroup信息子实体 这两个实体都是通过employeeId映射 我需要一种方法来过滤掉与搜索条件匹配的子实体 以便结果仅包含父实体和子实体 满足要求 员工测试类 Entity name Employe
  • 将带有时区的 Joda-Time `DateTime` 转换为没有时区的 DateTime?

    Given a DateTime http www joda org joda time apidocs org joda time DateTime html例如2015 07 09T05 10 00 02 00 using 乔达时间 h
  • Java,如何管理线程读取socket(websocket)?

    我有一个 WebSocket 服务器 我的服务器创建一个新线程来处理新连接 该线程一直处于活动状态 直到 websocket 中断 我的问题 对于 1 000 000 个连接 我需要 1 000 000 个线程 我如何通过一个线程处理多个
  • 线程“main”中出现异常 java.lang.UnsatisfiedLinkError: ... \jzmq.dll: 找不到依赖库

    我有一个使用 ZMQ 的 java 应用程序 我已经能够在我的 Win7 PC 上运行它 我将 jzmq dll 放在 jar 可执行文件所在的同一文件夹中 然后通过命令 java jar myapp jar 运行它 我的下一步是将其移至服

随机推荐

  • [C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和

    作者 zyl910 本文面对对SSE等SIMD指令集有一定基础的读者 以双精度浮点数组求和为例演示了如何跨平台使用SSE2 AVX指令集 支持vc gcc编译器 在Windows Linux Mac这三大平台上成功运行 一 关键讲解 前文
  • 90道渗透测试面试题(附答案)

    2023年已经快过去一半了 不知道小伙伴们有没有找到自己心仪的工作呀 最近后台收到不少小伙伴说要我整理一些渗透测试的面试题 今天它来了 觉得对你有帮助的话记得点个赞再走哦 1 什么是渗透测试 渗透测试是一种评估计算机系统 网络或应用程序的安
  • 四.javascript对象

    目录 一 对象的介绍 1 对象的概念 2 对象的属性 3 对象的方法 二 创建对象 1 使用构造函数创建内置对象 2 直接创建自定义对象 3 使用自定义构造函数创建对象 三 对象的属性 1 设置对象的属性 2 存取对象属性 3 属性的枚举
  • 使用gpt和mindshow快速制作PPT

    目录 准备工具 PPT制作大体流程 工具 步骤 获取PPT大纲 注意 要markdown格式 编辑 打开MindShow 找不到的可以私信我 编辑 创建ppt 编辑 选择ppt基本样式 编辑 点击下载 不过要提前登录一下就好 编辑 添加动画
  • Qt(c++)调用python一直报错slot、hypot等

    最近在Qt里调用python代码 参考教程 https blog csdn net a137748099 article details 119217197 引入python的include libs之后 在c 里写了简单的调用python
  • 各种通信方式对比

    各种通信方式对比 2011年11月09日 16 58 25 horatio2010 阅读数 444 通信名称 连接端 通信方式 传输顺序 通信速度 I2C scl sda 2 串行 高位 低位 标准模式速度100kbit s 快速模式
  • 前后端常见的几种鉴权方式

    本文链接 https blog csdn net wang839305939 article details 78713124 最近在重构公司以前产品的前端代码 摈弃了以前的session cookie鉴权方式 采用token鉴权 忙里偷闲
  • C#深拷贝和浅拷贝的区别

    先上代码 后解释 public class Person public int Age public DateTime BirthDate public string Name public IdInfo IdInfo
  • C++ Templates:实例化

    延迟实例化 当隐式实例化类模板时 同时也实例化了该模板的每个成员声明 但并没有实例化相应的定义 然而 存在例外 1 如果类模板包含了一个匿名的union 那么该union定义的成员同时也被实例化了 2 作为实例化类模板的结果 虚函数的定义可
  • react ref和组件API

    介绍 昨天学习到了生命周期 今天我们接着昨天的知识点继续学习 今天学习一下state setState以及ref和组件API 大家感兴趣的话可以跟随文章进行学习呦 state和setState state 组件自身状态 setState u
  • 【100%通过率 】【华为OD机试真题】模拟商场优惠打折(一)【2022 Q4

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 模拟商场优惠打折 有三种优惠券可以用 满减券 打折券和无门槛券 满减券 满100减10 满200减20 满300减30 满400减40 以此类推
  • 辛普森悖论

    本系列主要为大家带来一整套的博弈论问题 广义 因为在面试的过程中 除了常规的算法题目 我们经常也会被问到一些趣味题型来考察思维 而这类问题中 很多都有博弈论的影子存在 这些公司里以FLAG Facebook LinkedIn Amazon
  • webpack5.x性能优化之 代码分包 配置文件分离 多入口 SplitChunks cacheGroups runtimeChunk dynamic import(动态导入) 懒加载 魔法注释

    webpack优化 文章目录 webpack优化 代码分离 认识代码分离 多入口起点 Entry Dependencies 入口依赖 SplitChunks chunks 其他的splitChunks属性 很少手动配置 minSize和ma
  • java多线程---C++没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序的设计。

    多线程 Java 的特点之一就是内置对多线程的支持 多线程允许同时完成多个任务 实际上多线程使人产生多个任务在同时执行的错觉 因为目前的计算机的处理器在同一时刻只能执行一个线程 但处理器可以在不同的线程之间快速地切换 由于处理器速度非常快
  • uni-app 和 spring boot 实现通知栏消息推送 (第二版)

    背景 上次第一版打包上线后 无法使用推送失效 第一版使用的是 websocket h5puls 原因 估计是云打包后对这个做了一些编译处理 导致失效 解决方案 用官网的教程 走个推服务器 取消后端自己的websocket实现 虽然麻烦 但是
  • 深度学习入门(四):经典网络架构(Alexnet、Vgg、Resnet)

    一 经典网络架构 Alexnet 2012年ImageNet竞赛冠军 8层神经网络 5层卷积层 3层全连接 二 经典网络架构 Vgg 2014 年ImageNet 竞赛冠军 VGG 最大的特点就是它在之前的网络模型上 通过比较彻底地采用 3
  • Excutor线程池原理详解

    目录 一 线程池的创建以及参数 二 任务提交的方法 三 线程池参数解释 四 线程池原理 五 线程池原理图 六 execute方法执行流程图 一 线程池的创建以及参数 public ThreadPoolExecutor int corePoo
  • vue3.0版本给对象新增属性

    对象新增属性 Reflect set 目标对象 属性名 值 Reflect set val middle middle
  • Spring Cloud Alibaba 2021.0.1.0 版本发布啦

    01 什么是 Spring Cloud Alibaba Aliware Spring Cloud Alibaba 是由阿里巴巴 后文简称 阿里 中间件团队于 2018 年 7 月开源 为业界提供的一套基于阿里内部分布式技术的一站式微服务构建
  • JavaWeb学习-Servlet处理解析JSON文件导出Excel实例

    文章目录 前言 一 实例要求 二 主要问题点 1 保存请求中的文件 2 JSON的简单处理 3 Servlet共享数据 实现勾选信息导出为excel 三 源码 总结 前言 这里是javaweb小白第一次尝试写博客 主要是想记录一下自己在学习