javaWeb大体了解

news2024/11/22 21:54:21

Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站

JavaWeb: 是用 Java技术来解决相关web互联网领域的技术栈。

JavaWeb 技术栈

B/S 架构:

Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。

好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本。

静态资源:

HTML、CSS、JavaScript、图片等。负责页面展现

动态资源:

Servlet、JSP 等。负责逻辑处理

数据库:

负责存储数据

HTTP协议:

HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

特点:

基于TCP协议:面向连接,安全

基于请求-响应模型的:一次请求对应一次响应

HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。

缺点:多次请求间不能共享数据。

优点:速度快

HTTP-请求数据格式

请求数据分为3部分:

请求行:请求数据的第一行。其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本;

请求头:第二行开始,格式为key:value形式;

常见的HTTP 请求头:

Host: 表示请求的主机名;

User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ... Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...) like Gecko;

Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;

Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;

Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。

请求体:POST请求的最后一部分,存放请求参数。

GET请求和 POST请求区别:

GET请求请求参数在请求行中,没有请求体。POST请求请求参数在请求体中;

GET请求请求参数大小有限制,POST没有。

get:

GET / HTTP/1.1

Host: www.itcast.cn

Connection: keep-alive

User-Agent: Mozilla/5.0 Chrome/91.0.4472.106

post:

POST / HTTP/1.1

Host: www.itcast.cn

Connection: keep-alive

Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1

User-Agent: Mozilla/5.0 Chrome/91.0.4472.106

username=name&password=123456

HTTP-响应数据格式

响应数据分为3部分:

响应行:响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述。

状态码:

 

响应头:第二行开始,格式为key:value形式

常见的HTTP 响应头:

Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;

Content-Length:表示该响应内容的长度(字节数);

Content-Encoding:表示该响应压缩算法,例如gzip;

Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒

响应体: 最后一部分。存放响应数据

例如:

HTTP/1.1 200 OK

Server: Tengine

Content-Type: text/html

Transfer-Encoding: chunked…

<html>

<head>

     <title></title>

</head>

<body></body>

</html>

模拟接收和响应

import sun.misc.IOUtils;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

/*

    自定义服务器

 */

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(8080); // 监听指定端口

        System.out.println("server is running...");

        while (true){

            Socket sock = ss.accept();

            System.out.println("connected from " + sock.getRemoteSocketAddress());

            Thread t = new Handler(sock);

            t.start();

        }

    }

}

class Handler extends Thread {

    Socket sock;

    public Handler(Socket sock) {

        this.sock = sock;

    }

    public void run() {

        try (InputStream input = this.sock.getInputStream()) {

            try (OutputStream output = this.sock.getOutputStream()) {

                handle(input, output);

            }

        } catch (Exception e) {

            try {

                this.sock.close();

            } catch (IOException ioe) {

            }

            System.out.println("client disconnected.");

        }

    }

    private void handle(InputStream input, OutputStream output) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));

        // 读取HTTP请求:

        boolean requestOk = false;

        String first = reader.readLine();

        if (first.startsWith("GET / HTTP/1.")) {

            requestOk = true;

        }

        for (;;) {

            String header = reader.readLine();

            if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕

                break;

            }

            System.out.println(header);

        }

        System.out.println(requestOk ? "Response OK" : "Response Error");

        if (!requestOk) {

            // 发送错误响应:

            writer.write("HTTP/1.0 404 Not Found\r\n");

            writer.write("Content-Length: 0\r\n");

            writer.write("\r\n");

            writer.flush();

        } else {

            // 发送成功响应:

            //读取html文件,转换为字符串

            BufferedReader br = new BufferedReader(new FileReader("http/html/a.html"));

            StringBuilder data = new StringBuilder();

            String line = null;

            while ((line = br.readLine()) != null){

                data.append(line);

            }

            br.close();

            int length = data.toString().getBytes(StandardCharsets.UTF_8).length;

            writer.write("HTTP/1.1 200 OK\r\n");

            writer.write("Connection: keep-alive\r\n");

            writer.write("Content-Type: text/html\r\n");

            writer.write("Content-Length: " + length + "\r\n");

            writer.write("\r\n"); // 空行标识Header和Body的分隔

            writer.write(data.toString());

            writer.flush();

        }

    }

}

Web服务器:

封装了很多HTTP的操作:负责解析 HTTP 协议,解析请求数据,并发送响应数据。

看 开源工具专栏/tomcat

servlet

看本专栏的详述

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

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

相关文章

读书笔记-《ON JAVA 中文版》-摘要10[第十一章 内部类]

文章目录1. 创建内部类2. 链接外部类3. 使用 .this 和 .new4. 内部类与向上转型5. 内部类方法和作用域6. 匿名内部类7. 嵌套类7.1 嵌套类7.2 接口内部的类7.3 从多层嵌套类中访问外部类的成员8. 为什么需要内部类8.1 为什么需要内部类8.2 闭包与回调8.3 内部类与控制框架9. 继承…

智慧农业远程监控系统解决方案

我国是一个农业大国&#xff0c;农作物种植在全国范围内都非常广泛&#xff0c;农作物病虫害防治工作的好坏、及时与否对于农作物的产量、质量影响至关重要。因种植面积广&#xff0c;分布不均&#xff0c;农业工作人员不能够做到在灾害发生时及时出现在现场&#xff0c;所以农…

【Linux】理解缓冲区

文章目录一.引入二.认识缓冲区1.为什么2.刷新策略3.在哪里三、理解缓冲区一.引入 我们发现 printf 和 fwrite &#xff08;库函数&#xff09;都输出了2次&#xff0c;而 write 只输出了一次&#xff08;系统调用&#xff09;。为什么呢&#xff1f;肯定和fork有关&#xff01;…

C++职工管理系统,eof()函数,选择排序

目录 1.创建管理类 1.1头文件实现&#xff0c;在workerManager.h中设计管理类 1.2源文件实现&#xff0c;在workerManager.cpp中将构造和析构函数的空实现补全 2.菜单功能 2.1在管理类workerManager.h中添加菜单成员函数 2.2在管理类workerManager.cpp中写实现 3.退出功能 …

Pycharm基础安装教程:搭建python环境+安装pycharm

嗨害大家好鸭&#xff01;我是小熊猫~ 之前有的小伙伴总说小熊猫发的内容不够基础… 这次小熊猫就来给大家做一个简单的安装介绍吧~ 这里给大家准备了社区版pycharm2021.2 &#xff08;最新版部分库不稳定&#xff0c;不建议下载&#xff09; 第一次安装的小伙伴实在不会下载…

【JavaSE系列】第十节 —— 带你吃透抽象类

&#xff08;6&#xff09;当一个抽象类 继承一个抽象类的时候&#xff0c;可以不用来重写 当作父类的那个抽象类的抽象方法&#xff1a;提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、抽象类的概念 二、…

二叉苹果树 【树形dp(背包)】

来源&#xff1a;牛客网 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/25022/1006 题目描述 有一棵二叉苹果树&#xff0c;如果数字有分叉&#xff0c;一定是分两叉&#xff0c;即没有只有一个儿子的节点。这棵树共N个节点&#xff0c;标号1至N&#xff0c;树根编…

rollup.js配置环境变量

场景: 由于项目是通过svelte.js rollup.js框架搭建起来的, 并没有使用到cli脚手架, 没有办法配置不同环境的变量一. 使用cross-env添加环境变量安装cross-env&#xff0c;它可根据不同的系统设置环境变量npm install cross-env --save-dev在 package.json 中&#xff1a;"…

MongoDB索引

介绍 增加查询效率&#xff0c;不必每次都全表扫描单字段索引&#xff1a;在用户单个字段上创建升序/降序索引复合索引&#xff1a;在多个字段上添加索引&#xff1b;如{name:1, age:-1}&#xff0c;关注field顺序其他索引&#xff1a;地理空间索引&#xff0c;文本索引&#x…

浙大MBA复试经验和真题分享——知己知彼胜率更高

前段时间跟朋友吃饭的时候&#xff0c;问我在浙大读MBA是什么体验&#xff1f;其实说实话&#xff0c;当时选择浙大&#xff0c;主要还是为了学历&#xff0c;觉得自己一个普通的二本学历真的平平无奇&#xff0c;公司里面新进的员工虽然年纪轻&#xff0c;但学历却很有来头&am…

PySpark任务提交spark-submit参数设置一文详解

目录 前言 一、PySpark集群运行原理 二、spark-submit参数详解 1.指定运行目录 2.--deploy-mode 3.--master 4.驱动程序和执行器资源 5.--files和--verbose 6.Spark提交配置 三.PySpark程序提交配置选项 1.构建一套虚拟环境 2. 模块依赖问题原因 参阅 前言 之前我们已…

MySQL 笔记

文章目录安装MySQL 语法格式MySQL数据类型命令操作数据库CRUD查询创建表删除表修改表操作数据增改删查基础查询条件查询模糊查询排序查询分组查询分页查询聚合函数约束约束分类安装 软件安装&#xff5c;macOS下超详细的MySQL安装 MySQL 语法格式 每条语句以分号;结尾&#…

LeetCode150.逆波兰表达式

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意 有效的算符为 、-、* 和/。…

如何mock当前类的私有方法

背景 基础知识 mockito单元测试&#xff1a;它的做法是mock掉当前类的所有外部依赖&#xff0c;保障自己的代码没有问题。举个例子&#xff0c;如果数据库查询的语句出了问题&#xff0c;单元测试不会测试出来。因为它直接mock掉了&#xff0c;不会去真的去查数据库。从这点来…

电压放大器在大功率脉冲电能源研究中的应用

实验名称&#xff1a;大功率脉冲电能源高精度测试技术研究 研究方向&#xff1a;仪器仪表测试 测试目的&#xff1a; 传统的测量精度校准的方法是对传感器单一频率下的刻度因子进行校准&#xff0c;校准方法通常选用同轴分流器串联于放电回路中&#xff0c;通过测量同轴分流器两…

Ubuntu18.04下安装mysql并使用QT成功编译驱动方法

开发环境&#xff1a;Ubuntu18.04QT5.14.2MySQL5.7.240 编译步骤&#xff1a; 1、安装mysql软件和驱动&#xff1a; 打开终端命令&#xff0c;执行安装语句如下&#xff1a; sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib…

MyBatisPlus(MP)学习记录(分页查询的开启+日志打印配置)

MP介绍&#xff08;官网链接&#xff09; MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 前言 本篇文章展示的MP教学中涉及到的版本如下&#xff1a; IDE…

使用Xshell 将Linux文件下载到本地或者将本地的文件上传到Linux

第一步&#xff1a;在Linux中安装上传下载功能的软件 sudo apt install lrzsz第二步&#xff1a;将Linux文件下载到本地&#xff1a;此时我的Linux桌面上有一个叫test.c的文件&#xff0c;我要将它下载到windows桌面上。 在Linux终端输入&#xff1a; sz test.c这里使用的是…

座舱显示的未来到底是什么?宝马供应商给出了答案

“显示器是汽车的核心人机界面&#xff0c;”业内人士表示&#xff0c;与此同时更智能化、体验更好的显示解决方案在驾驶舱的设计中起着核心作用。 屏幕及其增强驾驶体验的巨大潜力正迅速成为未来智能网联汽车DNA的一部分。高分辨率、大尺寸以及曲面屏、OLED屏等等新元素&…

【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

一&#xff0c;前言 上篇&#xff0c;根据 render 函数&#xff0c;生成 vnode&#xff0c;主要涉及以下几点&#xff1a; 封装 vm._render 返回虚拟节点_s&#xff0c;_v&#xff0c;_c的实现 本篇&#xff0c;根据 vnode 虚拟节点渲染真实节点 二&#xff0c;根据 vnode 创…