【学习笔记】手写 Tomcat 三

news2024/11/16 1:47:50

目录

多线程处理

1. 创建线程 thread

2. 使用 start() 启动线程

3. 启动服务端

响应动态资源

JDBC

创建 lib 文件夹,存放第三方 jar包 

JDBC 的7个步骤

定义响应动态资源的方法

DTO 数据传输对象

再创建一个响应方法

测试

作业

1. 客户端发送 -1 报错怎么解决

2. JDBC 优化

预习

1. jq 的ajax

2. servlet


多线程处理

在昨天的基础上,再进一步优化,能够有一条线程专门处理一个客户端的请求

在使用多线程之前,我们先优化一下目前的结构

1. 创建线程 thread

package com.shao.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Tomcat {
    public Tomcat() {
        ServerSocket ss = null;
        try {
            ss = new ServerSocket(8080);
            while (true) {

                // 调用accept()方法阻塞等待,直到有客户端连接到服务器,返回一个Socket对象用于与该客户端通信
                Socket socket = ss.accept();

                System.out.println("客户端连接成功");

                // 获取Socket对象的输入流,用于读取客户端发送的数据
                InputStream is = socket.getInputStream();

                // 获取Socket对象的输出流,用于向客户端发送数据
                OutputStream os = socket.getOutputStream();

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        // 定义一个字节数组,存放客户端发送的请求信息
                        byte[] bytes = new byte[1024];

                        // 读取客户端发送的数据,返回读取的字节数
                        int len = 0;
                        try {
                            len = is.read(bytes);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        // 将读取的字节数组转换为字符串
                        String msg = new String(bytes, 0, len);

                        // 调用HttpRequest类解析请求信息
                        HttpRequest httpRequest = new HttpRequest(msg);

                        // 拼接请求的静态资源的路径
                        // 路径是相对路径,从模块的根路径开始
                        String filePath = "webs/pages" + httpRequest.getRequestModule();
                        HttpResponse httpResponse = new HttpResponse(os, httpRequest);
                        // 响应数据
                        httpResponse.response(filePath);
                    }
                }).start(); // 启动线程
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭连接通道
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 使用 start() 启动线程

new Thread(new Runnable() {
    @Override
    public void run() {
    }
}).start();

3. 启动服务端

在启动类的 main 方法中 创建 Tomcat 对象启动服务端


 

响应动态资源

现在已经可以响应静态资源了,如何响应动态资源呢?

JDBC

动态资源一般需要操作数据库,所以我们要使用 java 数据库连接  也就是JDBC 

使用JDBC 操作数据库,需要使用到第三方 jar 包

因为java 提供了统一的接口,不同的数据库厂商实现这个接口,所以使用统一的语法就可以操作不同的数据库

在选择第三方 jar 包的时候需要根据所使用的数据库去下载

因为我使用的数据库是 Mysql ,所以 jar 包是从Mysql官网下载的

百度网盘 mysql jar包

创建 lib 文件夹,存放第三方 jar包 

JDBC 的7个步骤

1. 加载JDBC 驱动

2. 定义连接数据库的URL

3. 建立数据库连接

4. 创建可执行对象 statement

5. 执行SQL

6. 结果处理

7. 释放连接

定义响应动态资源的方法

响应静态资源 index.html 的时候是根据扩展名 .html 判断的

响应动态资源不需要写文件名了,只需要写功能的名称即可

比如登录功能,可以定义名称为 doLogin

1. 加载JDBC 驱动

2. 定义连接数据库的URL

3. 建立数据库连接

4. 创建可执行对象 statement

5. 执行SQL

6. 结果处理

这是我的数据库的 user 表

DTO 数据传输对象

DTO 是一种服务端给客户端传输数据的格式

package com.shao.Utils;

public class responseDTO {

    private int statusCode;
    private Object data;
    private String msg;
    private int count;


    public responseDTO() {
    }

    public responseDTO(int statusCode, Object data, String msg) {
        this.statusCode = statusCode;
        this.data = data;
        this.msg = msg;
    }

    public responseDTO(int statusCode, Object data, String msg, int count) {
        this.statusCode = statusCode;
        this.data = data;
        this.msg = msg;
        this.count = count;
    }

    /**
     * 获取
     *
     * @return statusCode
     */
    public int getStatusCode() {
        return statusCode;
    }

    /**
     * 设置
     *
     * @param statusCode
     */
    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    /**
     * 获取
     *
     * @return data
     */
    public Object getData() {
        return data;
    }

    /**
     * 设置
     *
     * @param data
     */
    public void setData(Object data) {
        this.data = data;
    }

    /**
     * 获取
     *
     * @return msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置
     *
     * @param msg
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }

    /**
     * 获取
     *
     * @return count
     */
    public int getCount() {
        return count;
    }

    /**
     * 设置
     *
     * @param count
     */
    public void setCount(int count) {
        this.count = count;
    }

    public String toString() {
        return "responseDTO{statusCode = " + statusCode + ", data = " + data + ", msg = " + msg + ", count = " + count + "}";
    }
}

再创建一个响应方法

在 httpResponse 响应类中 再创建一个响应方法,响应动态资源

    public void send(String content) {
        // 转成字节数组
        byte[] contentBytes = content.getBytes();
        // 获取请求协议
        String protocol = httpRequest.getRequestProtocol();
        try {
            os.write((protocol + " 200 OK\r\n").getBytes());
            os.write(("Content-Type: " + "text/html;charset=utf-8" + "\r\n").getBytes());
            os.write(("Content-Length: " + contentBytes.length + "\r\n").getBytes());
            os.write("\r\n".getBytes());
            os.write(contentBytes);
            os.flush();
            System.out.println("响应成功");
            os.close();

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

测试

在游览器的地址栏 输入 http://127.0.0.1:8080/doLogin?account=16701&password=Abc123456

http://127.0.0.1:8080 是本地地址

/doLogin 是功能的名称

account=16701&password=Abc123456 是请求的参数

 

可以看到请求的参数信息

作业

1. 客户端发送 -1 报错怎么解决

2. JDBC 优化

预习

1. jq 的ajax

2. servlet

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

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

相关文章

ES-Search API

一、Search API的分类 URI Search 在url中传入查询参数进行查询,Request Body Search 使用es提供的,基于json的更加完备的Query Domain Specific Language(DSL) 语法范围/_search集群上所有的索引/index1/_search查询索引名为index1的索引/index1,inde…

828华为云征文|基于华为云Flexus云服务器X部署Minio服务

文章目录 ❀前言❀Minio简介❀部署环境准备❀yum环境配置❀安装docker❀获取镜像❀创建挂载目录❀启动容器❀查看容器状态❀安全组开放❀浏览器访问❀总结 ❀前言 大家好,我是早九晚十二。 近期华为云推出了最新的华为云Flexus云服务器X,这款云主机在算…

开发模式和环境搭建

后台用到的知识 Validatation:参数校验Mybatis:数据库的操作Redis:缓存Junit:单元测试项目部署 开发模式 使用接口文档对应路径和请求方式、请求参数、响应数据作详细说明。 环境搭建 执行big_event.sql脚本准备数据库表 创建…

240416 初始化列表 构造与隐式类型转换 static成员 友元 内部类

一、初始化列表 1、认识 【P】Stack不具备默认构造,MyQueue也无法生成默认构造 【S】引入初始化列表 MyQueue(int n):_pushst(n),_popst(n),_size(0) {}初始化列表本质上可以理解为每个对象中成员定义的地方 所有成员既可以在初始化列表初始化,也可以…

1. geoserver 安装

1. 下载 geoserver官网 以window为例 选择稳定版本 不同平台需要下载不同安装包 如果需要发布瓦片图层,需要下载扩展插件 前提需要有java环境,根据提示默认安装,需要安装在不同位置选择自己的文件夹即可 2. 使用 扩展插件解压之后的所…

【油猴脚本】编写一个简单的油猴(Tampermonkey)脚本,在网页中加入一个表格

前言:哈喽,大家好,今天给大家分享【油猴脚本】编写一个简单的油猴(Tampermonkey)脚本,在网页中加入一个表格!并提供具体代码帮助大家深入理解,彻底掌握!创作不易&#xf…

2024年最新老薛主机优惠码

老薛主机优惠码是其推出的一种优惠促销方式,大家在新购或续费老薛主机相关产品时,填写使用优惠码可以享受专属折扣。 一、老薛主机优惠码 1、终身七折优惠码:u70 2、新购七折优惠码:ABC 二、优惠码适用范围 老薛主机的优惠码通…

《使用 LangChain 进行大模型应用开发》学习笔记(三)

前言 本文是 Harrison Chase (LangChain 创建者)和吴恩达(Andrew Ng)的视频课程《LangChain for LLM Application Development》(使用 LangChain 进行大模型应用开发)的学习笔记。由于原课程为全英文视频课…

Keil MDK报错:Browse information of one or more files is not available----解决方法:

Keil MDK报错:Browse information of one or more files is not available----解决方法: 问题描述 最近在项目中遇到这样一个问题:拷贝过来添加到工程的.c文件在编译时报如下错误: 解决方案: 总结以下一些解决办法&…

PCL 读取和保存点云

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 1.1原理 PCL (Point Cloud Library) 是…

开源免费的工贸一体行业ERP管理系统

引言 在当今数字化浪潮汹涌澎湃的时代,中小企业面临着前所未有的挑战与机遇。如何实现数字化转型发展,成为了众多中小企业主心头的大事。 据相关数据显示,目前我国中小企业数量已经超过了 4000 万户,然而成功实现数字化转型的比例…

单向链表之创建,插入,输出(下)

文章目录 🍊自我介绍🍊插入(下)尾插法有序插入:按照指定顺序插入 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连)哦~ 🍊自我介绍 H…

Arduino 2线串行 通信 驱动 LCD 12864

上效果图片 源代码 Arduino 328p /****************************************************************** 2线 LCD 12864 (屏幕主控芯片 ST7920)******************************************************************//***********************端口/引脚定义区域************…

Golang | Leetcode Golang题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; func readBinaryWatch(turnedOn int) (ans []string) {for i : 0; i < 1024; i {h, m : i>>6, i&63 // 用位运算取出高 4 位和低 6 位if h < 12 && m < 60 && bits.OnesCount(uint(i)) turnedOn {ans …

WPF创建不规则窗体时WebBrowser控件不显示的问题

最近有小伙伴需要在不规则窗体上放置WebBrowser控件&#xff0c;因为设置了WindowStyle"None" 和 AllowsTransparency"True"。 导致WebBrowser控件不显示。 界面代码如下所示&#xff1a; 1 <Window x:Class"WebBrowserDemo.MainWindow" …

【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)

BUU UPLOAD COURSE 1 1 上课用~ 点击启动靶机。 解法 疑似存在文件包含漏洞。 http://15a5666e-1796-4f76-b892-0b69cf97df8e.node5.buuoj.cn:81/index.php?fileupload.php查看网页源代码。判断是后端检查。 <!DOCTYPE html> <html lang"zh-cn"> &…

区块链Dapp开发:质押挖矿的各模式开发详解

质押挖矿是区块链去中心化金融&#xff08;DeFi&#xff09;生态系统中的核心部分&#xff0c;吸引了大量用户参与。随着Dapp&#xff08;去中心化应用&#xff09;的普及&#xff0c;质押挖矿的模式多样化发展&#xff0c;不同模式各有其优点和风险。本文将介绍质押挖矿的基本…

SpringBoot快速接入OpenAI大模型(JDK8)

使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型&#xff0c;并且如何实现流式与非流式的输出&#xff0c;以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3&#xff0c;但是目前很多应用依旧使用的JDK8版本&…

计算机毕业设计选题推荐-校园车辆管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

最新版微服务项目搭建

一&#xff0c;项目总体介绍 在本项目中&#xff0c;我将使用alibabba的 nacos 作为项目的注册中心&#xff0c;使用 spring cloud gateway 做为项目的网关&#xff0c;用 openfeign 作为服务间的调用组件。 项目总体架构图如下&#xff1a; 注意&#xff1a;我的Java环境是17…