Tianyi's Blog Tianyi's Blog
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)

Tianyi

一直向前,永不停止
首页
  • 计算机网络
  • 操作系统
  • 计算机科学
  • Nginx
  • Vue框架
  • 环境配置
  • Java
  • JVM
  • Spring框架
  • Redis
  • MySQL
  • RabbitMQ
  • Kafka
  • Mirror Sites
  • Dev Tools
  • Docker
  • Jenkins
  • Scripts
  • Windows
  • 科学上网
  • 旅行
  • 网站日记
  • 软件
  • 电子产品
  • 杂野
  • 分类
  • 友情链接
GitHub (opens new window)
  • Java

    • web基础
    • 策略模式
    • Java基础语法
    • JavaWeb-Base
      • Optional处理空指针,这几招你会了吗?
      • 并发编程的艺术
      • 并发编程工具
      • 一个简单的 web 服务器实例
      • 小笔记-线程池
      • 小笔记-JUC入门
    • Golang

    • JVM的奇妙世界

    • Spring

    • Spring增强封装

    • Redis

    • MySQL

    • RabbitMQ

    • Kafka

    • 分享

    • 后端
    • Java
    tianyi
    2021-03-11
    目录

    JavaWeb-Base

    Java web 就是使用 Java 语言去开发一个 web 系统 常用的技术占有 serverlet 和 jsp

    工作3-5年之后,可以尝试手写Tomcat服务器;

    静态网站和动态网站的一个经典举例就是博客和商城

    • 静态里面的资源是不能随意变动,用户看到的都是同一个界面
    • 动态里面的资源是可以随意变动的,例如买东西就会对仓库里的库存减一。是可以操作到数据库的

    # 为什么 Java web 一下就火了呢?

    • sun公司主推的B/S架构,在当时属于巨无霸级别

    • 基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)

    • PHP 虽然开发起来比较快,但是没有办法承载较大的访问量

    • asp 的代码较为繁琐,维护成本很高(缺少分层思想,早期很多软件都是比较缺少分层的思想)

    • 可能遇到的问题:

      1. Java环境变量没有配置;
      2. 闪退问题:需要配置兼容性;
      3. 乱码问题:配置文件中设置。(编码问题改一下配置就好了)
    • 可以配置启动的端口号

      • Tomcat的默认端口号为:8080
      • mysql:3306
      • http:80
      • https:443

    # 网站是如何进行访问的呢?

    当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?

    1. 输入一个域名;回车。通过命令去连接后端服务器

    2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

      1. 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

        127.0.0.1       www.badu.com
        
        1
      2. 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到(no found);

    3. 请求到达服务器:客户端的请求通过网络传输到服务器端。

    4. 服务器接收到请求之后,根据 url 的映射规则,把请求交给对应的 servlet 容器去处理

    5. 验证请求体:通过 http severlate request 对象解析请求内容(解析请求的方法,url 请求头参数等等信息),或者这里还可以对数据进行一个认证

    6. 干活:最后收类的根据请求的内容执行相应的业务逻辑,包括这个数据库的查询、业务处理等等操作

    7. 生成 HttpServletResponse ,包括设置响应头、写入响应体等操作。

    8. Servlet 将生成的响应通过网络传输返回给客户端。

    9. 客户端浏览器接收到服务器返回的响应,根据响应内容进行相应的处理,可能是渲染页面、执行脚本、显示数据等。

    # HTTP

    HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

    • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
    • post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。

    响应状态码

    200:请求响应成功 200

    3xx:请求重定向

    • 重定向:你重新到我给你新位置去;

    4xx:找不到资源 404

    • 资源不存在;

    5xx:服务器代码错误 500 502:网关错误

    # Maven项目架构管理工具

    Maven的核心思想:约定大于配置。

    • settings.xml 修改本地配置
    • 常用的命令
    • pom.xml是Maven的核心配置文件。
    C:\Users\willo>mvn --version
    Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
    Maven home: D:\environment\maven\apache-maven-3.8.6
    Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: D:\AAA\env\java\jre
    Default locale: zh_CN, platform encoding: GBK
    OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
    
    1
    2
    3
    4
    5
    6
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror> 
    
    
    1
    2
    3
    4
    5
    6
    7

    # 创建一个简单项目(serverlet):

    在开发工具中,"Create from archetype" 表示使用 Maven 构建工具创建一个项目时,可以选择使用预定义的项目模板(称为 archetype)来快速初始化项目结构。这样可以避免手动创建项目结构和配置文件,提高了项目创建的效率。

      
    package com.github.servlet;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    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 ServletDemo04 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            System.out.println("进入ServletDemo04文件!");
            //  转发的请求路径
            //  RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");
            //  调用forward实现请求转发;
            //  requestDispatcher.forward(req,resp);
            context.getRequestDispatcher("/gp").forward(req,resp);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    • web.xml 这个配置文件写的是路由路径
    public class GetServlet extends HttpServlet {  
        @Override  
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
            ServletContext context = this.getServletContext();  
            String username = (String) context.getAttribute("username");  
            resp.setContentType("text/html");  
            resp.setCharacterEncoding("utf-8");  
            resp.getWriter().print("名字" + username);  
        }  
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    # 下载文件功能

    
    package com.github.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.URLEncoder;
    
    public class FileServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            //  1. 要获取下载文件的路径;
            String realPath = "F:\\java\\IDEA2020.2\\JavaWeb-02-Servlet\\response\\target\\classes\\02.png";
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
            //  3. 设置想办法让浏览器能够支持下载我们需要的东西;
            resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
            //  4. 获取下载文件的输入流;
            FileInputStream in = new FileInputStream(realPath);
            //  5. 创建缓冲区;
            int len = 0;
            byte[] buffer = new byte[1024];
            //  6. 获取OutputStream对象;
            ServletOutputStream out = resp.getOutputStream();
            //  7. 将FileOutputStream流写入到buffer缓冲区;
            while ((len=in.read(buffer)) > 0){
                out.write(buffer,0,len);
            }
    
            in.close();
            out.close();
            //  8. 使用OutputStream将缓冲区中的数据输出到客户端!
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    • 在标准的Java输入流中,一旦读取完文件的所有内容,输入流通常会处于"EOF"(End of File)状态,此时再次尝试读取文件内容会返回-1,表示已经读取到文件末尾。因此,如果尝试再次读取文件时,输入流会返回-1,而不会再次读取文件的内容。

    # 验证码功能

    package com.github.servlet;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    public class ImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
            //  如何让浏览器3秒自动刷新一次;
            resp.setHeader("refresh","3");
    
            //  在内存中创建一个图片
            BufferedImage image = new BufferedImage(90,40,BufferedImage.TYPE_INT_RGB);
            //  得到图片,笔
            Graphics2D g = (Graphics2D) image.getGraphics();
            //  设置图片的背景颜色
            g.setColor(Color.white);
            g.fillRect(0,0,90,40);
            //  给图片写数据
            g.setColor(Color.RED);
            g.setFont(new Font(null,Font.BOLD,20));
            g.drawString(makeNum(),8,30);
    
            //  告诉浏览器,这个请求用图片的方式打开
            resp.setContentType("image/jpeg");
            //  网站存在缓存,不让浏览器缓存
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
    
            //  把图片写给浏览器
            ImageIO.write(image,"jpg", resp.getOutputStream());
    
        }
    
    //    生成随机数
        private String makeNum(){
            Random random = new Random();
            String num = random.nextInt(9999999) + "";
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 7-num.length() ; i++) {
                sb.append("0");
            }
            num = sb.toString() + num;
            return num;
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60

    # cookie 与会话

    一个网站cookie是否存在上限!聊聊细节问题。

    • 一个Cookie只能保存一个信息;
    • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
    • Cookie大小有限制4kb;
    • 300个cookie浏览器上限。

    删除Cookie;

    • 不设置有效期,关闭浏览器,自动失效;
    • 设置有效期时间为 0 ;
    1. 从请求中拿到cookie信息;
    2. 服务器响应给客户端cookie;
    package com.github.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    import java.util.Date;
    
    /**
     * 中文数据传递
     */
    public class CookieDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 解决中文乱码
            req.setCharacterEncoding("UTF-8");
            resp.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html; charset=UTF-8");
    
            PrintWriter writer = resp.getWriter();
            Cookie[] cookies = req.getCookies();
    
            // 判断Cookie是否存在
            if(cookies!=null){
                // 如果存在,遍历数组
                writer.write("你上一次访问的用户是:");
                for (int i = 0; i < cookies.length; i++) {
                    Cookie cookie = cookies[i];
                    // 获取Cookie的名字
                    if(cookie.getName().equals("name")) {
                        // 解码
                        writer.write(URLDecoder.decode(cookie.getValue(),"UTF-8"));
                    }
                }
            }else{
                writer.write("第一次访问本站!!!");
            }
    
            // 编码
            Cookie cookie = new Cookie("name", URLEncoder.encode("哇哈哈","UTF-8"));
            resp.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55

    一般情况下,Cookies 存储在客户端的临时文件夹中。具体位置和命名规则会因操作系统和浏览器而异,例如:

    • 在 Windows 操作系统下,Cookies 可能存储在以下位置之一:
      • %APPDATA%\Microsoft\Windows\Cookies
      • %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Cookies
    • 在 macOS 操作系统下,Cookies 存储在以下位置之一:
      • /Users/<username>/Library/Cookies
    • 在 Linux 操作系统下,Cookies 存储在以下位置之一:
      • /home/<username>/.config/google-chrome/Default/Cookies
      • /home/<username>/.mozilla/firefox/<profile>/cookies.sqlite

    需要注意的是,即使 Cookies 存储在客户端的文件系统中,通常也是加密或编码的,以保护用户的隐私和安全。此外,浏览器也会对 Cookies 进行管理,包括自动清理过期的 Cookies,提供用户界面用于查看和删除 Cookies 等功能。

    # 还有一些拓展邮箱发送原理的实现等等

    • 有机会实操一下

    https://www.cnblogs.com/gh110/p/15869264.html#17.%E9%82%AE%E4%BB%B6%E5%8F%91%E9%80%81%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0

    【【狂神说Java】JavaWeb入门到实战】 https://www.bilibili.com/video/BV12J411M7Sj/?p=10&share_source=copy_web&vd_source=247958e5546dd3e7e1f29c2624cdfdca

    完善页面 (opens new window)
    Java基础语法
    Optional处理空指针,这几招你会了吗?

    ← Java基础语法 Optional处理空指针,这几招你会了吗?→

    最近更新
    01
    JDK
    02-23
    02
    BadTasteCode && 优化
    09-11
    03
    Gradle 实践操作指南及最佳实践
    09-11
    更多文章>
    Theme by Vdoing | Copyright © 2021-2025 Tandy | 粤ICP备2023113440号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式