目录
SpringBoot基础
前言
1. SpringBootWeb快速入门
1.1 需求
1.2 开发步骤
2. HTTP协议
2.1 HTTP-概述
2.2 HTTP-请求协议
2.3 HTTP-响应协议
2.4 HTTP-协议解析
3. WEB服务器-Tomcat
3.1 简介
3.2 基本使用
3.3 入门程序解析
我们可以打开Spring的官网(https://spring.io),去看一下Spring的简介:Spring makes Java simple。
spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流行程度排序为:
我们发现Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。而我们在项目开发时,一般会偏向于选择这一套spring家族的技术,来解决对应领域的问题,那我们称这一套技术为spring全家桶。
而Spring家族旗下,这么多的技术,最基础、最核心的是 SpringFramework。其他的spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等等。
而如果我们在项目中,直接基于SpringFramework进行开发,存在两点问题:配置繁琐、入门难度大。 所以基于此呢,spring官方推荐我们从另外一个项目开始学习,那就是目前最火爆的SpringBoot。 通过springboot就可以快速的帮我们构建应用程序,所以springboot呢,最大的特点有两个: 简化配置、快速开发。
Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。
今日课程内容:
接下来,我们就直接通过一个SpringBoot的web入门程序,让大家快速感受一下,基于SpringBoot进行Web开发的便捷性。
需求:基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。
1.2.1 创建SpringBoot工程(需要联网)
基于Spring官方骨架,创建SpringBoot工程。
基本信息描述完毕之后,勾选web开发相关依赖。
点击finish之后,就会联网创建这个SpringBoot工程,创建好之后,结构如下:
1.2.2 定义请求处理类
在com.itheima这个包下创建一个 子包 com.itheima.controller,然后再在这个包下新建一个类 HelloController。
package com.itheima.controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("Hello World ~");
return "Hello World ~";
}
}
1.2.3 运行测试
运行SpringBoot自动生成的引导类
打开浏览器,输入 http://localhost:8080/hello
2.1.1 介绍
HTTP:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器与服务器之间数据传输的规则。
所以,我们学习HTTP主要就是学习请求和响应数据的具体格式内容。
2.2.2 特点
HTTP协议有它自己的一些特点,分别是:
请求之间无法共享数据会引发的问题,如:
具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用会话技术(Cookie、Session)来解决这个问题。具体如何来做,我们后面会详细讲到。刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?
请求数据分为三个部分:请求行、请求头、请求体。
请求方式有七种,最常用的是GET和POST
Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
Content-Type:请求主体的数据类型
Content-Length:数据主体的大小(单位:字节)
举例说明: 服务端可以根据请求头中的内容来获取客户端的相关信息,有了这些信息服务端就可以处理不同的业务需求,比如:
- 不同浏览器解析HTML和CSS标签的结果会有不一致,所以就会导致相同的代码在不同的浏览器会出现不同的效果
- 服务端根据客户端请求头中的数据获取到客户端的浏览器类型,就可以根据不同的浏览器设置不同的代码来达到一致的效果
- 这就是我们常说的浏览器兼容问题
如上图绿色部分的内容就是请求体的内容,请求体和请求头之间是有一个空行隔开。此时浏览器发送的是POST请求,为什么不能使用GET呢?这时就需要回顾GET和POST两个请求之间的区别了:
2.3.1 格式介绍
响应数据总共分为三部分内容,分别是:响应行、响应头、响应体
Content-Type:表示该响应内容的类型,例如text/html,image/jpeg ;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip ;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ;
Set-Cookie: 告诉浏览器为当前页面所在的域设置cookie ;
上图中 [{id:1, brandName:"阿里巴巴"}] 这部分内容就是响应体,它和响应头之间有一个空行隔开。
2.3.2 响应状态码
状态码分类 |
说明 |
1xx |
响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它 |
2xx |
成功——表示请求已经被成功接收,处理已完成 |
3xx |
重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。 |
4xx |
客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等 |
5xx |
服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等 |
参考:
浏览器的响应状态码 报404 报500都是什么_响应状态代码不指示成功: 500_HuanLe.的博客-CSDN博客404?500?都在提示我们什么https://blog.csdn.net/qq_57277310/article/details/127845771?spm=1001.2014.3001.5502
关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握:
小结
将资料中准备好的Demo工程,导入到我们的IDEA中,有一个Server.java类,这里面就是自定义的一个服务器代码,主要使用到的是ServerSocket和Socket
package com.itheima;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
* 自定义web服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8080); // 监听指定端口
System.out.println("server is running...");
while (true){
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock);
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
try (InputStream input = this.sock.getInputStream();
OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 读取HTTP请求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {// 发送错误响应:
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {// 发送成功响应:
//读取html文件,转换为字符串
InputStream is = Server.class.getClassLoader().getResourceAsStream("html/a.html");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行标识Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
上面代码,大家不需要自己写,主要通过上述代码,只需要大家了解到服务器可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,真正用到的Web服务器,我们不会自己写,都是使用目前比较流行的web服务器,比如Tomcat
3.1.1 Web服务器
Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。
Web服务器是安装在服务器端的一款软件,将来我们把自己写的Web项目部署到Web Tomcat服务器软件中,当Web服务器软件启动后,部署在Web服务器软件中的页面就可以直接通过浏览器来访问了。
Web服务器软件使用步骤
上述内容在演示的时候,使用的是Apache下的Tomcat软件,至于Tomcat软件如何使用,后面会详细的讲到。而对于Web服务器来说,实现的方案有很多,Tomcat只是其中的一种,而除了Tomcat以外,还有很多优秀的Web服务器,比如:
Tomcat就是一款软件,我们主要是以学习如何去使用为主。具体我们会从以下这些方向去学习:
首选我们来认识下Tomcat。
3.1.2 Tomcat
小结
通过这一节的学习,我们需要掌握以下内容:
封装HTTP协议操作,简化开发
可以将Web项目部署到服务器中,对外提供网上浏览服务
3.2.1 下载
直接从官方网站下载:
Apache Tomcat® - Apache Tomcat 9 Software Downloads
大家可以自行下载
3.2.2 安装与卸载
安装:
Tomcat是绿色版,直接解压即可
bin:目录下有两类文件,一种是以.bat结尾的,是Windows系统的可执行文件,一种是以.sh结尾的,是Linux系统的可执行文件。
webapps:就是以后项目部署的目录
到此,Tomcat的安装就已经完成。
卸载:
卸载比较简单,可以直接删除目录即可
3.2.3 启动与关闭
启动:
双击: bin\startup.bat
注意: 启动的过程中,控制台有中文乱码,需要修改,去配置文件修改一下编码就好
conf/logging.properties
启动后,通过浏览器访问 http://localhost:8080能看到Apache Tomcat的内容就说明Tomcat已经启动成功。
关闭:
关闭有三种方式
3.2.4 配置
修改端口:
Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml
注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。
启动时可能出现的错误:
解决方案:换一个端口号
在入门程序中,我们所编写的程序并没有部署到外部的tomcat中,因为在SpringBoot中,一旦我们引入了web的运行环境(也就是引入spring-boot-starter-web的依赖),其实内部已经集成了内置的tomcat服务器。
我们可以通过IDEA开发工具右侧的maven面板中,就可以看到当前工程引入的依赖。其中已经将Tomcat的相关依赖传递下来了,也就是说, SpringBoot中已经内置了Tomcat服务器。当我们运行引导类时,就会看到命令行输出的日志,占用8080端口的Tomcat。
Spring的官方提供了很多现成的starter,我们在开发相关应用时,只需要引入对应的starter即可。
官方地址:
https://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/#using.build-systems.startershttps://docs.spring.io/spring-boot/docs/2.7.2/reference/htmlsingle/