XML的作用现在已经开始弱化了,业界使用properties、yaml、注解等代替xml。

第一章:XML

1.1 配置文件

1.1.1 配置文件的作用

  • 配置文件是用于给应用程序提供配置参数以及初始化设置的一些有特殊格式的文件。

1.1.2 常见的配置文件类型

  • properties文件:druid连接池就是使用properties文件作为配置文件。
  • XML文件:Tomcat就是使用XML文件作为配置文件。
  • yaml文件:SpringBoot就是使用yaml文件作为配置文件。
  • json文件:通常用来做文件传输,但是也可以做前端或移动端的配置文件。

1.2 properties文件

  • 语法:
  1. key=value
  • 说明:

    • ① 键值对组成。
    • ② 键和值之间的符号是等号。
    • ③ 每一行都必须顶格写,前面不能有空格之类的其他符号。
    • ③ 可以使用#xxx作为注释信息。
  • 示例:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=5
jdbc.maxActive=10
jdbc.maxWait=1000

1.3 XML文件

1.3.1 概念

  • XML是Xtensible Markup Language的缩写,翻译过来就是可扩展标记语言。所以很明显,XML和HTML一样都是标记语言,也就是说它们的基本语法都是标签。
  • 可扩展:XML允许自定义格式,但是不意味着我们可以随便写。

XML语法规范.png

  • 在XML基本语法规范的基础上,你使用的那些第三方应用程序、框架会通过设计『XML约束』的方式『强制规定』配置文件中可以写什么和怎么写,规定之外的都不可以写。
  • XML基本语法这个知识点的定位是:我们不需要从零开始,从头到尾的一行一行编写XML文档,而是在第三方应用程序、框架已提供的配置文件的基础上修改。要改成什么样取决于你的需求,而怎么改取决于XML基本语法具体的XML约束

1.3.2 XML的基本语法

  • XML的文档声明:这部分基本上就是固定格式,要注意的是文档声明一定要从第一行第一列开始写
<?xml version="1.0" encoding="UTF-8"?>
  • 根标签:根标签有且只能有一个。
  • 标签关闭:
    • 双标签:开始标签和结束标签必须成对出现。
    • 单标签:单标签在标签内关闭。
  • 标签嵌套:可以嵌套,但是不能交叉嵌套。
  • 注释不能嵌套。
  • 标签名、属性名建议使用小写字母。
  • 属性:
    • 属性必须有值。
    • 属性值必须加引号,单双都行。

总结:XML的基本语法和HTML的基本语法简直如出一辙。其实这不是偶然的,XML基本语法+HTML约束=HTML语法。在逻辑上HTML确实是XML的子集。

1.3.3 XML的约束(了解)

  • 将来我们主要就是根据XML约束中的规定来编写XML配置文件,而且会在我们编写XML的时候根据约束来提示我们编写, 而XML约束主要包括DTD和Schema两种。
  • DTD:将来在IDEA中有代码提示的协助,在DTD文档的约束下进行配置非常简单。
<!ENTITY % fontstyle
 "TT | I | B | U | S | STRIKE | BIG | SMALL">

<!ENTITY % phrase "EM | STRONG | DFN | CODE |
                   SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >

<!ENTITY % special
   "A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
    MAP | Q | SUB | SUP | SPAN | BDO | IFRAME">

<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">

<!-- %inline; covers inline or "text-level" elements -->
<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
<!ATTLIST (%fontstyle;|%phrase;)
  %attrs;                              -- %coreattrs, %i18n, %events --
  >
  • Schema:使用SSM框架中的Spring、SpringMVC框架时,会涉及到一点点对Schema约束的设置。不过不必紧张,有IDEA的支持操作会非常简单,我们现在只需要理解基本概念即可。
    • 名称空间(name space):

名称空间.png

  • Schema约束要求我们一个XML文档中,所有标签,所有属性都必须在约束中有明确的定义。
  • 以web.xml的约束声明为例来做个说明:

    <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">
    

    | 属性名 | 作用 | | —- | —- | | xmlns | 指出当前XML文档约束规则的名称空间在哪里。我们就是通过这个属性来引用一个具体的名称空间。 | | xmlns:xsi | 指出xmlns这个属性是在哪个约束文档中被定义的。 | | xsi:schemaLocation | 语法格式:在xsi名称空间下引用schemaLocation属性。配置含义:指定当前XML文档中所用到的约束文档本身的文件的地址。 |

  • xmlns和xsi:schemaLocation对应关系如下图:

xmlns和xsischemaLocation对应关系.png

  • 引入多个名称空间的例子如下: ```xml <?xml version=”1.0” encoding=”UTF-8”?>


   - 看到这么复杂,这么长的名称空间字符串,我们会觉得很担心,根本记不住。但是其实不需要记,在IDEA中编写配置文件时,IDEA会协助我们导入,会有提示。我们理解各个部分的含义能够调整即可。

<a name="c384821c"></a>
### 1.3.4 XML解析

<a name="fc98f477"></a>
#### 1.3.4.1 概述

- XML解析:用Java代码读取xml中的数据。

<a name="ae893287"></a>
#### 1.3.4.2 XML的两种解析方式

-  ① DOM解析:将文档加载进内存,形成一颗dom树(document对象),将文档的各个组成部分封装为一些对象。 
   - 优点:因为在内存中会形成dom树,程序员可以以面向对象的方式操作XML文件,写代码就非常方便,可以对dom树进行增删改查。
   - 缺点:dom树非常占内存,解析速度慢。所以一般解析体积较大的XML文件的时候不会采用DOM解析。
-  ② SAX解析:逐行读取,基于事件驱动,解析一行释放一行,内存占用非常小 

-  `建议:一般会采用DOM解析方式来解析XML,除非是解析体积很大的XML文件才会采用SAX解析`。 

<a name="08fef142"></a>
#### 1.3.4.3 常见的XML解析器

- 在使用Java代码解析XML的时候,我们通常不会直接使用JDK内置的原生的DOM或者SAX解析XML,因为代码实在是太复杂了。一些公司和组织已经封装好了优秀的XML解析器,我们通常会使用第三方XML解析器来解析XML 
   - ① JAXP: sun公司提供的解析。支持dom和sax(不常用)。
   - ② JDOM。
   - ③ DOM4J(常用) 。

<a name="7690b1a9"></a>
#### 1.3.4.4 DOM4J的使用步骤

- ① 导入jar包 dom4j.jar。
- ② 创建解析器对象(SAXReader)。
- ③ 解析xml 获得Document对象。
- ④ 获取根节点RootElement
- ⑤ 获取根节点下的子节点

<a name="5bac6c6f"></a>
#### 1.3.4.5 DOM4J的API介绍

- 创建SAXReader对象:

```java
SAXReader saxReader = new SAXReader();
  • 解析XML获取Document对象: 需要传入要解析的XML文件的字节输入流:
Document document = reader.read(inputStream);
  • 获取文档的根标签:
Element rootElement = documen.getRootElement()
  • 获取标签的子标签:
//获取所有子标签
List<Element> sonElementList = rootElement.elements();
//获取指定标签名的子标签
List<Element> sonElementList = rootElement.elements("标签名");
  • 获取标签体内的文本:
String text = element.getText();
  • 获取标签的某个属性的值:
String value = element.AttributeValue("属性名");
  • 示例:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <student id="001">
        <name>张三</name>
        <age>18</age>
        <gender>男</gender>
    </student>
    <student id="002">
        <name>李四</name>
        <age>20</age>
        <gender>女</gender>
    </student>
    <teacher id="001">
        <name>王五</name>
        <age>25</age>
        <gender>男</gender>
    </teacher>
    <teacher id="002">
        <name>赵六</name>
        <age>35</age>
        <gender>男</gender>
    </teacher>
</persons>
package com.github.demo;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * @author 许大仙
 * @version 1.0
 * @since 2021-10-19 11:02
 */
public class Test {
    public static void main(String[] args) throws DocumentException {
        // 创建SAXReader对象
        SAXReader saxReader = new SAXReader();
        // 解析XML获取Document对象: 需要传入要解析的XML文件的字节输入流
        Document document = saxReader.read(Test.class.getClassLoader().getResourceAsStream("students.xml"));
        // 获取根标签
        Element rootElement = document.getRootElement();
        String name = rootElement.getName();
        System.out.println("根标签名称 = " + name); // 根标签名称 = students
        // 获取子标签
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            String name1 = element.getName();
            System.out.println("获取子标签的标签名 = " + name1);
        }
        // 获取指定标签名的子标签
        List<Element> ageElement = rootElement.elements("teacher");
        for (Element element : ageElement) {
            String name1 = element.getName();
            System.out.println("获取指定标签名的子标签的标签名 = " + name1);
        }
    }
}

第二章:Tomcat

2.1 简介

  • Tomcat服务器是一个开源的轻量级的web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP程序的首选,这也是绝大多数的JavaEE开发工程师所必用的。
  • Tomcat的作用是作为Web服务器部署web项目,从而让客户端能够访问,在这个过程中它扮演两个角色:web服务器和Servlet容器。

Tomcat简介.png

2.2 Tomcat的安装和启动

2.2.1 前提

  • 必须安装JDK,并且配置了JAVA_HOME。
  • 查看JDK的版本:
java -version

查看JDK的版本.png

  • 查看JAVA_HOME:
echo %JAVA_HOME%

查看JAVA_HOME.png

2.2.2 Tomcat之exe版本的安装

apache-tomcat-8.5.72.zip

Tomcat的安装1.png

Tomcat的安装2.png

Tomcat的安装3.png

Tomcat的安装4.png

Tomcat的安装5.png

Tomcat的安装6.png

Tomcat的安装7.png

Tomcat的安装8.png

Tomcat的安装9.png

Tomcat的安装10.png

Tomcat的安装11.png

Tomcat的安装12.png

2.2.3 Tomcat之zip版本的安装

apache-tomcat-8.5.72-windows-x64.zip

  • 直接解压到非中文无空格的目录中。

Tomcat之zip版本的安装.png

2.2.4 启动Tomcat并访问

启动Tomcat并访问.png

2.3 Tomcat的目录结构

Tomcat的目录结构.png

2.4 Tomcat的端口

  • 在Tomcat安装目录下的conf目录中,可以看到一个server.xml文件,这个xml文件中就配置了Tomcat的端口号:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Tomcat的端口 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
      <!-- Tomcat的端口 -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
  • Tomcat启动后,这些端口都会被占用。

2.5 Tomcat部署web项目

  • 我们编写完web项目之后,通常会将web项目打成war包,然后将war包放入到Tomcat的webapps目录中即可。
  • 因为在Tomcat启动过程中,会将war包进行解压,然后运行解压后的项目。
  • 在浏览器中访问刚刚部署的项目,地址是http://localhost:8080/项目文件夹名/要访问的文件名

2.6 IDEA集成Tomcat

IDEA集成Tomcat1.png

IDEA集成Tomcat2.png

IDEA集成Tomcat3.png

IDEA集成Tomcat4.png

IDEA集成Tomcat5.png

IDEA集成Tomcat6.png

IDEA集成Tomcat7.png

2.7 创建动态web工程

2.7.1 创建空项目

创建空项目1.png

创建空项目2.png

创建空项目3.png

2.7.2 创建动态的web模块

IDEA 2021.2.3中的Java Enterprise必须和Maven或Gradle工具整合使用。

创建动态的web模块1.png

创建动态的web模块2.png

创建动态的web模块3.png

第三章:HTTP

3.1 概念

  • HTTP协议:Hyper Text Transfer Protocol,超文本传输协议。
  • HTTP最大的作用就是确定了请求和响应数据的格式。浏览器发送给服务器的数据,称为请求报文;服务器返回给浏览器的数据,称为响应报文。
  • HTTP协议由请求和响应两部分组成,请求是由客户端向服务器端传输数据的,而响应是由服务器端向客户端传输数据的。

3.2 请求报文

3.2.1 概述

  • 请求报文包括请求行、请求消息头、请求体。

请求报文.png

3.2.2 请求头

  • 作用:展示了当前请求的最基本的信息。
  • 示例:请求方式 访问地址 http协议的版本
POST /dynamic/target.jsp HTTP/1.1

3.2.3 请求消息头

  • 作用:通过具体的参数对本次请求进行详细的说明。
  • 格式:键值对,键和值之间用逗号隔开。
  • 比较重要的请求消息头: | 名称 | 功能 | | —- | —- | | Host | 服务器的主机地址 | | Accept | 声明当前请求能够接受的『媒体类型』 | | Referer | 当前请求来源页面的地址 | | Content-Length | 请求体内容的长度 | | Content-Type | 请求体的内容类型,这一项的具体值是媒体类型中的某一种 | | Cookie | 浏览器访问服务器时携带的Cookie数据 |

3.2.4 请求体

  • 作用:作为请求的主体,发送数据给服务器。其实具体来说就是POST请求方式下的请求参数。
  • 格式:

    • ① form data:当前请求是一个表单提交的请求参数。

      • 每一组请求参数是一个键值对
      • 键和值中间是等号
      • 键值对之间是&号
        username=tom&password=123456
        
    • ② Request Payload:整个请求体以某种特定格式来组织数据,例如JSON格式。

请求体.png

3.3 请求方式

3.3.1 HTTP协议定义的请求方式

  • HTTP 1.1一共定义了8种请求方式:
  • GET:从服务器端获取数据。
  • POST:将数据保存到服务器端。
  • PUT:命令服务器对数据执行更新。
  • DELETE:命令服务器删除数据。
  • ⑤ HEAD
  • ⑥ CONNECT
  • ⑦ OPTIONS:CORS会涉及到。
  • ⑧ TRACE

3.3.2 GET请求

  • ① 没有请求体。
  • ② 请求参数附着在URL地址后面。
  • ③ 请求参数在浏览器地址栏能够直接被看到,存在安全隐患。
  • ④ 在URL地址后面携带请求参数,数据容量非常有限。如果数据量大,那么超出容量的数据会丢失。
  • ⑤ 从报文角度分析,请求参数是在请求行中携带的,因为访问地址在请求行。

3.3.3 POST请求

  • ① 有请求体。
  • ② 请求参数放在请求体中。
  • ③ 请求体发送数据的大小没有限制。
  • ④ 可以发送各种不同类型的数据。
  • ⑤ 从报文角度分析,请求参数是在请求体中携带的。
  • ⑥ 由于请求参数是放在请求体中,所以浏览器地址栏看不到。

3.4 媒体类型

  • HTTP协议中的MIME类型:Multipurpose Internet Mail Extensions。
  • 作用:为了让用户通过浏览器和服务器端交互的过程中有更好、更丰富的体验,HTTP协议需要支持丰富的数据类型。
  • MIME类型定义参考:可以查看Tomcat解压目录下的conf/web.xml配置文件,了解HTTP协议中定义的MIME类型。
<mime-mapping>
    <extension>123</extension>
    <mime-type>application/vnd.lotus-1-2-3</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>3dml</extension>
    <mime-type>text/vnd.in3d.3dml</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>3ds</extension>
    <mime-type>image/x-3ds</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>3g2</extension>
    <mime-type>video/3gpp2</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>3gp</extension>
    <mime-type>video/3gpp</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>7z</extension>
    <mime-type>application/x-7z-compressed</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>aab</extension>
    <mime-type>application/x-authorware-bin</mime-type>
</mime-mapping>
...
  • 从上面的例子中,可以看出,MIME的基本格式是:大类/具体类型
  • MIME类型在HTTP报文中对应的是内容类型:Content-type

3.5 响应报文

3.5.1 概述

  • 响应报文分为:响应状态行、响应消息头和响应体。

响应报文.png

3.5.2 响应状态行

  • 示例:HTTP协议版本 响应状态码 响应状态的说明文字
HTTP/1.1 200 OK

3.5.3 响应消息头

  • 响应体的说明书。
  • 服务器端对浏览器端设置数据,例如:服务器端返回Cookie信息。 | 名称 | 功能 | | —- | —- | | Content-Type | 响应体的内容类型 | | Content-Length | 响应体的内容长度 | | Set-Cookie | 服务器返回新的Cookie信息给浏览器 | | location | 在重定向的情况下,告诉浏览器访问下一个资源的地址 |

3.5.4 响应体

  • 服务器返回的数据主体,有可能是各种数据类型:
  • ① HTML页面
  • ② 图片
  • ③ 视频
  • ④ 以下载形式返回的文件
  • ⑤ CSS文件
  • ⑥ JavaScript文件

3.5.5 响应状态码

  • 作用:以编码的形式告诉浏览器当前请求处理的结果。 | 状态码 | 含义 | | —- | —- | | 200 | 服务器成功处理了当前请求,成功返回响应 | | 302 | 重定向 | | 400 | [SpringMVC特定环境]请求参数问题 | | 403 | 没有权限 | | 404 | 找不到目标资源 | | 405 | 请求方式和服务器端对应的处理方式不一致 | | 406 | [SpringMVC特定环境]请求扩展名和实际返回的响应体类型不一致 | | 50X | 服务器端内部错误,通常都是服务器端抛异常了 |
  • 404产生的具体原因:
    • 访问地址写错了,确实是没有这个资源。
    • 访问了WEB-INF目录下的资源。
    • Web应用启动的时候,控制台已经抛出异常,导致整个Web应用不可用,访问任何资源都是404。
    • 服务器端缓存。