Author: Buffer

Version: 1.2

Tomcat

Web相关概念

软件架构

C/S

C/S架构的全称为Client Server,即客户机/服务器模式

C/S架构的优点
  1. C/S架构的界面和操作可以很丰富。(客户端操作界面可以随意排列,满足客户的需要)
  2. 安全性能可以很容易保证。(因为只有两层的传输,而不是中间有很多层。
  3. 由于只有一层交互,因此响应速度较快。(直接相连,中间没有什么阻隔或岔路,比如QQ,每天那么多人在线,也不觉得慢)
C/S架构的缺点
  1. 适用面窄,通常用于局域网中。
  2. 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
  3. 维护成本高,发生一次升级,则所有客户端的程序都需要改变。

B/S

B/S架构的全称为Browser/Server,即浏览器/服务器结构。

B/S架构的优点
  1. 客户端无需安装,有Web浏览器即可。
  2. B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
  3. B/S架构无需升级多个客户端,升级服务器即可。可以随时更新版本,而无需用户重新下载。
B/S架构的缺点
  1. 在跨浏览器上,B/S架构不尽如人意。
  2. 表现要达到C/S程序的程度需要花费不少精力。
  3. 在速度和安全性上需要花费巨大的设计成本,这是B/S架构的最大问题。
  4. 浏览器端服务器端的交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的。(在Ajax流行后此问题得到了一定程度的缓解)

资源分类

静态资源

可以理解为前端的固定页面,所有人访问看到的效果是相同的,这里面包含HTML、CSS、JS、图片等等,不需要查数据库也不需要程序处理,直接就能够显示的页面,如果想修改内容则必须修改页面,但是访问效率相当高。

动态资源

需要程序处理或者从数据库中读数据,能够根据不同的条件在页面显示不同的数据,即每个用户访问相同资源后,得到的结果可能不一样。动态资源被访问后,需要先转换为静态资源,再返回给浏览器,所以内容更新不需要修改页面但是访问速度不及静态页面。

网络通信三要素

IP地址

通信设备在网络上的唯一标示,可以通过IP地址找到通信所在的设备

端口号

应用程序在计算机中的唯一标识。

范围是 0~65535

传输协议

规定了数据传输的规则

Web服务器软件

概述

服务器:安装了服务器软件的计算机

服务器软件:接收用户的请求,处理请求,做出响应

Web服务器软件:通过浏览器接收用户的请求,处理请求,做出响应

​ 【重点】在 Web 服务器软件中,可以部署 Web 项目,让用户通过浏览器来访问这些项目

常见 Java 相关的 Web 服务器软件

Web服务器软件描述
webLogicoracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
webSphereIBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
JBOSSJBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的
TomcatApache基金组织,中小型的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 

【注意】

  1. 不要重复启动,启动之前先关闭已经启动的【可以通过netstat -ano查看被占用的进程PID】
  2. 如果出现闪退:可能是没有配置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内容

文件目录说明:

文件路径描述
srcJava源代码
webWEB项目路径,context内容包括静态资源,HTML,JavaScript,CSS,img,video等,可以直接通过URL进行访问
WEB-INF该路径中的内容是不允许直接通过URL访问的,是受到Tomcat服务器限制,一般通过web.xml文件或者【注解限制】进行限制
classesJava源代码对应的.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服务器传输超文本到本地浏览器的传送协议和标准

特点

  1. 基于请求/响应模型:客户端发起请求,服务器回送响应【重点】
  2. 简单快速:HTTP 比较简单,服务器的程序规模小,因此通信速度很快
  3. 灵活:HTTP 允许传输任意类型的数据对象
  4. 无连接:每次只处理一个请求,处理完请求后,接收到了客服端的应答后就立刻断开连接。客户端再次发送请求是就是一个新的连接,节省了传输时间。
  5. 无状态:HTTP 是无状态协议。每次请求都是独立的,任何两个请求之间没有必然的联系
  6. 默认端口号:80【重点】
  7. 基于 TCP/IP 协议

请求传输数据的方式【重点】

HTTP请求的方法:HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法

其中最常用的有两种:GETPOST

GET:用于请求指定的页面信息,并返回消息的主体
    1. 通过URL明文传递
    2. 数据传输不安全
    3. 数据传输有大小限制,一般在2KB左右
    4. 速度传输快
    5. 一般用于数据查询操作,百度搜索,Google搜索....
    
POST:用于指定的资源提交数据
    1. 通过【HTTP请求实体】完成数据传递
    2. 较为安全,需要其他技术进行数据加密
    3. 数据传输大小不限制
    4. 数据传输速度较慢
    5. 一般用于数据添加,删除,修改,登录验证...

响应状态码

状态码已定义范围描述
1XX100-101信息提示
2XX200-206成功
3XX300-305重定向
4XX400-415客户端错误
5XX500-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);
    }
}
最后修改:2021 年 01 月 24 日 12 : 13 PM
如果觉得此文章有用,请随意打赏