【黑马JavaWeb+AI知识梳理】后端Web基础02 - Web基础
Web基础知识
- 静态资源:服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。比如:HTML、CSS、JS、图片、视频等(负责页面展示)
- 动态资源:服务器端根据用户请求和其他数据动态生成的,内容可能会在每次请求时都发生变化。比如:Servlet、JSP等(负责逻辑处理),上述两个已被淘汰,目前主流为Spring框架。
- B/S架构:Browser/Server,浏览器/服务器架构模式。客户端只需浏览器,应用程序的逻辑和数据都存在服务器端。(维护方便,体验一般)
- C/S架构:Client/Server,客户端/服务器架构模式。需要单独开发维护客户端。(体验不错 开发维护麻烦)
SprintBootWeb入门
Spring
[官方网站](Spring | Home)
Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能
Spring Boot可以帮助我们非常快速地构建应用程序、简化开发、提高效率。
入门程序
需求:基于SpringBoot开发一个Web应用,浏览器发起请求/hello之后,给浏览器返回一个字符串“Hello Xxx”
- 创建springboot工程,并勾选web开发相关依赖。
- 定义HelloController类,添加方法hello,并添加注解。
- RestController
- RequestMapping
- 运行启动类,测试
Spring官方脚手架连接不上解决方案:start.aliyun.com
入门程序剖析
启步依赖:
-
spring-boot-starter-web:包含了Web应用开发所需要的常见依赖
内嵌了tomcat
-
spring-boot-starter-test:单元测试所需要的常见依赖
HTTP协议
概述
Hyper Text Transfer Protocal,超文本传输协议,规定了浏览器(请求)和服务器(响应)之间数据传输的规则。
特点:
- 基于TCP协议:面向连接,安全
- 基于请求-响应模型的:一次请求对应一次响应
- HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
- 缺点:多次请求间不能共享数据
- 优点:速度快
请求协议
请求数据格式
请求方式-GET:请求参数在请求行中,没有请求体。GET请求大小在浏览器中是有限制的。
请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。
-
请求行:请求数据第一行(请求方式、资源路径、协议)
-
请求头:第二行开始,格式key: value
请求头 含义 Host 请求的主机名 User-Agent 浏览器版本 Accept 表示浏览器能接受的资源类型,如 text/*, image/*或者*/*
表示所有Accept-Language 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页 Accept-Encoding 表示浏览器可以支持的压缩类型,例如gzip,deflate等 Content-Type 请求主体的数据类型 Content-Length 请求主体的大小(单位:字节) -
请求体:POST请求,存放请求参数
和请求头有一行空行
请求数据获取
HTTP请求数据不需要程序员自己解析
HttpServletRequest对象里封装了所有的请求信息
Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest),在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作,让Web开发更加便捷。
响应协议
响应数据格式
-
响应行:响应数据第一行(协议、状态码、描述)
重点关注200(客户端请求成功)、404(请求资源不存在,URL输入有误或者网站资源被删除)、500(服务器发生不可预期的错误)
类别 含义 1xx 响应中-临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。 2xx 成功-表示请求已经被成功接收,处理已完成。 3xx 重定向-重定向到其他地方,让客户端再发起一次请求以完成整个处理。 4xx 客户端错误:处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。 5xx 服务器错误:处理发生错误,责任在服务器。如:程序抛出异常等。 响应头 含义 Content-Type 表示该响应内容的类型。 Content-Length 表示该响应内容的长度(字节数)。 Content-Encoding 表示该响应压缩算法,例如gzip。 Cache-Control 指示客户端应如何缓存,例如max-age=300表示最多缓存300秒。 Set-Cookie 告诉浏览器为当前页面所在的域设置cookie。 -
响应头:第二行开始,格式key: value
-
响应体:最后一部分,存放响应数据
和响应头有一行空行
响应数据设置
响应状态码和响应头如没有特殊要求,通常不手动设定,服务器会根据请求处理的逻辑,自动设置响应状态码和响应头
Web服务器(Tomcat)对HTTP协议的响应数据进行了封装(HttpServletResponse),并在调用Controller方法的时候传递给了该方法。这样就使得程序员不必直接对协议进行操作,让Web开发更加便捷。
SpringBootWeb案例
静态资源文件存放位置:resources/static
@RestController(@Controller+@ResponseBody)封装了ResponseBody -> 作用:将controller返回值直接作为HTTP响应体的数据直接响应;返回值是对象/集合 -> json ->响应
- 准备工作:
- 创建一个SpringBoot工程,并勾选web依赖、lombok
- 引入资料中的用户数据文件(user.txt),及前端静态页
- 定义一个实体类,用来封装用户信息
- 开发服务端程序,接收请求,读取文本数据并响应
- 问题及解决
- 实际参数列表和形式参数列表长度不同:pom.xml中给Lombok出现的三个位置指定
<version>
- 实际参数列表和形式参数列表长度不同:pom.xml中给Lombok出现的三个位置指定
分层解耦
**为什么要对代码进行拆分?**复用性差、难以维护
三层架构
数据访问、逻辑处理、接收请求&响应数据 --> 遵循单一职责原则,便于复用、后期维护
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- service:业务逻辑层,处理具体的业务逻辑。
- dao:数据访问层(Data Acces Object)(持久层),负责数据访问操作,包括数据的增删改查。
分层解耦
- 耦合:衡量软件中各个层/各个模块的依赖关联程度。
- 内聚:软件中各个功能模块内部的功能联系
- 软件设计原则:高内聚低耦合
控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为Bean
实现分层解耦的思路:
- 将项目中的类交给IOC容器管理(IOC,控制反转)
- 应用程序运行时需要什么对象,直接依赖容器为其提供(DI,依赖注入)
IOC与DI入门
-
将Dao及Service层的实现类,交给IOC容器管理。
实现类加@Component注解
-
为Controller及Service注入运行时所依赖的对象。
成员变量加@Autowired注解
IOC&DI详解
IOC详解
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
声明bean的时候,可以通过注解的value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
注解 | 说明 | 位置 |
---|---|---|
@Component | 声明bean的基础注解 | 不属于以下三类时,用此注解 |
@Controller | @Component的衍生注解 | 标注在控制层类上 |
@Service | @Component的衍生注解 | 标注在业务层类上 |
@Repository | @Component的衍生注解 | 标注在数据访问层类上(用于与mybatis整合,用得少) |
- 在Springboot集成web开发中,声明控制器bean只能用@Controller
- 声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
- 该注解虽然没有显式配置,但实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描范围是启动类所在包及其子包
DI详解
-
基于@Autowired进行依赖注入的常见方式:
-
属性注入(实际应用多)
-
优点:代码简洁、方便快速开发
-
缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性
-
构造函数注入(Spring官网推荐)
- 优点:能清晰地看到类的依赖关系、提高了代码的安全性。
- 缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。
- 如果只有一个构造函数,@Autowired注解可以省略
-
-
setter注入
- 优点:保持了类的封装性,依赖关系更清晰。
- 缺点:需要额外编写setter方法,增加了代码量
- 优点:保持了类的封装性,依赖关系更清晰。
-
-
@Autowired注解,默认是按照类型进行注入的。
-
如果存在多个相同类型的bean,将会报错。
-
方法一:@Primary
-
方法二:@Qualifier
和@Autowired搭配
-
方法三:@Resource
-
-
Resource和Autowired区别:
- @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
- @Autowired默认是按照类型注入,而@Resource默认是按照名称注入