【JavaWeb】JavaWeb入门之Tomcat详解

目录

1.Java Web前奏

1.1.C/S结构

1.2.B/S结构

1.3.静态网页和动态网页

1.4.常见的网页

1.5.Web服务器

2.HTTP协议

2.1.HTTP协议概念

2.2.无状态协议

2.3.HTTP1.0和HTTP1.1

2.4.请求协议和响应协议

2.5.请求协议

2.5.1.GET请求

2.5.2.POST请求

2.6.响应协议


1.Java Web前奏

1.1.C/S结构

C/S即客户端/服务器(Client/Server)例如QQ就是C/S结构的。我们可以在电脑上安装QQ的客户端,客户端软件向服务器端软件发送请求,服务器端给客户端返回响应

但是,因为客户端需要不断的更新,用户使用起来就比较麻烦。现在的C/S结构的客户端已经好多了,可以提示用户更新,用户只需要点击更新就可以了。最早时需要用户自己去官网上下载最新客户端,然后把老版本卸载,再去安装新版本

1.2.B/S结构

B/S结构即浏览器/服务器(Browser/Server),例如网站都是B/S结构的。当然,网站也只是B/S结构体系软件中的一种而已

B/S结构的好处在于不需要用户更新客户端,客户端只需要有一个浏览器就OK。当软件需要更新时,开发人员只需要关心服务器端就行。就像你在浏览器中访问百度时,发现百度的主页发生了变化,但你也不需要更新什么

1.3.静态网页和动态网页

早期在Internet上都是静态网页,即html页面。静态网页的数据都是不能自动变化的,例如网页上的当前用户信息:“欢迎XXX登录本系统”,这说明当前用户名为XXX。如果有其他用户登录系统就应该显示其他用户的名字,而且无需修改页面。说白一点,用户名应该是变量,而不是常量,这是静态网页做不到的

动态网页可以中包含变量,数据的变化就不是问题了。但动态网页只能在服务器端使用,客户端浏览器只能识别静态网页。所以,如果用户请求的是动态网页,那么就需要服务器先把动态网页转换成静态网页发送给客户端浏览器

动态网页必须由服务器来处理

1.4.常见的网页

  • 静态网页:htm、html

  • 动态网页:php、asp、aspx、jsp、do、action

我们要学习的是JSP(Java Server Pages),与其相关的是do(struts1)、action(struts2)

1.5.Web服务器

Web服务器的作用是接收客户端的请求,给客户端做出响应

Tomcat(Apache):免费、开源

JBoss(Redhat红帽)

Weblogic(Orcale):付费。使用Tomcat开发,项目写完后放到Weblogic上运行

Websphere(IBM):付费。与Weblogic相似

2.HTTP协议

2.1.HTTP协议概念

HTTP,即超文本传输协议。所有浏览器都可以发出http协议

协议就是规定的文本格式。例如写本书有格式,写总结也有格式。当然客户端发送请求也要有格式,这个格式是已经约定的格式,所以服务器端按请求格式来获取请求信息,然后服务器端再按照响应格式来响应,当然客户端还要按响应的格式来解析

2.2.无状态协议

HTTP是无状态协议,所谓无状态是指客户端发送一个请求,服务器返回一个响应,然后就断开连接了。无状态的好处是效率高,用户连接一下就断开,当用户再次发送请求时,再连接,然后在响应之后再次断开。如果用户在服务器上找到了自己想看的小说,那么服务器只是把小说的内容(html)发送给用户的浏览器,然后用户的浏览器显示已经发送到本地的html,其实这时已经与服务器断开连接了。用户可能会看很久,但这不会占用服务器的任何资源

2.3.HTTP1.0和HTTP1.1

HTTP现在有两个版本,HTTP1.0和HTTP1.1

HTTP1.0:响应结束后会马上断开

HTTP1.1:必须在请求中包含Host(主机)头信息,响应结束后不会马上断开,会有一个超时时间,可能会在超时之前完成多个请求/响应,当超时的时候就断开

2.4.请求协议和响应协议

无论是请求协议还是响应协议,都是由如下部分构成的:

  • 请求(或响应)首行

  • 请求(或响应)头信息

  • 空行

  • 请求(或响应)正文

请求:GET/POST

只有表单才可能是POST,其他都是GET

POST有正文,即表单内容:username=zhangSan&password=123

GET没有正文,但是空行可是有的

请求首行:(GET/POST) URL HTTP/1.1

响应首行:HTTP/1.1 状态码 状态码的解释

响应的正文就是HTML

2.5.请求协议

请求是客户端给服务器的。我们可以通过浏览器来监视请求和响应,获取完整的请求和响应信息

2.5.1.GET请求

下面是通过浏览器获取到的请求信息,这就是浏览器发送给服务器的全部请求信息内容。请求的地址是:http://localhost/hello/index.jsp

//请求首行
GET /hello/index.jsp HTTP/1.1
//下面全部是请求头信息,因为GET请求没有正文
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
//空行,因为GET没有正文,所以下面没有东西了

GET /hello/index.jsp HTTP/1.1:GET请求,请求服务器路径为/hello/index.jsp,协议为1.1

Host:localhost:请求的主机名为localhost

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8:告诉服务器,当前客户端可以接收的文档类型,其实这里包含了/,就表示什么都可以接收

Accept-Language: zh-cn,zh;q=0.5:当前客户端支持的语言,可以在浏览器的工具->选项中找到语言相关信息

Accept-Encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送

Connection: keep-alive:客户端支持的链接方式,保持一段时间链接,默认为3000ms

Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因为不是第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过,这个Cookie的名字为JSESSIONID

Get请求没有正文,只有头信息,请求参数是在请求的首行的url中传递的。请求的参数的容量是有限的,不能超过1024kb

2.5.2.POST请求

// 请求首行
POST /hello/index.jsp HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Referer: http://localhost/hello/index.jsp
Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98
Content-Type: application/x-www-form-urlencoded 
Content-Length: 14 
// 这里是空行
//POST有请求正文
username=hello

Referer: http://localhost/hello/index.jsp:请求来自哪个页面。这个值说明请求是从index.jsp页面发送出去的。如果这个表单的作用是下载,那么在给用户提供资源之前可以去判断请求是从哪个页面发送过来的,如果不是从本网站发送过来的,那么就可以拒绝下载,例如盗链

Content-Type: application/x-www-form-urlencoded:表单的数据类型,说明会使用URL格式的UTF-8编码数据。URL编码的数据都是以“%”为前缀,后面跟随两位的16进制

Content-Length:14:表示请求数据的长度,这里表示14个字节

username=hello:这是请求正文,username是文本框的名字,hello是在表单中输入的数据

2.6.响应协议

响应是服务器给客户端的

// 响应首行
HTTP/1.1 200 OK
// 响应头信息
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 777
Date: Sat, 09 Feb 2012 18:30:52 GMT
// 空行,下面是响应正文,即HTML代码
​
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://localhost:80/hello/">
    
    <title>My JSP 'index.jsp' starting page</title>
  <meta http-equiv="pragma" content="no-cache">
  <meta http-equiv="cache-control" content="no-cache">
  <meta http-equiv="expires" content="0">    
  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  <meta http-equiv="description" content="This is my page">
  <!--
  <link rel="stylesheet" type="text/css" href="styles.css">
  -->
  </head>
  
  <body>
    This is my JSP page. <br>
    
    <form method="post" action="index.jsp">
      <input type="text" name="username" /><br/>
      <input type="submit" value="SUBMIT"/>
    </form>
  </body>
</html>

HTTP/1.1 200 OK:响应协议为HTTP1.1,状态码为200,表示请求成功,OK是对状态码的解释

Server: Apache-Coyote/1.1:这是服务器的版本信息

Content-Type: text/html;charset=UTF-8:请求正文使用的编码为UTF-8

Content-Length: 777:响应的内容为777字节

Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:响应给客户端的Cookie

Date: Sat, 09 Feb 2012 18:30:52 GMT:响应的时间,这可能会有8小时的时区差

常见的状态码:

  • 404 not found:没有找到

  • 500 error:找到了,但内部出错

  • 200 ok:成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时&#xff0c;我们常常会使用 Autowired 来装配。但是&#xff0c;有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同&#xff0c;使用 Autowired 一般都不会设置属性值&#xff0c;而 Value 必须指定一个字符串值&#xff0c;因为其…

nginx反向代理和负载均衡的区别

1、反向代理&#xff0c;不需要服务器池&#xff0c;直接代理某台服务器 location / {proxy_pass http://192.168.18.201;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $remote_addr; }proxy_set_header Host $host; …

uniApp通过xgplayer(西瓜播放器)接入视频实时监控

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

二叉搜索树中的插入操作 https://leetcode.cn/problems/insert-into-a-binary-search-tree/description/ 描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树返回插入后二叉搜索树的根节点。 输入数据 保…

vue el-table 数据变化后,高度渲染问题

场景&#xff1a;el-table设置了height属性&#xff0c;但是切换查询条件后再次点击查询重新获取data时&#xff0c;el-table渲染的高度会有问题&#xff0c;滚动区域变矮了。 解决办法&#xff1a;使用doLayout方法‌&#xff0c;在表格数据渲染后调用doLayout方法可以重新布局…

代码的形状:重构的方向

大概2周前写了一篇《代码的形状:从外到内的探索与实践》 涵树&#xff1a;代码的形状:从外到内的探索与实践 觉得这个话题还可以继续&#xff0c;它是一个从无形到有形的过程&#xff0c;而这个过程感觉就是王阳明先生说的“心即理”的探寻过程。 我讨论代码的形状&#xff…

检验统计量与p值笔记

一、背景 以雨量数据为例&#xff0c;当获得一个站点一年的日雨量数据后&#xff0c;我们需要估计该站点的雨量的概率分布情况&#xff0c;因此我们利用有参估计的方式如极大似然法估计得到了假定该随机变量服从某一分布的参数&#xff0c;从而得到该站点的概率密度函数&#x…

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

多线程 - wait 和 notify

wait wait(等待)/notify(通知) 线程在操作系统上的调度是随机的 多个线程&#xff0c;需要控制线程之间执行某个逻辑的先后顺序&#xff0c;就可以让后执行的逻辑&#xff0c;使用wait&#xff0c;先执行线程&#xff0c;完成某些逻辑之后&#xff0c;通过notify唤醒对应的wait…

IDEA的常用设置

目录 一、显示顶部工具栏 二、设置编辑区字体按住鼠标滚轮变大变小&#xff08;看需要设置&#xff09; 三、设置自动导包和优化导入的包&#xff08;有的时候还是需要手动导包&#xff09; 四、设置导入同一个包下的类&#xff0c;超过指定个数的时候&#xff0c;合并为*&a…

Xcode 正则表达式实现查找替换

在软件开发过程中&#xff0c;查找和替换文本是一项常见的任务。正则表达式&#xff08;Regular Expressions&#xff09;是一种强大的工具&#xff0c;可以帮助我们在复杂的文本中进行精确的匹配和替换。Xcode 作为一款流行的开发工具&#xff0c;提供了对正则表达式的支持。本…

UE材质函数

材质函数是可在不同材质中重复使用的材质表达式的一个集合 相当于把常用的功能封装到一个集合里&#xff0c;需要用到的时候调用 输入input可以添加输入节点 如果勾上公开到库&#xff0c;就可以在材质面板直接搜索到材质函数 材质函数可以直接做成一个输出

vue3后台系统动态路由实现

动态路由的流程&#xff1a;用户登录之后拿到用户信息和token&#xff0c;再去请求后端给的动态路由表&#xff0c;前端处理路由格式为vue路由格式。 1&#xff09;拿到用户信息里面的角色之后再去请求路由表&#xff0c;返回的路由为tree格式 后端返回路由如下&#xff1a; …

【DAPM杂谈之二】实践是检验真理的标准

本文主要分析DAPM的设计与实现 内核的版本是&#xff1a;linux-5.15.164&#xff0c;下载链接&#xff1a;Linux内核下载 主要讲解有关于DAPM相关的知识&#xff0c;会给出一些例程并分析内核如何去实现的 /**************************************************************…

【Qt】事件、qt文件

目录 Qt事件 QEvent QMouseEvent QWheelEvent QKeyEvent QTimerEvent Qt文件 QFile QFileInfo Qt事件 在Qt中用一个对象表示一个事件&#xff0c;这些事件对象都继承自抽象类QEvent。事件和信号的目的是一样的&#xff0c;都是为了响应用户的操作。有两种产生事件的方…

线形回归与小批量梯度下降实例

1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…

消息队列使用中防止消息丢失的实战指南

消息队列使用中防止消息丢失的实战指南 在分布式系统架构里&#xff0c;消息队列起着举足轻重的作用&#xff0c;它异步解耦各个业务模块&#xff0c;提升系统整体的吞吐量与响应速度。但消息丢失问题&#xff0c;犹如一颗不定时炸弹&#xff0c;随时可能破坏系统的数据一致性…

【优选算法篇】:深入浅出位运算--性能优化的利器

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.位运算一.位运算概述二.常见的位运算操作符三.常见的位运…

创业AI Agents系统深度解析

Agents 近日&#xff0c;AI领域的知名公司Anthropic发布了一份题为《构建高效的智能代理》的报告。该报告基于Anthropic过去一年与多个团队合作构建大语言模型&#xff08;LLM&#xff09;智能代理系统的经验&#xff0c;为开发者及对该领域感兴趣的人士提供了宝贵的洞见。本文…