JavaWeb

Tomcat

image-20220301175409391
  • 可以通过Tomcat/conf下的server.xml文件配置启动的端口号

    • Tomcat默认端口号为8080

    • mysql: 3306

    • http: 80

    • https: 442

    • <Connector port="8081" protocol="HTTP/1.1"
                connectionTimeout="20000"
                 redirectPort="8443" />
      
      
  • 可以配置主机的名称

    • 默认的主机名为:localhost 或者是 127.0.0.1

    • <Host name="localhost"  appBase="webapps"
                  unpackWARs="true" autoDeploy="true">
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34

      * ......

      </br>

      ##### *网站是如何进行访问的*

      * 输入一个域名,点击回车访问;
      * 检查本机的hosts配置文件下有没有该域名的映射;
      * 如果有,直接返回对应的ip地址;
      * 如果没有,去DNS服务器中找对应的ip地址;
      * 如果找到,就返回对应的ip地址;
      * 如果没有找到,就会报错;

      </br>

      ##### *发布一个web网站*

      * 将自己写的网站放到服务器(Tomcat)中指定的web应用的文件夹下(webapps),就能进行访问了。

      ~~~java
      --webapps : Tomcat服务器的web目录
      -ROOT
      -kibo24:网站的目录名
      -index.html 默认的网站首页
      -static
      -css
      -style.scc
      -js
      -img
      - ...
      -WEB-INF
      -web.xml : 网站的配置文件
      -lib : web应用依赖的jar包


HTTP

HTTP的内容

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:html,字符串等
  • 超文本:图片,音乐,视频等
  • 端口:80(HTTPS的端口号为443)

HTTP的两个时代
  • http1.0 短连接
    • 客户端可以与web服务器进行一次连接后,只能获得一个web资源,然后会断开连接
  • http1.1 长链接
    • 客户端可以与web服务器进行一次连接后,可以获得多个web资源

HTTP请求
  • 客户端–>发送请求Request–>服务器

百度:

1
2
3
4
Request URL: https://www.baidu.com/              【请求地址】
Request Method: GET 【请求方法get/post】
Status Code: 200 OK 【状态码】
Remote Address: 39.156.66.18:443 【远程地址】
1
2
3
4
5
Accept: text/html
Accept-Encoding: gzip, deflate, br 【压缩算法】
Accept-Language: zh-CN,zh;q=0.9 【语言】
Cache-Control: max-age=0
Connection: keep-alive
请求行
  • 请求行中的请求方式:GET
  • 请求方式:GET / POST / HEAD / DELETE / PUT / TRACT,…
    • GET: 一次请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不够安全,但是高效
    • POST: 一次请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,不够高效,但是安全
消息头
1
2
3
4
5
6
Accept: 告知服务器支持的数据类型
Accept-Encoding: 告知服务器支持的数据压缩格式
Accept-Language: 告知浏览器语言环境
Cache-Control: 缓存控制
Connection: 告知服务器,请求完成后是断开还是保持连接
HOST: 主机

HTTP响应
  • 服务器–>响应–>客户端

百度:

1
2
3
4
Cache-Control: private                           【缓存控制】
Connection: keep-alive 【连接:保持连接】
Content-Encoding: gzip (一种网站数据压缩技术) 【编码】
Content-Type: text/html;charset=utf-8 【类型】
响应体
1
2
3
4
5
6
7
8
Accept: 告知服务器支持的数据类型
Accept-Encoding: 告知服务器支持的数据压缩格式
Accept-Language: 告知浏览器语言环境
Cache-Control: 缓存控制
Connection: 告知服务器,请求完成后是断开还是保持连接
HOST: 主机
Refresh: 告知客户端多久刷新一次
Location: 让网页重新定位
响应状态码

200: 请求响应成功

3**: 请求重定向

  • 重定向:通过各种方法将各种网络请求重新定个方向转到其它位置

404: 找不到资源

  • 资源不存在

5**: 服务器代码错误

  • 502:网关错误


在浏览器输入网址后,从点击回车到网页展示,都发生了什么事?
  • 输入地址
  • 浏览器查找域名的ip地址
    • 浏览器首先会从本地硬盘的hosts文件中查看是否存在这个域名,如果能匹配上则会直接使用hosts文件中的ip地址
    • 如果本地的hosts文件中没有匹配的域名ip时,浏览器会发送一个DNS请求本地区的DNS服务器
    • 本地DNS收到请求后,会查询缓存记录,如果查询到结果就把结果返回,如果没有查询到则向DNS根服务器递归查询
    • 如果DNS根目录都没有找到域名与ip的对应记录,根DNS服务器会告诉本地DNS服务器应该向对应的顶级域名解析服务器发起查询请求,如.com服务器
    • 本地DNS服务器对应的顶级域名解析服务器发起查询请求,顶级域名解析服务器返回域名解析服务器的地址或返回域名不存在
    • 最后本地DNS服务器域名的解析服务器发送请求,这时就能收到一个域名和ip地址的对应关系
QQ图片20220302182113-gigapixel-scale-2_00x
  • 浏览器向web服务器发送一个HTTP请求

    • 浏览器获取到域名和ip的对应关系后,会以本机一个随机端口(1024~65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求

    • 请求经过网络中间各种路由设备到达服务器端后,到达目标设备网卡进入到内核的TCP/IP协议栈开始识别该连接请求,解封包,一层一层剥开最终到达WEB程序,建立TCP/IP连接

    • 建立TCP/IP连接之后,就可以发起http请求

      HTTP请求包含:

      • 请求方法URI协议/版本
      • 请求头
      • 请求正文
      image-20220302183150427
  • 服务器处理请求

  • 服务器返回一个HTTP响应

    服务器收到请求并处理请求后,会返回处理结果,也就是返回一个HTTP响应

    HTTP响应的构成:

    • 状态行
    • 响应头
    • 响应正文
    image-20220302183332139
  • 浏览器解析响应的内容并展示

    • 浏览器解析html文件

      浏览器在解析html文件时,会“自上而下”加载,并在加载过程中进行解析渲染

    • 浏览器解析JS

      JS的解析是由浏览器中的JS解析引擎完成的

    • 浏览器发送请求获取嵌入在HTML中的资源

      浏览器显示HTML时,会注意到需要获取其他地址内容的标签,浏览器会发送一个获取请求来重新获得这些文件


Maven

  • 在JavaWeb开发中,需要使用大量的jar包,需要手动导入。Maven能够自动导入和配置jar包
Maven项目架构管理工具

我们目前用它是为了方便导入jar包

Maven核心思想:约定大于配置

  • 有约束,不要违反

    Maven会规定好如何去编写java代码,必须要按照这个规范


配置Maven环境
  • M2_HOME maven下的bin目录

  • MAVEN_HOME maven的目录

  • Path中配置bin目录

image-20220303164927159


修改配置文件
  • 镜像:mirrors

    加速文件的下载

  • 国内建议使用阿里云的镜像


本地仓库

新建一个本地仓库:localRepository

image-20220303172347901


在IDEA中使用Maven
  • 创建一个MavenWeb项目
image-20220303195304329 image-20220303195439701 image-20220303195845073
  • 等待项目初始化
image-20220303200233590
  • 查看本地仓库
image-20220303200425398
  • IDEA中的Maven设置
image-20220303200744026
  • 如果不选择webapp,选择直接生成maven项目
image-20220303201239257

image-20220303201355063

  • 修改目录属性
image-20220303201725777 image-20220303201952401
  • 在IDEA中配置Tomcat
image-20220303203815217 image-20220303204433816
  • 解决警告未指定应用程序服务器

​ 在配置中选中Tomcat路径即可

  • 解决警告没有为部署标记工件

​ 在部署中添加工件即可

image-20220303204745883

image-20220303204958918

  • 启动Tomcat

  • 运行项目

image-20220303205420892
pom文件

pom.xml文件是Maven的核心配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--这就是刚才配置的GAV-->
<groupId>com.kibo24</groupId>
<artifactId>JavaWeb-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--项目的打包方式
jar:java应用
war:javaweb应用
-->
<packaging>war</packaging>
<!--配置-->
<properties>
<!--项目的默认构建编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<finalName>JavaWeb-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

Maven的高级之处在于:它会帮你导入这个jar包所依赖的其他jar包


Maven仓库的使用
image-20220306160647834

image-20220306160906610

image-20220306161024634
  • 依赖代码要添加到pom.xml
image-20220306161413160
  • 添加依赖成功,导入类后即可
image-20220306161500298

image-20220306174103426

  • 展示效果
image-20220306174157038

Servlet

Servlet简介
  • Servlet是sun公司开发动态web的一门技术;
  • sun公司在这些API中提供了一个接口叫做Servlet,如果想开发Servlet程序,只需要完成两个小步骤:
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器
  • Servlet有两个实现类:HttpServletGenericServlet
    • 关系为:Servlet接口–>GenericServlet–>HttpServlet–>自己写的类(只需要继承HttpServlet类即可)

把实现了Servlet接口的java程序叫做Servlet


Hello Servlet
  • 构建一个Maven项目,删掉里面的src目录,之后就在项目里创建模块。这个空工程就是Maven的主工程

    典中典之导入依赖,如果本地仓库没有导入的依赖,IDEA会负责下载。

image-20220306180324106
  • 关于Maven的父子模块

    image-20220306181508413 image-20220306181607955
    • 父项目中会有:
    1
    2
    3
    <modules>
    <module>Servler-01</module>
    </modules>
    • 子项目中会有:
    1
    2
    3
    4
    5
    <parent>
    <artifactId>javaweb-02-Servlet</artifactId>
    <groupId>com.kibo24</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>

    父项目中的jar包子项目可以直接使用,反之则不能

  • Maven环境优化

    • 关于新建子项目(模块)的web.xml中初始代码老旧的问题:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
      version="4.0"
      metadata-complete="true">


      </web-app>
    • 将子项目src/main目录下的的文件目录补齐,java标记为源,resources标记为资源

image-20220306182531373
  • 编写一个Servlet程序

    • 创建一个普通类
    image-20220306183115932
    • 实现Servlet接口,这里直接继承HttpServlet类(不需要重新配置,直接使用父项目的包)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class HelloServlet extends HttpServlet
    {
    //由于get/post只是请求实现的不同方式,可以相互调用,因为业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
    //ServletOutputStream outputStream = resp.getOutputStream();
    PrintWriter writer=resp.getWriter(); //响应流
    writer.println("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
    doGet(req, resp);
    }
    }
  • 编写Servlet的映射

    因为浏览器访问需要链接web服务器,所以需要把自己写的java程序,在web服务中注册Servlet(映射),还需要给它一个浏览器能访问的路径。

    • web.xml中映射
    image-20220306190056335
  • 配置Tomcat

image-20220306190253082
  • 测试项目
image-20220306190425581
Servlet优先级问题
  • 通配符映射的优先级小于狭义定义的映射的优先级
  • 如下代码(web.xml),会优先判断是不是hello映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kibo24.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
------------------------------------------------------------------

<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.kibo24.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Servlet项目创建
  • 新建项目之后,配置好Maven环境
  • 配置好Tomcat环境
image-20220318182538747
  • 在项目下新建新模块
  • 修改新模块的pom.xml文件
image-20220318182821106
  • 新模块/src/main下补全java目录和resources资源包
  • 修改新模块的web.xml文件
image-20220318182850722
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
  • java目录下新建软件包(如com.kibo24.servlet
  • java目录下新建类(如HelloServlet
  • 中重写doGet和doPost方法
  • web.xml下配置Servlet映射,即servlet-nameservlet-mapping
image-20220318183222382
1
2
3
4
5
6
7
8
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kibo24.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
  • 然后好像就可以启动测试了