黑马程序员JavaWeb开发教程(P1-P66)

黑马程序员JavaWeb开发教程(P1-P66)

  • 0. 前言——学完我能干什么?
    • 0.1 工作流程
    • 0.2 Web网站的开发模式
    • 0.3 开发课程安排
  • 1. Web前端开发
    • 1.2 HTML、CSS
      • 1.2.1 HTML小入门
      • 1.2.1 VsCode
      • 1.2.2 HTML教程
      • 1.2.3 CSS教程
      • 1.2.4 JS教程
      • 1.2.5 Vue教程
  • 2. Maven
    • 2.1 Maven的概述
    • 2.2 IDEA集成Maven
      • 2.2.1 配置Maven环境
      • 2.2.2 创建Maven项目
      • 2.2.3 导入Maven项目
    • 2.3 Maven依赖管理
      • 2.3.1 依赖配置
      • 2.3.2 依赖传递
      • 2.3.3 依赖范围
      • 2.3.4 生命周期
      • 2.3.5 继承
      • 2.3.6 聚合
  • 3. Web入门
    • 3.1 课程介绍
    • 3.2 SpringBootWeb
    • 3.3 HTTP协议
      • 3.3.1 概述
      • 3.3.2 请求协议
      • 3.3.3 响应协议
      • 3.3.4 协议解析
    • 3.4 Tomcat
      • 3.4.1 介绍
      • 3.4.2 基本使用
      • 3.4.3 入门程序解析

文章内有很多大牛的博客,仅供自己学习!

0. 前言——学完我能干什么?

黑马程序员JavaWeb开发教程(P1-P66)_第1张图片
Java主要是做这些项目的服务端业务接口的开发

这也就是Java企业级的应用方式。

10几年前的学习路线:
黑马程序员JavaWeb开发教程(P1-P66)_第2张图片
现在的学习路线:
黑马程序员JavaWeb开发教程(P1-P66)_第3张图片
黑马程序员JavaWeb开发教程(P1-P66)_第4张图片
什么是Web?

  • Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的网站

0.1 工作流程

黑马程序员JavaWeb开发教程(P1-P66)_第5张图片
现在还没有数据呢!只是一个空架子!
黑马程序员JavaWeb开发教程(P1-P66)_第6张图片

我要怎么获取我的数据呢?开前端代码请求!!
黑马程序员JavaWeb开发教程(P1-P66)_第7张图片
数据库中的数据就返回给我们的浏览器啦~~

黑马程序员JavaWeb开发教程(P1-P66)_第8张图片

0.2 Web网站的开发模式

以前:前端后端混合在一起开发(混合开发
黑马程序员JavaWeb开发教程(P1-P66)_第9张图片
黑马程序员JavaWeb开发教程(P1-P66)_第10张图片
黑马程序员JavaWeb开发教程(P1-P66)_第11张图片

所以!!!!!

0.3 开发课程安排

黑马程序员JavaWeb开发教程(P1-P66)_第12张图片

1. Web前端开发

黑马程序员JavaWeb开发教程(P1-P66)_第13张图片

提示:不同的浏览器,内核不同,对于相同的前端代码解析的效果会存在差异。

黑马程序员JavaWeb开发教程(P1-P66)_第14张图片

1.2 HTML、CSS

1.2.1 HTML小入门

黑马程序员JavaWeb开发教程(P1-P66)_第15张图片

HTML——学标签
在这里插入图片描述

CSS——学样式

黑马程序员JavaWeb开发教程(P1-P66)_第16张图片
黑马程序员JavaWeb开发教程(P1-P66)_第17张图片

  • HTML标签是不分大小写的
  • 单引号与双引号
  • html语法松散

1.2.1 VsCode

黑马程序员JavaWeb开发教程(P1-P66)_第18张图片

DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    <H1>你好H1>
body>
html>

1.2.2 HTML教程

  • 图片标签:
  • src:指定图像的url (绝对路径/相对路径)
  • width:图像的宽度(像素/相对于父元素的百分比)
  • height:图像的高度(像素/相对于父元素的百分比)
  • 标题标签:

    -

水平线标签:


由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!

1.2.3 CSS教程

黑马程序员JavaWeb开发教程(P1-P66)_第19张图片
黑马程序员JavaWeb开发教程(P1-P66)_第20张图片
由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!

1.2.4 JS教程

由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!

1.2.5 Vue教程

由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!

2. Maven

后端Web开发

  • Maven
  • SpringBoot Web基础篇
  • MySQL
  • SpringBoot Mybatis
  • SpringBoot Web开发篇
  • SpringBoot Web进阶篇

什么是maven?
Maven是apache旗下的一一个开源项目,是一款用于管理和构建java项目的工具。
黑马程序员JavaWeb开发教程(P1-P66)_第21张图片
Maven的作用?

黑马程序员JavaWeb开发教程(P1-P66)_第22张图片依赖管理

这些是在网上下载的jar包,手动导入做一个大项目 非常的难!
黑马程序员JavaWeb开发教程(P1-P66)_第23张图片

如果用Maven呢?我们只需要建立一个maven工程。

黑马程序员JavaWeb开发教程(P1-P66)_第24张图片

工程中我是不需要导入任何jar包的,我只需要在pom.xml中配置你想要的jar包信息就行。Maven得到这个信息会自动联网下载这个包。

黑马程序员JavaWeb开发教程(P1-P66)_第25张图片

统一项目结构

黑马程序员JavaWeb开发教程(P1-P66)_第26张图片
不同的开发工具,他们构建出的目录结构是不统一的,我在idea中导入的工程导入到eclipse是无法直接用的。

黑马程序员JavaWeb开发教程(P1-P66)_第27张图片
黑马程序员JavaWeb开发教程(P1-P66)_第28张图片
项目构建

黑马程序员JavaWeb开发教程(P1-P66)_第29张图片

2.1 Maven的概述

介绍:

  • Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建。
  • 作用:
    ➢方便的依赖管理
    ➢统一的项目结构
    ➢标准的项目构建流程
  • 官网: http://maven.apache.org/

黑马程序员JavaWeb开发教程(P1-P66)_第30张图片
仓库:用于存储资源,管理各种jar包。

  • 本地仓库:自己计算机上的一一个目录。
  • 中央仓库:由Maven团队维护的全球唯一的。 仓库地址: https://repo1.maven.org/maven2/
  • 远程仓库(私服):一般由公司团队搭建的私有仓库。

黑马程序员JavaWeb开发教程(P1-P66)_第31张图片

安装:https://maven.apache.org/download.cgi
黑马程序员JavaWeb开发教程(P1-P66)_第32张图片

黑马程序员JavaWeb开发教程(P1-P66)_第33张图片

  1. 将原有的例子配置注释掉


  1. 加入自己的配置
<mirror>
	<id>nexus-aliyunid>
	<mirrorOf>centralmirrorOf>
	<name>Nexus aliyunname>
	<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>

  1. 配置基础 JDK 版本

如果按照默认配置运行,Java 工程使用的默认 JDK 版本是 1.5,而我们熟悉和常用的是 JDK 1.8 版本。修改配置的方式是:将 profile 标签整个复制到 settings.xml 文件的 profiles 标签内。

<profile>
    <id>jdk-1.8id>
    <activation>
        <activeByDefault>trueactiveByDefault>
        <jdk>1.8jdk>
    activation>
    <properties>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
       <maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
    properties>
profile>

配置环境变量

新建环境变量:
黑马程序员JavaWeb开发教程(P1-P66)_第34张图片

配置环境变量的规律:

XXX_HOME 通常指向的是 bin 目录的上一级

PATH 指向的是 bin 目录

通过 mvn -v 验证:
黑马程序员JavaWeb开发教程(P1-P66)_第35张图片

Microsoft Windows [版本 10.0.22621.1555]
(c) Microsoft Corporation。保留所有权利。

C:\Windows\System32>mvn -v
Apache Maven 3.9.2 (c9616018c7a021c1c39be70fb2843d6f5f9b8a1c)
Maven home: D:\Download_Software\Maven\apache-maven-3.9.2
Java version: 19.0.2, vendor: Oracle Corporation, runtime: E:\Java_DownLoad\jdk-19_windows-x64_bin\jdk-19.0.2
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows"

C:\Windows\System32>

2.2 IDEA集成Maven

2.2.1 配置Maven环境

  • 选择IDEA中File —— Settings —— Build,Execution,Deployment —— Build Tools —— Maven
  • 设置IDEA使用本地安装的Maven,并修改配置文件及本地仓库路径

黑马程序员JavaWeb开发教程(P1-P66)_第36张图片

2.2.2 创建Maven项目

黑马程序员JavaWeb开发教程(P1-P66)_第37张图片

黑马程序员JavaWeb开发教程(P1-P66)_第38张图片
Maven坐标

  • 什么是坐标?
    ➢Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
    ➢使用坐标来定义项目或引入项目中需要的依赖。

Maven中的坐标使用三个『向量』在『Maven的仓库』中唯一的定位到一个『jar』包。

  • groupId:公司或组织的 id,即公司或组织域名的倒序,通常也会加上项目名称
    例如:groupId:com.javatv.maven

  • artifactId:一个项目或者是项目中的一个模块的 id,即模块的名称,将来作为 Maven 工程的工程名
    例如:artifactId:auth

  • version:版本号
    例如:version:1.0.0

提示:坐标和仓库中 jar 包的存储路径之间的对应关系,如下

    <groupId>javax.servletgroupId>
	<artifactId>servlet-apiartifactId>
	<version>2.5version>

上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

2.2.3 导入Maven项目

黑马程序员JavaWeb开发教程(P1-P66)_第39张图片

黑马程序员JavaWeb开发教程(P1-P66)_第40张图片

2.3 Maven依赖管理

最核心的功能

2.3.1 依赖配置

依赖就是jar包,jar包就是依赖

黑马程序员JavaWeb开发教程(P1-P66)_第41张图片
pom.xml
POM:Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。

POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。

POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。

当前的pom.xml


<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.0modelVersion>

    <groupId>org.examplegroupId>
    <artifactId>Maven_testartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>19maven.compiler.source>
        <maven.compiler.target>19maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

project>

引入依赖


<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.0modelVersion>

    <groupId>org.examplegroupId>
    <artifactId>Maven_testartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <maven.compiler.source>19maven.compiler.source>
        <maven.compiler.target>19maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    properties>

    <dependencies>
        <dependency>
            <groupId>ch.qos.logbackgroupId>
            <artifactId>logback-classicartifactId>
            <version>1.2.3version>
        dependency>

    dependencies>


project>

注意:第一次输入 没有提示,因为本地库没有,正常输入点击下面这个东西,更新库即可
黑马程序员JavaWeb开发教程(P1-P66)_第42张图片
注意事项

  • 如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会 比较耗时,耐心等待)
  • 如果不知道依赖的坐标信息,可以到[https://mvnrepository.com/]中搜索。

2.3.2 依赖传递

依赖是具有传递性的,当导入一个依赖, 你可能导入了好几个
黑马程序员JavaWeb开发教程(P1-P66)_第43张图片

  • 当你引入projectA项目资源,你就引入了B与C
  • 直接依赖:在当前项目中通过依赖配置建立的依赖关系
  • 间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

黑马程序员JavaWeb开发教程(P1-P66)_第44张图片

黑马程序员JavaWeb开发教程(P1-P66)_第45张图片

黑马程序员JavaWeb开发教程(P1-P66)_第46张图片
但是我要是A不需要其中继承过来的资源怎么办???
黑马程序员JavaWeb开发教程(P1-P66)_第47张图片

黑马程序员JavaWeb开发教程(P1-P66)_第48张图片

<dependency>
	<groupId>net.javatv.mavengroupId>
	<artifactId>authartifactId>
	<version>1.0.0version>
	<scope>compilescope>
    
	
	<exclusions>
		
		<exclusion>
			
			<groupId>commons-logginggroupId>
			<artifactId>commons-loggingartifactId>
		exclusion>
	exclusions>
dependency>

2.3.3 依赖范围

黑马程序员JavaWeb开发教程(P1-P66)_第49张图片

<dependency>
<groupld>junit
<artifactld>junit
<version>4.10version>
<scope>test
dependency>

上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能,引入依赖存在一个范围,maven的依赖范围包括: compileprovideruntimetestsystem

compile:表示编译范围,指 A 在编译时依赖 B,该范围为默认依赖范围。编译范围的依赖会用在编译,测试,运行,由于运行时需要,所以编译范围的依赖会被打包。
provided:provied 依赖只有当 jdk 或者一个容器已提供该依赖之后才使用。provide 依赖在编译和测试时需要,在运行时不需要。例如:servlet api被Tomcat容器提供了。
runtime:runtime 依赖在运行和测试系统时需要,但在编译时不需要。例如:jdbc 的驱动包。由于运行时需要,所以 runtime 范围的依赖会被打包。
test:test 范围依赖在编译和运行时都不需要,只在测试编译和测试运行时需要。例如:Junit。由于运行时不需要,所以 test 范围依赖不会被打包。
system:system 范围依赖与 provide 类似,但是必须显示的提供一个对于本地系统中 jar 文件的路径。一般不推荐使用。

依赖范围 编译 测试 运行时 是否会被打入jar包
compile*
provided* × ×
runtime ×
test* × × ×
system ×

2.3.4 生命周期

生命周期
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一

Maven中有3套相互独立的生命周期:

  1. clean: 清理工作。
  2. default: 核心工作,如:编译、测试、打包、安装、部署等。
  3. site: 生成报告、发布站点等。
    黑马程序员JavaWeb开发教程(P1-P66)_第50张图片
  • clean:移除上一次构建生成的文件
  • compile:编译项目源代码
  • test:使用合适的单元测试框架运行测试(junit)
  • package:将编译后的文件打包,如: jar、war等
  • install:安装项目到本地仓库

黑马程序员JavaWeb开发教程(P1-P66)_第51张图片

黑马程序员JavaWeb开发教程(P1-P66)_第52张图片

2.3.5 继承

Maven工程之间,A 工程继承 B 工程

  • B 工程:父工程
  • A 工程:子工程

本质上是 A 工程的 pom.xml 中的配置继承B 工程中 pom.xml 的配置。

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。

它的背景是:

  1. 对一个比较大型的项目进行了模块拆分。
  2. 一个 project 下面,创建了很多个 module。
  3. 每一个 module 都需要配置自己的依赖信息。

它背后的需求是:

  1. 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
  2. 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
  3. 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

黑马程序员JavaWeb开发教程(P1-P66)_第53张图片

黑马程序员JavaWeb开发教程(P1-P66)_第54张图片

父工程创建好之后,要修改它的打包方式:


<packaging>pompackaging>

只有打包方式为 pom 的 Maven 工程能够管理其他 Maven 工程。打包方式为 pom 的 Maven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程,所以可以将生成的 src 目录删除

② 创建模块工程
黑马程序员JavaWeb开发教程(P1-P66)_第55张图片
黑马程序员JavaWeb开发教程(P1-P66)_第56张图片
黑马程序员JavaWeb开发教程(P1-P66)_第57张图片
然后可以在父工程的 pom 文件中看到:
黑马程序员JavaWeb开发教程(P1-P66)_第58张图片
子工程的 pom 如下:

黑马程序员JavaWeb开发教程(P1-P66)_第59张图片

③ 在父工程中配置依赖的统一管理

使用dependencyManagement标签配置对依赖的管理,如下:


<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.0modelVersion>

    <groupId>net.javatv.mavengroupId>
    <artifactId>maven-demo-parentartifactId>
    <packaging>pompackaging>
    <version>1.0-SNAPSHOTversion>

    <modules>
        <module>demo-modulemodule>
    modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-beansartifactId>
                <version>5.3.19version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-coreartifactId>
                <version>5.3.19version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>5.3.19version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-aopartifactId>
                <version>5.3.19version>
            dependency>
        dependencies>
    dependencyManagement>

project>

而实际上被管理的依赖并没有真正被引入到工程

④ 子工程中引用那些被父工程管理的依赖

关键点:省略版本号

子工程引用父工程中的依赖信息时,可以把版本号去掉。把版本号去掉就表示子工程中这个依赖的版本由父工程决定,具体来说是由父工程的dependencyManagement来决定。

子工程 pom 如下:


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

    
    <parent>
        <artifactId>maven-demo-parentartifactId>
        <groupId>net.javatv.mavengroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    
    
    <artifactId>demo-moduleartifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
        dependency>
    dependencies>
    
project>

此时,被管理的依赖才被引入到工程

⑤ 修改父工程依赖信息的版本

这个修改可以是降级,也可以是升级,但一般来说都是升级。

⑥ 父工程中声明自定义属性

对同一个框架的一组 jar 包最好使用相同的版本,为了方便升级框架,可以将 jar 包的版本信息统一提取出来,统一声明版本号 :


<properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    
    <spring.version>5.3.19spring.version>
properties>

在需要的地方使用${}的形式来引用自定义的属性名,真正实现一处修改,处处生效。


<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.0modelVersion>

    <groupId>net.javatv.mavengroupId>
    <artifactId>maven-demo-parentartifactId>
    <packaging>pompackaging>
    <version>1.0-SNAPSHOTversion>

    <modules>
        <module>demo-modulemodule>
    modules>


    
    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>

        
        <spring.version>5.3.19spring.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-beansartifactId>
                <version>${spring.version}version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-coreartifactId>
                <version>${spring.version}version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>${spring.version}version>
            dependency>

            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-aopartifactId>
                <version>${spring.version}version>
            dependency>
        dependencies>
    dependencyManagement>

project>

编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易。如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间。为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来。如下:
黑马程序员JavaWeb开发教程(P1-P66)_第60张图片
如上图所示,公司级的父工程中管理的就是成熟的依赖组合方案,各个新项目、子系统各取所需即可。

2.3.6 聚合

聚合,指分散的聚集到一起,即部分组成整体。

使用一个总工程将各个模块工程汇集起来,作为一个整体对应完整的项目,实际就是 module 标签。

  • 项目:整体
  • 模块:部分

继承和聚合的对应关系

  1. 从继承关系角度来看:
  • 父工程
  • 子工程
  1. 从聚合关系角度来看:
  • 总工程
  • 模块工程

聚合的配置
在总工程中配置 modules 即可:

<modules>
    <module>demo-modulemodule>
modules>

依赖循环问题
如果 A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:

DANGER

[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

这个错误的含义是:循环引用。

Maven模块间循环依赖的解决方案以及分析
问题重现
在coding中Maven各个模块之间经常会有互相引用的问题,当A模块中需要用B模块的功能,而B模块很有可能也需要用到A模块中的功能,这样就会存在A模块中引入了B,而B模块又引用了A,项目启动时maven就会报错
黑马程序员JavaWeb开发教程(P1-P66)_第61张图片

报错原因分析
因为Maven结构是自下而上的,被依赖的包将会提前于使用其的包被maven打包,因此A引用了B,B引用了A,Maven不知道要将哪个包提前打包,就会报错。

具体分析
与其说是Maven循环依赖的问题,更不如说是项目结构存在问题,庞大如Spring都不存在循环依赖的问题,为什么我们自己的项目会存在这种低级错误呢,归根结底是因为对于IOC控制反转理念的理解不够到位,或者说对于IOC解决的问题以及优点理解不全面,IOC相信大家都耳熟能详,控制反转,我认为控制反转最精妙的就是将传统思维中的依赖于某个具体实现 改变为 依赖于其抽象,回想我们所使用的各种Map,各种List,是否都是

List a = new ArrayList<>(); 
Map b = new HashMap<>();

这无一不都是IOC控制反转的体现

解决方案
综上就可以很好的解决Maven循环依赖的问题
黑马程序员JavaWeb开发教程(P1-P66)_第62张图片

将接口与实现impl分模块处理,A impl模块依赖B模块的接口抽象模块,B impl模块依赖A模块的接口抽象模块,将具体实现交由spring处理,同时,entity、vo、dto等实体类应在接口模块中,如下图所示

黑马程序员JavaWeb开发教程(P1-P66)_第63张图片

3. Web入门

3.1 课程介绍

https://spring.io/

Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world’s most popular Java framework.

黑马程序员JavaWeb开发教程(P1-P66)_第64张图片

3.2 SpringBootWeb

需求:使用SpringBoot开发一个web应用, 浏览器发起请求/hello后,给浏览器返回字符串"Hello World ~"。

①.创建springboot工程,并勾选web开发相关依赖。
②.定义HelloController类,添加方法hello,并添加注解。
③.运行测试


社区版本没有这个!!!!
哇靠!那怎么办!!!
没关系——https://aijihuo.cn/post/43.html

大家一定跟着步骤来,真的亲测有效嗷♥


黑马程序员JavaWeb开发教程(P1-P66)_第65张图片

黑马程序员JavaWeb开发教程(P1-P66)_第66张图片
观察层级关系嗷~~~
黑马程序员JavaWeb开发教程(P1-P66)_第67张图片
上面的就是启动类!
我手动在com.example.springbootwebquickstart.controller 创建HelloController
快捷键:controller.HelloController.
下面就是我们的请求处理类。
黑马程序员JavaWeb开发教程(P1-P66)_第68张图片
HelloController.java

package com.example.springbootwebquickstart.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//请求处理类
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World");
        return "Hello World";
    }
}


日志!!!
观察日志是占用了8080这个端口

E:\Java_DownLoad\jdk-19_windows-x64_bin\jdk-19.0.2\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\lib\idea_rt.jar=51948:E:\Java_DownLoad\IntelliJ IDEA 2023.1.1\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\HP\Desktop\Ctest\test1\springboot-web-quickstart\target\classes;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.7.11\spring-boot-starter-web-2.7.11.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-starter\2.7.11\spring-boot-starter-2.7.11.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot\2.7.11\spring-boot-2.7.11.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.7.11\spring-boot-autoconfigure-2.7.11.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.7.11\spring-boot-starter-logging-2.7.11.jar;C:\Users\HP\.m2\repository\ch\qos\logback\logback-classic\1.2.12\logback-classic-1.2.12.jar;C:\Users\HP\.m2\repository\ch\qos\logback\logback-core\1.2.12\logback-core-1.2.12.jar;C:\Users\HP\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.2\log4j-to-slf4j-2.17.2.jar;C:\Users\HP\.m2\repository\org\apache\logging\log4j\log4j-api\2.17.2\log4j-api-2.17.2.jar;C:\Users\HP\.m2\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;C:\Users\HP\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\HP\.m2\repository\org\yaml\snakeyaml\1.30\snakeyaml-1.30.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.7.11\spring-boot-starter-json-2.7.11.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.13.5\jackson-databind-2.13.5.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.5\jackson-annotations-2.13.5.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.13.5\jackson-core-2.13.5.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.5\jackson-datatype-jdk8-2.13.5.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.5\jackson-datatype-jsr310-2.13.5.jar;C:\Users\HP\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.5\jackson-module-parameter-names-2.13.5.jar;C:\Users\HP\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.7.11\spring-boot-starter-tomcat-2.7.11.jar;C:\Users\HP\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.74\tomcat-embed-core-9.0.74.jar;C:\Users\HP\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.74\tomcat-embed-el-9.0.74.jar;C:\Users\HP\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.74\tomcat-embed-websocket-9.0.74.jar;C:\Users\HP\.m2\repository\org\springframework\spring-web\5.3.27\spring-web-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-beans\5.3.27\spring-beans-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-webmvc\5.3.27\spring-webmvc-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-aop\5.3.27\spring-aop-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-context\5.3.27\spring-context-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-expression\5.3.27\spring-expression-5.3.27.jar;C:\Users\HP\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\HP\.m2\repository\org\springframework\spring-core\5.3.27\spring-core-5.3.27.jar;C:\Users\HP\.m2\repository\org\springframework\spring-jcl\5.3.27\spring-jcl-5.3.27.jar com.example.springbootwebquickstart.SpringbootWebQuickstartApplication

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::               (v2.7.11)

2023-05-15 21:37:51.849  INFO 13508 --- [           main] c.e.s.SpringbootWebQuickstartApplication : Starting SpringbootWebQuickstartApplication using Java 19.0.2 on DESKTOP-JL38L7P with PID 13508 (C:\Users\HP\Desktop\Ctest\test1\springboot-web-quickstart\target\classes started by HP in C:\Users\HP\Desktop\Ctest\test1\springboot-web-quickstart)
2023-05-15 21:37:51.850  INFO 13508 --- [           main] c.e.s.SpringbootWebQuickstartApplication : No active profile set, falling back to 1 default profile: "default"
2023-05-15 21:37:52.255  INFO 13508 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-05-15 21:37:52.259  INFO 13508 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-05-15 21:37:52.259  INFO 13508 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.74]
2023-05-15 21:37:52.310  INFO 13508 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-05-15 21:37:52.310  INFO 13508 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 436 ms
2023-05-15 21:37:52.500  INFO 13508 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-05-15 21:37:52.515  INFO 13508 --- [           main] c.e.s.SpringbootWebQuickstartApplication : Started SpringbootWebQuickstartApplication in 0.923 seconds (JVM running for 1.392)
2023-05-15 21:38:49.802  INFO 13508 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-05-15 21:38:49.802  INFO 13508 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-05-15 21:38:49.804  INFO 13508 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
Hello World

访问http://localhost:8080/hello
黑马程序员JavaWeb开发教程(P1-P66)_第69张图片

3.3 HTTP协议

但是我只是在网址搜索框中输入了localhost:8080/hello,为什么会访问到http://localhost:8080/hello呢?

  • 浏览器自动添加了http的协议

3.3.1 概述

  • 概念: Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
  • 客户端和服务端通过交换各自的消息(与数据流正好相反)进行交互。

由像浏览器这样的客户端发出的消息叫做请求( requests )

被服务端回应的消息叫做响应(responses )
黑马程序员JavaWeb开发教程(P1-P66)_第70张图片
请求数据:
黑马程序员JavaWeb开发教程(P1-P66)_第71张图片
响应数据:

黑马程序员JavaWeb开发教程(P1-P66)_第72张图片
学HTTP就是学数据格式!

两者要做一个约定,我就按照这个规定来我的请求,你按照这个规定来解析

  1. HTTP全称为Hyper Text Transfer Protocol,被译为超文本传输协议,是互联网上应用最为广泛的—种网络协议。
  2. HTTP协议是在Web上进行数据交换的基础,是一种“客户端-服务器端”协议。也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
  3. 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法

HTTP协议历史与标准

  1. HTTP/O.9: 1991年制定,有严重设计缺陷,只支持GET方法,不支持MIIME类型,很快被
  2. HTTP/1.0取代。
  3. HTTP/1.0: 1996年制定,支持多种请求方法,支持多媒仲对象,得到广泛应用。
  4. HTTP/10+:支持持久连接、虚拟主机、代理连接等新特性,成为非官方的事实标准。
  5. HTTP/11: 1999年制定,校正HTTP中的设计缺陷,性能优化,删除一些不好的特性。
  6. HTTP-NG(或HTTP/20):关注HTTP协议的性能优化以及更强大的服务逻辑远程执行框架,研究工作仍在进行中。

HTTP基本原理

  1. HTTP被设计于上20世纪90年代初期,是一种可扩展的协议

  2. HTTP是应用层的协议,通过TCP,或者是TLS-加密的TCP连接来发送,理论上任何可靠的传输协议都可以使用。

  3. 因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如HTML表单这样的信息。

  4. HTTP还可以根据网页需求,仅获取部分Web文档内容更新网页。
    黑马程序员JavaWeb开发教程(P1-P66)_第73张图片

HTTP的基本特性

  1. HTTP是简单的
    虽然下一代HTTP/2协议将HTTP消息封装到了帧中,HTTP大体上还是被设计得简单易读。
    HTTP报文能够被人读懂,还允许简单测试,降低了门槛。

  2. HTTP是可扩展的
    在HTTP/1.O中出现的HTTP headers让协议扩展变得非常容易。

  3. HTTP是无状态,有会话的
    在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互。

  4. HTTP和连接
    一个连接是由传输层来控制的,这从根本上不属于HTTP的范围。

  5. 基于TCP协议:面向连接,安全

  6. 基于请求-响应模型的: 一次请求对应一次响应

HTTP协议 是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点:多次请求间不能共享数据。 优点:速度快

HTTP能控制什么

以下是可以被HTTP控制的常见特性:

  • 缓存
  • 开放同原限制
  • 认证
  • 基本的认证功能可以直接通过HTTP提供,或用HTTP Cookies来设置指定的会话。
  • 代理和隧道
    通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实IP地址。因此HTTP请求就要通
    过代理越过这个网络屏障。
  • 会话

3.3.2 请求协议

HTTP的请求方式不局限于下面2种(联系到了HTML的表单方式)
黑马程序员JavaWeb开发教程(P1-P66)_第74张图片

请求头

参数 说明
Host 请求的主机名
User-Agent 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0… Chrome/79, IE浏览器的标识类似Mozilla/5.0 (WindowsNT … )like Gecko
Accept 表示浏览器能接收的资源类型,如text/*, image/或者 /*表示所有;
Accept-Language 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept- Encoding 表示浏览器可以支持的压缩类型,例如gzip, deflate等。
Content-Type 请求主体的数据类型。
Content-Length 请求主体的大小(单位:字节)。

3.3.3 响应协议

黑马程序员JavaWeb开发教程(P1-P66)_第75张图片

HTTP响应格式

参数 说明
1xx 响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。
2xx 成功-表示请求已经被成功接收,处理已完成。
3xx 重定向-重定向到其他地方;让客户端再发起一-次请求以完成整个处理。
4xx 客户端错误处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。
5xx 服务器错误处理发生错误,责任在服务端。如:程序抛出异常等。

常见的响应状态码

状态 英文描述 解释
200 OK 客户端请求成功,即处理成功,这是我们最想看到的状态码
302 Found 指示所请求的资源已移动到由Locati on响应头给定的URL,浏览器会自动重新访问到这个页面
304 Not Modified 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
404 Not Found 请求资源不存在,一般是URL输入有误, 或者网站资源被删除了
405 Method Not Allowed 请求方式有误,比如应该用GET请求方式的资源,用了POST
428 Precondition Required 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429 Too Many Requests 指示用户在给定时间内发送了太多请求(“限速”) ,配合Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields TOO Large 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交
500 Interna1 Server Error 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503 Service Unavailable 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

常见的响应头

参数 说明
Content-Type 表示该响应内容的类型,例如text/html, application/json。
Content-Length 表示该响应内容的长度(字节数)。
Content- Encoding 表示该响应压缩算法,例如gzip。
Cache-Control 指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒。
Set-Cookie 告诉浏览器为当前页面所在的域设置cookie。

3.3.4 协议解析

黑马程序员JavaWeb开发教程(P1-P66)_第76张图片

3.4 Tomcat

3.4.1 介绍

Web服务器
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。

安装好https://tomcat.apache.org/后,讲本地开发好的包 放到Tocat的文件夹中,运行服务器,在浏览器直接可以访问。

黑马程序员JavaWeb开发教程(P1-P66)_第77张图片

3.4.2 基本使用

黑马程序员JavaWeb开发教程(P1-P66)_第78张图片
黑马程序员JavaWeb开发教程(P1-P66)_第79张图片
修改的地方是大概在51行左右,把UTF-8变成GBK
黑马程序员JavaWeb开发教程(P1-P66)_第80张图片
黑马程序员JavaWeb开发教程(P1-P66)_第81张图片

黑马程序员JavaWeb开发教程(P1-P66)_第82张图片
注意事项

  • HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。

Tomcat-基本使用
Tomcat部署项目:
将项目放置到webapps目录下,即部署完成

3.4.3 入门程序解析

在这里插入图片描述

黑马程序员JavaWeb开发教程(P1-P66)_第83张图片
起步依赖

  • spring-boot-starter-web
  • spring-boot-starter-test

你可能感兴趣的:(JavaWeb,数据库)