这也就是Java企业级的应用方式。
我要怎么获取我的数据呢?开前端代码请求!!
数据库中的数据就返回给我们的浏览器啦~~
所以!!!!!
提示:不同的浏览器,内核不同,对于相同的前端代码解析的效果会存在差异。
CSS——学样式
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>
-
水平线标签:
由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!
由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!
由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!
由于前端主要是了解,大家可以取找一些大佬的CSDN笔记 看一看 YYDS!!
后端Web开发
什么是maven?
Maven是apache旗下的一一个开源项目,是一款用于管理和构建java项目的工具。
Maven的作用?
这些是在网上下载的jar包,手动导入做一个大项目 非常的难!
如果用Maven呢?我们只需要建立一个maven工程。
工程中我是不需要导入任何jar包的,我只需要在pom.xml中配置你想要的jar包信息就行。Maven得到这个信息会自动联网下载这个包。
统一项目结构
不同的开发工具,他们构建出的目录结构是不统一的,我在idea中导入的工程导入到eclipse是无法直接用的。
介绍:
安装:https://maven.apache.org/download.cgi
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
如果按照默认配置运行,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>
配置环境变量
配置环境变量的规律:
XXX_HOME 通常指向的是 bin 目录的上一级
PATH 指向的是 bin 目录
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>
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
最核心的功能
依赖就是jar包,jar包就是依赖
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>
注意:第一次输入 没有提示,因为本地库没有,正常输入点击下面这个东西,更新库即可
注意事项
<dependency>
<groupId>net.javatv.mavengroupId>
<artifactId>authartifactId>
<version>1.0.0version>
<scope>compilescope>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupld>junit groupld>
<artifactld>junit artifactld>
<version>4.10version>
<scope>test scope >
dependency>
上面说到我们使用 Maven 最主要的就是使用它的依赖管理功能,引入依赖存在一个范围,maven的依赖范围包括: compile
,provide
,runtime
,test
,system
。
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 | √ | √ | × | √ |
生命周期
Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。
Maven中有3套相互独立的生命周期:
Maven工程之间,A 工程继承 B 工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
它的背景是:
它背后的需求是:
通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。
父工程创建好之后,要修改它的打包方式:
<packaging>pompackaging>
只有打包方式为 pom 的 Maven 工程能够管理其他 Maven 工程。打包方式为 pom 的 Maven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程,所以可以将生成的 src 目录删除。
② 创建模块工程
然后可以在父工程的 pom 文件中看到:
而子工程的 pom 如下:
③ 在父工程中配置依赖的统一管理
使用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>
编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易。如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间。为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来。如下:
如上图所示,公司级的父工程中管理的就是成熟的依赖组合方案,各个新项目、子系统各取所需即可。
聚合,指分散的聚集到一起,即部分组成整体。
使用一个总工程将各个模块工程汇集起来,作为一个整体对应完整的项目,实际就是 module 标签。
继承和聚合的对应关系
聚合的配置
在总工程中配置 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就会报错
报错原因分析
因为Maven结构是自下而上的,被依赖的包将会提前于使用其的包被maven打包,因此A引用了B,B引用了A,Maven不知道要将哪个包提前打包,就会报错。
具体分析
与其说是Maven循环依赖的问题,更不如说是项目结构存在问题,庞大如Spring都不存在循环依赖的问题,为什么我们自己的项目会存在这种低级错误呢,归根结底是因为对于IOC控制反转理念的理解不够到位,或者说对于IOC解决的问题以及优点理解不全面,IOC相信大家都耳熟能详,控制反转,我认为控制反转最精妙的就是将传统思维中的依赖于某个具体实现 改变为 依赖于其抽象,回想我们所使用的各种Map,各种List,是否都是
List a = new ArrayList<>();
Map b = new HashMap<>();
这无一不都是IOC控制反转的体现
将接口与实现impl分模块处理,A impl模块依赖B模块的接口抽象模块,B impl模块依赖A模块的接口抽象模块,将具体实现交由spring处理,同时,entity、vo、dto等实体类应在接口模块中,如下图所示
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.
需求:使用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
但是我只是在网址搜索框中输入了localhost:8080/hello
,为什么会访问到http://localhost:8080/hello
呢?
由像浏览器这样的客户端发出的消息叫做请求( requests )
被服务端回应的消息叫做响应(responses )
请求数据:
响应数据:
两者要做一个约定,我就按照这个规定来我的请求,你按照这个规定来解析
HTTP协议历史与标准
HTTP基本原理
HTTP被设计于上20世纪90年代初期,是一种可扩展的协议。
HTTP是应用层的协议,通过TCP,或者是TLS-加密的TCP连接来发送,理论上任何可靠的传输协议都可以使用。
因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如HTML表单这样的信息。
HTTP的基本特性
HTTP是简单的
虽然下一代HTTP/2协议将HTTP消息封装到了帧中,HTTP大体上还是被设计得简单易读。
HTTP报文能够被人读懂,还允许简单测试,降低了门槛。
HTTP是可扩展的
在HTTP/1.O中出现的HTTP headers让协议扩展变得非常容易。
HTTP是无状态,有会话的
在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互。
HTTP和连接
一个连接是由传输层来控制的,这从根本上不属于HTTP的范围。
基于TCP协议:面向连接,安全
基于请求-响应模型的: 一次请求对应一次响应
HTTP协议 是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的。
缺点:多次请求间不能共享数据。 优点:速度快
HTTP能控制什么
以下是可以被HTTP控制的常见特性:
HTTP的请求方式不局限于下面2种(联系到了HTML的表单方式)
请求头
参数 | 说明 |
---|---|
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 | 请求主体的大小(单位:字节)。 |
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。 |
Web服务器
Web服务器是一个软件程序,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
安装好https://tomcat.apache.org/后,讲本地开发好的包 放到Tocat的文件夹中,运行服务器,在浏览器直接可以访问。
Tomcat-基本使用
Tomcat部署项目:
将项目放置到webapps目录下,即部署完成