Author: Buffer
Version: 1.2
Tomcat
Web相关概念
软件架构
C/S
C/S架构的全称为Client Server,即客户机/服务器模式
C/S架构的优点
- C/S架构的界面和操作可以很丰富。(客户端操作界面可以随意排列,满足客户的需要)
- 安全性能可以很容易保证。(因为只有两层的传输,而不是中间有很多层。
- 由于只有一层交互,因此响应速度较快。(直接相连,中间没有什么阻隔或岔路,比如QQ,每天那么多人在线,也不觉得慢)
C/S架构的缺点
- 适用面窄,通常用于局域网中。
- 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
- 维护成本高,发生一次升级,则所有客户端的程序都需要改变。
B/S
B/S架构的全称为Browser/Server,即浏览器/服务器结构。
B/S架构的优点
- 客户端无需安装,有Web浏览器即可。
- B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
- B/S架构无需升级多个客户端,升级服务器即可。可以随时更新版本,而无需用户重新下载。
B/S架构的缺点
- 在跨浏览器上,B/S架构不尽如人意。
- 表现要达到C/S程序的程度需要花费不少精力。
- 在速度和安全性上需要花费巨大的设计成本,这是B/S架构的最大问题。
- 浏览器端服务器端的交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的。(在Ajax流行后此问题得到了一定程度的缓解)
资源分类
静态资源
可以理解为前端的固定页面,所有人访问看到的效果是相同的,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面,如果想修改内容则必须修改页面,但是访问效率相当高。
动态资源
需要程序处理或者从数据库中读数据,能够根据不同的条件在页面显示不同的数据,即每个用户访问相同资源后,得到的结果可能不一样。动态资源被访问后,需要先转换为静态资源,再返回给浏览器,所以内容更新不需要修改页面但是访问速度不及静态页面。
网络通信三要素
IP地址
通信设备在网络上的唯一标示,可以通过IP地址找到通信所在的设备
端口号
应用程序在计算机中的唯一标识。
范围是 0~65535
传输协议
规定了数据传输的规则
Web服务器软件
概述
服务器:安装了服务器软件的计算机
服务器软件:接收用户的请求,处理请求,做出响应
Web服务器软件:通过浏览器接收用户的请求,处理请求,做出响应
【重点】在 Web 服务器软件中,可以部署 Web 项目,让用户通过浏览器来访问这些项目
常见 Java 相关的 Web 服务器软件
Web服务器软件 | 描述 |
---|---|
webLogic | oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的 |
webSphere | IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的 |
JBOSS | JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的 |
Tomcat | Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范。开源,免费 |
【注意】Apache不等于Tomcat,打个比方:apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),tomcat就是一个桶(装像JAVA这样的水),而这个桶也可以不放在卡车上。
Tomcat
概述
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
官网
https://tomcat.apache.org/
安装
apache-tomcat-8.5.37-windows-x64.zip
解压即安装
【注意】
- 安装路径不要有中文!!!
- 配置 JAVA_HOME 环境变量(tomcat运行依赖于JVM,需要指定JDK)
目录结构【重点】
目录 | 描述 |
---|---|
bin | 可执行文件,包含启动和停止的命令 |
conf | 配置文件目录,存放Tomcat的配置文件 |
lib | 依赖和类库jar包 |
logs | 日志目录 |
temp | 临时文件目录 |
webapps | 非常重要的目录,存放项目的目录 |
work | 工作目录,将来JSP文件编译成Servlet存放的目录 |
启动停止
# 启动命令
bin/startup.bat
# 停止命令
bin/shutdown.bat
【注意】
- 不要重复启动,启动之前先关闭已经启动的【可以通过netstat -ano查看被占用的进程PID】
- 如果出现闪退:可能是没有配置JAVA_HOME 环境变量
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program
测试访问
- 先启动
- 打开浏览器访问
http://localhost:8080
localhost 本机地址,等于127.0.0.1
8080 默认端口
修改配置
- 端口配置 conf/server.xml
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
默认端口8080 可以改成其他如:8888
【注意】一般不建议修改,除非改成80端口,因为80端口是HTTP协议的默认端口号
- 启动日志乱码 conf/logging.properties
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = gbk
windows 窗口默认编码为GBK,如果输出内容为UTF-8乱码。
部署项目
1、直接将项目放到webapps目录下
2、将项目压缩成war包放到webapps目录下
Java Web 项目目录解析【重点】
Web Preject
--| src
--| web
----| WEB-INF
------| classes
------| lib
------| web.xml
----| context内容
文件目录说明:
文件路径 | 描述 |
---|---|
src | Java源代码 |
web | WEB项目路径,context内容包括静态资源,HTML,JavaScript,CSS,img,video等,可以直接通过URL进行访问 |
WEB-INF | 该路径中的内容是不允许直接通过URL访问的,是受到Tomcat服务器限制,一般通过web.xml文件或者【注解限制】进行限制 |
classes | Java源代码对应的.class字节码文件,可以在Tomcat服务器运行 |
lib | 当前WEB项目运行所需的jar包,第三方库,需要交给Tomcat服务器使用。 |
web.xml | 当前WEB项目的配置文件,支持所有的Servlet版本,并且进行配置Servlet,Filter,Listener,WEB项目初始化参数 |
URL【重点】
概述
Uniform Resource Locator
统一资源定位符在万维网上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫 URL,是用于完整地描述 Internet 上网页和其他资源的地址的一种标识方法。简单地说,URL 就是常说的网址
格式【重点】
URL 的部分组成为:协议、主机、端口、路径、参数
URL的一般语法格式为:
protocol :// hostname:port/path/?parameters
protocol(协议)
指定使用的传输协议,最常用的是HTTP协议,它也是WWW中应用最广的协议。常见的还有 file:///,ftp://等。
hostname(主机名)
是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。
port(端口号)
整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。
path(路径)
由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。此文件可以是任意格式,如文本、图片、音频、视频等
parameters(参数)
这是用于指定特殊参数的可选项。参数通过 = 连接,用键值对的形式标识,多个参数之间用 & 连接
[【注意】强制要求以后所有的 URL 全部按照标准格式来写!!!]()
HTTP
概述
Hyper Text Transport Protocol
: 超文本传输协议,是一个用于从web服务器传输超文本到本地浏览器的传送协议和标准
特点
- 基于请求/响应模型:客户端发起请求,服务器回送响应【重点】
- 简单快速:HTTP 比较简单,服务器的程序规模小,因此通信速度很快
- 灵活:HTTP 允许传输任意类型的数据对象
- 无连接:每次只处理一个请求,处理完请求后,接收到了客服端的应答后就立刻断开连接。客户端再次发送请求是就是一个新的连接,节省了传输时间。
- 无状态:HTTP 是无状态协议。每次请求都是独立的,任何两个请求之间没有必然的联系
- 默认端口号:80【重点】
- 基于 TCP/IP 协议
请求传输数据的方式【重点】
HTTP请求的方法:HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
其中最常用的有两种:
GET
和POST
GET:用于请求指定的页面信息,并返回消息的主体
1. 通过URL明文传递
2. 数据传输不安全
3. 数据传输有大小限制,一般在2KB左右
4. 速度传输快
5. 一般用于数据查询操作,百度搜索,Google搜索....
POST:用于指定的资源提交数据
1. 通过【HTTP请求实体】完成数据传递
2. 较为安全,需要其他技术进行数据加密
3. 数据传输大小不限制
4. 数据传输速度较慢
5. 一般用于数据添加,删除,修改,登录验证...
响应状态码
状态码 | 已定义范围 | 描述 |
---|---|---|
1XX | 100-101 | 信息提示 |
2XX | 200-206 | 成功 |
3XX | 300-305 | 重定向 |
4XX | 400-415 | 客户端错误 |
5XX | 500-505 | 服务器错误 |
【重点】
200 OK!!!
302 重定向提示
404 Source Not Found 资源未找到!!!最常见错误!!!
500 服务器挂了!!!
Web容器是如何处理 HTTP 协议?
HTTP协议在Web容器这端主要表现为请求数据的到达以及响应数据的返回。于是Web容器将这两部分数据解释为两个对象,一个是与请求数据对应的 HttpServletRequest 对象,一个是与响应数据对应的 HttpServletResponse 对象。对于Servlet来讲,主要的业务逻辑过程就是从请求对象【HttpServletRequest】中获取数据,经过加工后将结果附着在响应对象【HttpServletResponse】中发送回客户端
扩展:HTTP 1.0 和 HTTP 1.1 的主要区别
HTTP 1.0 最早在网页中的使用是在 1996 年,那个时候只是使用一些较为简单的网页和网络请求上,而 HTTP 1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时 HTTP 1.1 也是当前使用最为广泛的 HTTP 协议。 两者的主要区别体现在长连接、新增了部分错误响应吗、缓存处理等。
长连接 : 在 HTTP/1.0 中,默认使用的是短连接,也就是每次请求都要重新建立一次连接。HTTP 是基于 TCP/IP 协议的,每一次建立或者断开连接,都需要三次握手四次挥手的开销,如果每次请求都要这样的话,开销会比较大,因此最好能维持一个长连接,可以用长连接来发多个请求。HTTP 1.1 起,默认使用长连接,如果在一定的时间内有多个请求发送,那么就使用同一个连接,减少了一定开销。
扩展:HTTP 请求头分析
GET 请求
案例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试Post请求</title>
</head>
<body>
<form action="index.jsp" method="get">
<label>姓名:
<input type="text" name="name">
</label>
<input type="submit">
</form>
</body>
</html>
请求头信息
GET /Http_war_exploded/index.jsp?name=%E5%BC%A0%E4%B8%89 HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:8080/Http_war_exploded/test_post.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: JSESSIONID=0369EA4247A8535DC42221A1016E4EF6
案例分析
GET / HTTP/1.1
请求方式为GET方法,请求的目标路径是/Http_war_exploded/index.jsp?name=%E5%BC%A0%E4%B8%89 ,目前采用的协议是HTTP 1.1
Host: localhost:8080
请求的主机地址,域名,主机名和端口号
Connection: keep-alive
保持连接状态
Cookie:
很重要!!!在WEB项目中的【会话控制】浏览器本地保存的聊天记录
COOKIE_SESSION=7706_0_8_6_17_11_0_0_8_4_1_0_0_0_13_0_1585376605_0_1585384298%7C9%230_0_1585384298%7C1
POST 请求
案例代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试Post请求</title>
</head>
<body>
<form action="index.jsp" method="post">
<label>姓名:
<input type="text" name="name">
</label>
<input type="submit">
</form>
</body>
</html>
请求头信息
案例
POST /Http_war_exploded/index.jsp HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 0
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
Origin: http://localhost:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost:8080/Http_war_exploded/test_post.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: JSESSIONID=0369EA4247A8535DC42221A1016E4EF6
案例分析
POST /Http_war_exploded/index.jsp HTTP/1.1
请求方式为POST方式,请求的资源是/Http_war_exploded/index.jsp,使用的HTTP协议为1.1协议
Host: localhost:8080
请求去主机名,域名或者说是IP地址,8080是Tomcat服务器在当前电脑上的端口号
POST请求中存在一个请求实体,在浏览器开发者工具内可以看到
From Data
name: 张三
扩展:HTTP 协议响应头分析
案例:百度页面
HTTP/1.1 200 OK
Bdpagetype: 2
Bdqid: 0xdb1fc9630002719a
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Sat, 28 Mar 2020 08:51:37 GMT
Expires: Sat, 28 Mar 2020 08:51:36 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=430; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1426_31170_21111_30842_31186_30824_31085_26350; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1585385497161029095415789560245623353754
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
案例分析
HTTP/1.1 200 OK
响应数据使用的协议是HTTP1.1版本,状态码 200 OK
Server: BWS/1.1
当前服务器的版本名字和对应的编号
Date: Sat, 28 Mar 2020 08:51:37 GMT
日期格林尼治时间,中国是+8区
Set-Cookie: BDSVRTM=430; path=/
保存对应的Cookie信息,【会话控制技术】
BDSVRTM=430; BDSVRTM Cookie名字 430 Cookie数据
path=/ 有效路径
Servlet 初识
步骤
1、创建类并继承自HttpServlet
2、重写doGet和doPost方法(两个方法实际是一个)
3、声明@WebServlet并加上默认属性(访问路径)
案例代码
/**
* @description 第一个Servlet程序
*
* @WebServlet 注解的意思是声明程序的入口,注解中的属性为请求的路径
* 【注意】属性前必须要加 / !!!
*/
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
/**
* 处理Post请求
*
* @param req HttpServletRequest对象:浏览器请求数据内容对象
* @param resp HttpServletResponse对象:浏览器响应数据内容对象
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost被执行");
resp.getWriter().append("Hello Servlet");
}
/**
* 处理Get请求
*
* @param req HttpServletRequest对象:浏览器请求数据内容对象
* @param resp HttpServletResponse对象:浏览器响应数据内容对象
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet被执行");
// 实际调用的仍然是doget方法
doPost(req, resp);
}
}
版权属于:不冷
本文链接:https://www.buleng.xyz/archives/94/
转载时须注明出处及本声明