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


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

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

在这里插入图片描述
Java主要是做这些项目的服务端业务接口的开发

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

10几年前的学习路线:
在这里插入图片描述
现在的学习路线:
在这里插入图片描述
在这里插入图片描述
什么是Web?

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

0.1 工作流程

在这里插入图片描述
现在还没有数据呢!只是一个空架子!
在这里插入图片描述

我要怎么获取我的数据呢?开前端代码请求!!
在这里插入图片描述
数据库中的数据就返回给我们的浏览器啦~~

在这里插入图片描述

0.2 Web网站的开发模式

以前:前端后端混合在一起开发(混合开发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

所以!!!!!

0.3 开发课程安排

在这里插入图片描述

1. Web前端开发

在这里插入图片描述

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

在这里插入图片描述

1.2 HTML、CSS

1.2.1 HTML小入门

在这里插入图片描述

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

CSS——学样式

在这里插入图片描述
在这里插入图片描述

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

1.2.1 VsCode

在这里插入图片描述

<!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>Document</title>
</head>
<body>
    <H1>你好</H1>
</body>
</html>

1.2.2 HTML教程

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

水平线标签: <hr>

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

1.2.3 CSS教程

在这里插入图片描述
在这里插入图片描述
由于前端主要是了解,大家可以取找一些大佬的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项目的工具。
在这里插入图片描述
Maven的作用?

在这里插入图片描述依赖管理

这些是在网上下载的jar包,手动导入做一个大项目 非常的难!
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

统一项目结构

在这里插入图片描述
不同的开发工具,他们构建出的目录结构是不统一的,我在idea中导入的工程导入到eclipse是无法直接用的。

![在这里插入图片描述](https://img-blog.csdnimg.cn/e0b48f4c547e4b3fa94926c438fc9f44.png
在这里插入图片描述
项目构建

在这里插入图片描述

2.1 Maven的概述

介绍:

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

在这里插入图片描述
仓库:用于存储资源,管理各种jar包。

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

在这里插入图片描述

安装:https://maven.apache.org/download.cgi
在这里插入图片描述

在这里插入图片描述

  1. 将原有的例子配置注释掉
<!-- <mirror>
  <id>maven-default-http-blocker</id>
  <mirrorOf>external:http:*</mirrorOf>
  <name>Pseudo repository to mirror external repositories initially using HTTP.</name>
  <url>http://0.0.0.0/</url>
  <blocked>true</blocked>
</mirror> -->

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

  1. 配置基础 JDK 版本

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

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

配置环境变量

新建环境变量:
在这里插入图片描述

配置环境变量的规律:

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

PATH 指向的是 bin 目录

通过 mvn -v 验证:
在这里插入图片描述

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,并修改配置文件及本地仓库路径

在这里插入图片描述

2.2.2 创建Maven项目

在这里插入图片描述

在这里插入图片描述
Maven坐标

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

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

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

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

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

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

    <groupId>javax.servlet</groupId>
	<artifactId>servlet-api</artifactId>
	<version>2.5</version>

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

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

2.2.3 导入Maven项目

在这里插入图片描述

在这里插入图片描述

2.3 Maven依赖管理

最核心的功能

2.3.1 依赖配置

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

在这里插入图片描述
pom.xml
POM:Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。

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

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

当前的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>Maven_test</artifactId>
    <version>1.0-SNAPSHOT</version>

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

</project>

引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>org.example</groupId>
    <artifactId>Maven_test</artifactId>
    <version>1.0-SNAPSHOT</version>

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

    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

    </dependencies>


</project>

注意:第一次输入 没有提示,因为本地库没有,正常输入点击下面这个东西,更新库即可
在这里插入图片描述
注意事项

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

2.3.2 依赖传递

依赖是具有传递性的,当导入一个依赖, 你可能导入了好几个
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
但是我要是A不需要其中继承过来的资源怎么办???
在这里插入图片描述

在这里插入图片描述

<dependency>
	<groupId>net.javatv.maven</groupId>
	<artifactId>auth</artifactId>
	<version>1.0.0</version>
	<scope>compile</scope>
    
	<!-- 使用excludes标签配置依赖的排除	-->
	<exclusions>
		<!-- 在exclude标签中配置一个具体的排除 -->
		<exclusion>
			<!-- 指定要排除的依赖的坐标(不需要写version) -->
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

2.3.3 依赖范围

在这里插入图片描述

<dependency>
<groupld>junit</ groupld>
<artifactld>junit</ artifactld>
<version>4.10</version>
<scope>test</ scope >
</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: 生成报告、发布站点等。
    在这里插入图片描述
  • clean:移除上一次构建生成的文件
  • compile:编译项目源代码
  • test:使用合适的单元测试框架运行测试(junit)
  • package:将编译后的文件打包,如: jar、war等
  • install:安装项目到本地仓库

在这里插入图片描述

在这里插入图片描述

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 包;又能够将以往的经验沉淀下来,节约时间和精力。

在这里插入图片描述

在这里插入图片描述

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

<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>

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

② 创建模块工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后可以在父工程的 pom 文件中看到:
在这里插入图片描述
子工程的 pom 如下:

在这里插入图片描述

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

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

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>net.javatv.maven</groupId>
    <artifactId>maven-demo-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>demo-module</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>5.3.19</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.3.19</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.3.19</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>5.3.19</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

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

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

关键点:省略版本号

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

子工程 pom 如下:

<?xml version="1.0" encoding="UTF-8"?>
<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标签指定当前工程的父工程 -->
    <parent>
        <artifactId>maven-demo-parent</artifactId>
        <groupId>net.javatv.maven</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <!-- 子工程的坐标 -->
    <!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
    <artifactId>demo-module</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
    </dependencies>
    
</project>

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

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

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

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

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

<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 自定义标签,维护Spring版本数据 -->
    <spring.version>5.3.19</spring.version>
</properties>

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

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <groupId>net.javatv.maven</groupId>
    <artifactId>maven-demo-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>demo-module</module>
    </modules>


    <!-- 通过自定义属性,统一指定Spring的版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- 自定义标签,维护Spring版本数据 -->
        <spring.version>5.3.19</spring.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

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

2.3.6 聚合

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

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

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

继承和聚合的对应关系

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

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

<modules>
    <module>demo-module</module>
</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就会报错
在这里插入图片描述

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

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

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

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

解决方案
综上就可以很好的解决Maven循环依赖的问题
在这里插入图片描述

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

在这里插入图片描述

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.

在这里插入图片描述

3.2 SpringBootWeb

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

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


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

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


在这里插入图片描述

在这里插入图片描述
观察层级关系嗷~~~
在这里插入图片描述
上面的就是启动类!
我手动在com.example.springbootwebquickstart.controller 创建HelloController
快捷键:controller.HelloController.
下面就是我们的请求处理类。
在这里插入图片描述
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
在这里插入图片描述

3.3 HTTP协议

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

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

3.3.1 概述

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

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

被服务端回应的消息叫做响应(responses )
在这里插入图片描述
请求数据:
在这里插入图片描述
响应数据:

在这里插入图片描述
学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文档内容更新网页。
    在这里插入图片描述

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的表单方式)
![在这里插入图片描述](https://img-blog.csdnimg.cn/9c266ab0dd774b3881a585d97e8885f3.png

请求头

参数说明
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 响应协议

在这里插入图片描述

HTTP响应格式

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

😐

常见的响应状态码

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

常见的响应头

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

3.3.4 协议解析

在这里插入图片描述

3.4 Tomcat

3.4.1 介绍

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

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

在这里插入图片描述

3.4.2 基本使用

![在这里插入图片描述](https://img-blog.csdnimg.cn/9d9d3519103e45f18fd23ff805cd5057.png
在这里插入图片描述
修改的地方是大概在51行左右,把UTF-8变成GBK
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意事项

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

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

3.4.3 入门程序解析

在这里插入图片描述

在这里插入图片描述
起步依赖

  • spring-boot-starter-web
  • spring-boot-starter-test
  • 5
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Matthew

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值