77.【JavaWeb文件上传和邮件发送04】

news2024/11/30 2:43:59

JavaWeb

  • (二十五)、文件上传
    • 1.准备工作
    • 2.实用类介绍
    • 3.思维导图:
    • 4.正戏开始
    • 5.完整代码
  • (二十六)、邮箱发送
    • 1.邮箱发送的原理:
    • 2.服务器的原理
    • 3.下载两个jar包
    • 4.基本类:
    • 5.全部代码
    • (二十七)、网站注册发送邮件实现

(二十五)、文件上传

1.首先创建一个empty项目
2.配置project项目中的JDK
在这里插入图片描述
3.设置模板
在这里插入图片描述
4.添加web外部支持
5.基本思路

1.准备工作

下载两个jar包:

apache commons FileUpload

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

apache commons io

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

创建一个lib目录,然后把下载后的两个jar包放入到lib目录下,然后右键
点击 Add as library
在这里插入图片描述
点开项目结构,发现我们手动导入的lib目录不存在,所以要解决为问题
在这里插入图片描述
解决问题的存在
在这里插入图片描述

2.实用类介绍

文件上传的注意事项:
1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如
WEB-INF目录下
2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名(时间戳,uuid md5)
3.要限制上传文件的最大值 (比如朋友圈上传的视频,限制文件)
4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

需要用到的类详解:

ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,通过servletFileUpload对象的构造方法或setFileltemFactory()方法设置ServletFileUpload对象的FileitemFactory属性

3.思维导图:

在这里插入图片描述

4.正戏开始

(1).表单如果包含一个文件上传输入项的化,这个表单的enctype属性就必须设置为multipart/form-data
(2).在html页面input中必须有一个<input type="file" name="filename">
(3).  get: 上传文件大小限制    post: 上传文件大无限制

1.创建文件目录

//* 判断文件上传的是普通表单还是带文件的表单,
        if(ServletFileUpload.isMultipartContent(req)){
            return;//如果是普通表带那就进入直接返回,否则就不运行
        }try {
//创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片
        String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
        File file = new File(realPath);
//  假如说文件目录不存在情况下,我们就创建
        if(!file.exists()){
            file.mkdir(); //创建这个目录
        }

2.创建临时文件目录

//*  缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久
        String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
        File tempFile = new File(tempRealPath);
//  假如说文件目录不存在情况下,我们就创建
        if(!tempFile.exists()){
            tempFile.mkdir(); //创建这个临时目录
        }

3.设置工厂

//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦
//  但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件
// ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//  2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去
        diskFileItemFactory.setSizeThreshold(1024*1024);  //缓存大小为1MB
//  3.
        diskFileItemFactory.setRepository(tempFile);   //临时目录的保存目录,需要一个file

4.获取servletFileUpload

// ******************* 4.获取servletFileUpload
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

//  5.监听文件上传的速度
        servletFileUpload.setProgressListener(new ProgressListener() {
            public void update(long l, long l1, int i) {
                System.out.println("总大小"+l1+"已上传:"+l);
            }
        });
//  处理乱码问题
    servletFileUpload.setHeaderEncoding("UTF-8");
//  设置单个文件的最大值
//   1024=1kb*1024=1MB*10=10MB
     servletFileUpload.setSizeMax(1024*1024*10);

implements sericlizable : 标记接口,JVM----》本地方法栈 native -->C++
在这里插入图片描述

5.完整代码

package com.Jsxs.Servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.junit.jupiter.api.Test;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

public class Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = "文件上传失败!";
//*        判断文件上传的是普通表单还是带文件的表单,
//        if (ServletFileUpload.isMultipartContent(req)) {
//            System.out.println("失败");
//            return;//如果是普通表带那就进入直接返回,否则就不运行
//        }
        try {
//创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片
            String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
            File file = new File(uploadPath);
//  假如说文件目录不存在情况下,我们就创建
            if (!file.exists()) {
                file.mkdir(); //创建这个目录
            }

//*  缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久
            String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
            File tempFile = new File(tempRealPath);
//  假如说文件目录不存在情况下,我们就创建
            if (!tempFile.exists()) {
                tempFile.mkdir(); //创建这个临时目录
            }
//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦
//  但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件
// ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();

//  2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去
            diskFileItemFactory.setSizeThreshold(1024 * 1024);  //缓存大小为1MB
//  3.
            diskFileItemFactory.setRepository(tempFile);   //临时目录的保存目录,需要一个file
/*
 ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,
在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。
所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,
通过servletFileUpload对象的构造方法或setFileltemFactory()方法
设置ServletFileUpload对象的FileitemFactory属性
 */
// ******************* 4.获取servletFileUpload
            ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);

//  5.监听文件上传的速度
            upload.setProgressListener(new ProgressListener() {
                public void update(long l, long l1, int i) {
                    System.out.println("总大小" + l1 + "已上传:" + l);
                }
            });
//  处理乱码问题
            upload.setHeaderEncoding("UTF-8");
//  设置单个文件的最大值
//   1024=1kb*1024=1MB*10=10MB
            upload.setSizeMax(1024 * 1024 * 10);
// ******************* 6. 处理上传文件
            //(1).把前端请求解析,封装成一个FileItem对象,需要从ServletFileUpload对象中获取
            List<FileItem> fileItems = upload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
//   判断上传的文件是普通的表单还是带文件的表单
                if (fileItem.isFormField()) {  //假如说普通的表单
//   判断上传的文件是普通的表单还是带文件的表单
                    String fieldName = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");
                    System.out.println(fieldName + ":" + value);
                } else {  //假如是文件

                    //==================处理文件================//
                    String uploadFileName = fileItem.getName();
                    System.out.println("上传的文件名是:"+uploadFileName);
                    //可能存在文件名不合法的情况
                    if (uploadFileName.trim().equals("") || uploadFileName == null) {
                        continue;
                    }
                    //获得上传的文件名 /imges/girl.jpg
                    String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                    //获得文件的后缀名
                    String fileName_End = uploadFileName.substring(uploadFileName.lastIndexOf(".")+ 1);
                    System.out.println("文件信息【件名:"+fileName+"--->文件类型"+fileName_End+"】");
            /*
                如果文件后缀名fileName_End 不是我们所需要的
                就直接return,不处理,告诉用户文件类型不对
             */
                    //可以使用UUID(唯一识别的通用码),保证文件名唯一
                    //UUID.randomUUID(),随机生成一个唯一识别的通用码;
                    //网络传输中的东西,都需要序列化
                    //POJO,实体类,如果想要在多个电脑上运行,需要传输====》需要把对象都序列化
                    String uuidPath = UUID.randomUUID().toString();
                    //==================存放地址================//
                    //存到哪? :uploadPath--->创建的文件目录
                    // 文件真实存在的路径:realPathFile
                    String realPath = uploadPath + "/" + uuidPath;
                    //给每个文件创建一个对应的文件夹
                    File realPathFile = new File(realPath);
                    if (!realPathFile.exists()) {  //假如说不存在就创建
                        realPathFile.mkdir();
                    }
                    //==================文件传输================//
                    //获得文件上传的流
                    InputStream inputStream = fileItem.getInputStream();
                    //创建一个文件输出流
                    //realpath=真实的文件夹
                    //差一个文件,加上输出文件的名字+"/+uuidPath"
                    FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
                    //创建一个缓冲区
                    byte[] bytes = new byte[1024 * 1024];
                    //判断是否读取完毕
                    int len = 0;
                    //如果大于0说明还存在数
                    while ((len = inputStream.read(bytes)) > 0) {
                        fileOutputStream.write(bytes, 0, len);
                    }
                    //关闭流
                    fileOutputStream.close();
                    inputStream.close();
                    msg = "文件上传成功!";
                    fileItem.delete(); //上传成功,清楚临时文件
                }
            }
            req.setAttribute("msg",msg);
            req.getRequestDispatcher("info.jsp").forward(req,resp);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>上传资源入口</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;

        }
        .pic{

            /*background : url("..img/back8.jng");*/
            height:100%;
            width: 100%;
            background-size: cover;
            background-repeat: no-repeat;
            margin: 60px auto;
        }
        .contain{
            box-shadow: 10px 10px 60px rgba(93, 86, 20, 0.909);
            margin: 0 auto;
            width: 500px;
            height: 500px;
            border-radius: 20px;
            padding-top: 60px;
        }
        input.seat{
            margin-top: 40px;
            height: 35px;
            width: 350px;
        }
        .input_out{
            height: 54px;
            width:100px;
            margin-top: 41px;
            background-color: #6495ED;
            border-width: 0px;
            font-size: 20px;
            color: white;
            margin-left: -5px;
            border-top-right-radius: 10px;  /*圆角*/
            border-bottom-right-radius: 10px;  /*圆角*/
            border-top-left-radius:10px;
            border-bottom-left-radius:10px;
        }
        .bjimg{
            position: fixed;
            top:0;
            left:0;
            width: 100%;
            height: 100%;
            z-index: -10;
            /*适应*/
            object-fit: cover;
        }
        #file{
            width: 200px;
            height: 100px;
        }
    </style>
</head>
<body>
<video src="img/1.mp4" loop autoplay class="bjimg"></video>
<div class="pic">
    <div class="contain"  >
        <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
            <div align="center">
            <br/>
            <strong><span style="font-size: 40px; color: white; font-family: 楷体">文件传输页面</span></strong><br></div>
            <div align="center">
            <br/><br/>
            <input type="text" class="seat" name="username" placeholder="请输入上传用户名" id="seat"><br>
             <input type="file" placeholder="上传文件" name="FileUpload" style="background: aqua" id="file"><br/>
            <br/>
            <input type="submit" class="input_out" onmousemove="this.className='input_move'" onmouseout="this.className='input_out'" value="开始上传">
        </div>
        </form>
    </div>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="4.0" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<!--对servlet进行配置-->
<servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>com.Jsxs.Servlet.Servlet</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/upload.do</url-pattern>
    </servlet-mapping>
</web-app>

(二十六)、邮箱发送

1.邮箱发送的原理:

在这里插入图片描述

2.服务器的原理

在这里插入图片描述

3.下载两个jar包

JavaMail API (compat) » 1.4.7

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

JavaBeans™ Activation Framework » 1.1.1

<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

4.基本类:

在这里插入图片描述

5.全部代码

package Com.Jsxs;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

//发送一个简单的邮件
public class MailDemo1 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com");  // 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");  //邮件发送协议
        prop.setProperty("mail.smtp.auth","true");   //需要验证用户密码
//      关于QQ邮箱,还要设置SSL加密,加上一下代码即可
        MailSSLSocketFactory sf= new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);
//       使用JavaMail发送邮件的五个步骤

//  1.创建定义整个应用程序所需要的环境信息的session对象
        Session session=Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
//        发件人邮件用户名,授权码
                return new PasswordAuthentication("2261203961@qq.com","授权码");
            }
        });
//        开启Session的debug模式,这样就可以看到程序发送Email的运行状态
        session.setDebug(true);
//  2.通过session得到transport对象
        Transport ts = session.getTransport();

//  3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","2261203961@qq.com","授权码");
//  4.创建邮件: 写邮件

//  注意需要传递Session
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("2261203961@qq.com"));
        //指明邮件的收件人,发件人和收件人一样就是发送给自己
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("2261203961@qq.com"));
        //邮件的标题
        message.setSubject("吉士先生");
        //邮件的文本内容:
        message.setContent("<h1 style='color: red'>你好啊,李威涛<h1>","text/html;charset=UTF-8");
//  5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
//  6.关闭邮件链接
        ts.close();
    }
}

在这里插入图片描述

(二十七)、网站注册发送邮件实现

在这里插入图片描述

package com.Jsxs.Util;

import com.Jsxs.projo.User;
import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;
// 网站三秒原则

public class Sendmail extends Thread{
//
    private String from="2261203961@qq.com";
//    邮箱的用户名
    private String username="2261203961@qq.com";
//    授权码
    private String password="dbiqifywbfxjdjdh";
//    发送邮件的服务器地址
    private String host="smtp.qq.com";
    private static User user;
    public Sendmail(User user){
        this.user=user;
    }

    public void run(){
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host",host);  // 设置QQ邮件服务器
            prop.setProperty("mail.transport.protocol","smtp");  //邮件发送协议
            prop.setProperty("mail.smtp.auth","true");   //需要验证用户密码
//      关于QQ邮箱,还要设置SSL加密,加上一下代码即可
        MailSSLSocketFactory sf= null;
            sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable","true");
            prop.put("mail.smtp.ssl.socketFactory",sf);
//       使用JavaMail发送邮件的五个步骤

//  1.创建定义整个应用程序所需要的环境信息的session对象
            Session session=Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
//        发件人邮件用户名,授权码
                    return new PasswordAuthentication(username,password);
                }
            });
//        开启Session的debug模式,这样就可以看到程序发送Email的运行状态
            session.setDebug(true);
//  2.通过session得到transport对象
            Transport ts = session.getTransport();

//  3.使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host,username,password);
//  4.创建邮件: 写邮件
            MimeMessage mimeMessage = imageMall(session);
//  5.发送邮件
            ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//  6.关闭邮件链接
            ts.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
        public static MimeMessage imageMall(Session session) throws MessagingException {
            //  注意需要传递Session
            MimeMessage mimeMessage = new MimeMessage(session);
            //指明邮件的发件人
            mimeMessage.setFrom(new InternetAddress("2261203961@qq.com"));
            //指明邮件的收件人,发件人和收件人一样就是发送给自己
            mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));
            //邮件的标题
            mimeMessage.setSubject("用户注册");
            String info="恭喜您注册成功,您的用户名为:"+user.getUsername()+",您的密码:"+user.getPassword()+",请您妥善管理";
            //===================================================================图片//
            //准备图片数据
            MimeBodyPart image = new MimeBodyPart();
            //图片需要进行处理
            DataHandler dh = new DataHandler(new FileDataSource("E:\\Ideal源码\\emali\\web\\img\\3.png"));
            image.setDataHandler(dh);  //在我们的主题中 放入这个处理后的数据
            image.setContentID("haha.jpg");  //给图片设置一个ID
            //准备正文数据
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("<img src='cid:haha.jpg'>"+info,"text/html;charset=UTF-8");
            //*******************************************************************附件//
            //附件
            MimeBodyPart body3 = new MimeBodyPart();
            body3.setDataHandler(new DataHandler(new FileDataSource("E:\\Ideal源码\\mail-java\\src\\Com\\resourece\\log4j.properties")));
            body3.setFileName("");  //附件设置名字

            MimeBodyPart body4 = new MimeBodyPart();
            body4.setDataHandler(new DataHandler(new FileDataSource("E:\\Ideal源码\\mail-java\\src\\Com\\resourece\\1.txt")));
            body4.setFileName(""); //附件设置名字

            //拼装正文内容---->文本和图片
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text);
            mm.addBodyPart(image);
            mm.setSubType("related");
            //将拼接好的正文内容设置为主题
            MimeBodyPart contentText = new MimeBodyPart();
            contentText.setContent(mm);

            //拼装附件
            MimeMultipart allFile = new MimeMultipart();
            allFile.addBodyPart(body3);  //附件1
            allFile.addBodyPart(body4);    //附件2
            allFile.addBodyPart(contentText); //正文
            allFile.setSubType("mixed");  //所有类型都设置为mixed

            //设置到消息,保存修改
            mimeMessage.setContent(allFile);
            mimeMessage.saveChanges();
            //===================================================================//
            return mimeMessage;
        }
    }


package com.Jsxs.Servlet;

import com.Jsxs.Util.Sendmail;
import com.Jsxs.projo.User;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        System.out.println(username+" "+password+" "+email);
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setEmail(email);
        Sendmail sendmail = new Sendmail(user);
        sendmail.start();
        //注册用户;
        req.setAttribute("message","注册成功,我们已经向您发送了一封电子邮件,请您查收");
        req.getRequestDispatcher("info.jsp").forward(req,resp);

    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

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

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

相关文章

【JVM】jvm中的栈简介

jvm中的栈简介一、JVM体系结构二、栈是什么&#xff1f;三、栈的特性四、栈帧五、栈的运行原理5.1 运行原理5.2 代码示例5.2.1 方法的入栈和出栈5.2.2 没有捕获异常5.2.3 捕获异常六、栈帧的内部结构七、运行时数据区&#xff0c;哪些部分存在Error和GC&#xff1f;八、本文源码…

boot 创建 https

需要在配置文件中&#xff1a;加入 server:ssl:key-store: classpath:https.keystorekey-store-type: JKSkey-alias: tomcatkey-password: 123456key-store-password: 123456port: 8089 这样原本请求的http&#xff0c;就需要变成https&#xff0c;其他类似 RestController p…

深度学习入门(五十六)循环神经网络——循环神经网络RNN

深度学习入门&#xff08;五十六&#xff09;循环神经网络——循环神经网络RNN前言循环神经网络——循环神经网络RNN课件潜变量自回归模型循环神经网络使用循环神经网络的语言模型困惑度&#xff08;perplexity&#xff09;梯度裁剪更多的应用RNNs总结教材1 无隐状态的神经网络…

周赛总结--LeetCode单周赛321场 AcWing79场

1. LeetCode单周赛321场 1.1 找出中枢整数 1.1.1 原题链接&#xff1a;力扣https://leetcode.cn/problems/find-the-pivot-integer/ 1.1.2 解题思路&#xff1a; 1、先保存 1-n 的和sum&#xff1b; 2、从 1 开始枚举&#xff0c;判断前 i 项和 cmp 与 sum - cmp i 是否相等…

MySQL第二弹

目录​​​​​​​ 一、数据库基本操作 1、查看数据库信息 2、查看数据库中的表信息 3、显示数据表的结构&#xff08;字段&#xff09; 4、常见的数据类型 4.1 数值类型 4.2 日期和时间类型 4.3 字符串类型 二、SQL语言概述 1、SQL语言 2、SQL分类 2.1 DDL:数据定…

【强化学习论文合集】NeurIPS-2021 强化学习论文

强化学习&#xff08;Reinforcement Learning, RL&#xff09;&#xff0c;又称再励学习、评价学习或增强学习&#xff0c;是机器学习的范式和方法论之一&#xff0c;用于描述和解决智能体&#xff08;agent&#xff09;在与环境的交互过程中通过学习策略以达成回报最大化或实现…

js——高阶函数、闭包、递归以及浅拷贝和深拷贝

目录 一、高阶函数 1、什么是高阶函数 2、把一个函数作为参数 3、return 返回的也是一个函数 二、闭包 1、闭包是什么 2、变量的作用域 3、案例 4、结果展示&#xff1a; 5、总结&#xff1a; 三、递归 1、什么是递归 2、案例一 3、分析 4、问题 5、栈溢出又是什…

【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom

接上一篇基于高斯模糊的Bloom继续进行接下来的学习。 1 一些必要的思考* 1.1 关于高质量Bloom 前面提到了&#xff0c;Bloom对于游戏必不可少的效果之一&#xff0c;于是我们不仅仅要把Bloom效果实现出来&#xff0c;效果的质量好坏就更加是我们需要关注的点了。高质量泛光&a…

面试宝典之C++多态灵魂拷问

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、重载&#xff0c;隐藏/重定义&#xff0c;覆盖/重写二、多态的原理三、inline可以是虚函数吗四、静态成员函数可以是虚函数吗五、构造函…

海丝一号-中国-2020

2020年12月22日&#xff0c;由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制&#xff0c;整星重量小于185kg&#xff0c;成像最高分辨率1m&#xff0c;可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 &#xff08;Linux操作系统-2022的前面章节都为铺垫&#xff09; 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合&#xff0c;此选项为短选项&#xff0c;–单词&#xff0c;此选项为长选项 Options选项&…

因果推断 | 双重差分法笔记补充

换了新的环境后&#xff0c;一直在适应&#xff08;其实是一直被推着走&#xff09;&#xff0c;所以停更了笔记好久啦。这一周周末终于有点得空&#xff0c;当然也是因为疫情&#xff0c;哪里都不能去&#xff0c;哈哈&#xff0c;所以来冒个泡~ 整理了最近pre的作业&#xf…

ESP32-CAM初始篇:Arduino环境搭建-->实现局域网推流

ESP32-CAM初始篇&#xff1a;Arduino环境搭建–>实现局域网推流 入手产品&#xff1a;安信可科技&#xff1a;ESP32-CAM摄像头开发板&#xff1a; 相关产品特性请访问安信可ESP32-CAM官网&#xff1a;https://docs.ai-thinker.com/esp32-cam 第一步&#xff1a;下载Ardui…

基于51单片机数字频率计的设计

目录 前 言 1 第一章 总体设计方案 2 1.1 总设计框图 2 1.2 硬件设计分析 2 1.2.1 电源的设计 2 &#xff08;4&#xff09;&#xff1a;LCD1602的指令说明及时序 10 &#xff08;5&#xff09;&#xff1a; LCD1602的RAM地址映射及标准字库表 13 第二章 软件设计与分析 15 2.1…

谷粒商城十一商城系统及整合thymeleaf渲染商城首页

我们的商城系统本应该也是前后端分离的&#xff0c;就像后台管理系统那样&#xff0c;然而出于教学考虑&#xff0c;前后端分离的话就会屏蔽掉很多细节&#xff0c;所以我们进行服务端的页面渲染式开发&#xff08;有点儿类似freemarker&#xff09; 这些页面直接粘贴到微服务…

含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86500759 主要使用技术 ServletJSPcssjsMysqlTomcat 功能介绍 (1)前台功能模块&#xff1a; 注册登陆&#xff1a;顾客可以通过填写注册信息成为会员&#xff0c;登陆后才能进行购物车的管…

汽车 Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

基于Android的JavaEE课设

目录 1 技术栈 2 android前端 2.1 概述 2.1.1 目录结构 2.1.2 代码分层 2.2 技术点 2.2.1 数据绑定 2.2.2 前后端数据交互 2.2.3 九宫格图片 2.2.4 未处理消息提醒 2.2.5 动画效果 2.2.6 实时聊天 2.2.7 文件上传 2.2.8 底部弹窗 2.2.9 其他 3 后端 3.1 概述 …

BUUCTF Misc 假如给我三天光明 数据包中的线索 后门查杀 webshell后门

假如给我三天光明 下载文件&#xff0c;一个压缩包&#xff08;需要密码&#xff09;和图片 百度得知下面一行是盲文&#xff0c;根据盲文对照表 和上述图片对照&#xff0c;得到字符串&#xff1a;kmdonowg 。使用它解压压缩包 使用Audacity打开 转换成摩斯密码&#xff0c;…

C语言程序设计 复习总结[持续更新ing]

目录 一 初识C语言 1 main 主函数 2 注释 3 C 程序执行的过程&#xff1a; 4 C 程序的结构 5 进制的转换 1.内存容量 2.二进制与十进制的转换 1>将二进制数转换成十进制 2>将十进制转换成二进制数 3.二进制与八进制的转换 1>将八进制数转换成二进制: 2>将二进…