【黑马JavaWeb之后端基础知识】

SpringBootWeb入门

概述

  • 静态资源:在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。(HTML、CSS、JS 以及图片、音频、视频等)
  • 动态资源:在服务器端上存储的,会根据用户请求和其他数据动态生成的,内容可能会在每次请求时都发生变化
  • BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。
  • CS架构:Client/Server,客户端/服务器架构模式。需要单独开发维护客户端。

在这里插入图片描述

  • SpringBoot 是基于 Spring 框架的开发工具包,它简化了 Spring 应用的创建与开发。 Spring官网

HTTP协议

HTTP概述

  • HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。
  • HTTP协议特点:
    • 基于TCP协议: 面向连接,安全
    • 基于请求-响应模型: 一次请求对应一次响应(先请求后响应)
    • HTTP协议是无状态协议: 对于数据没有记忆能力。每次请求-响应都是独立的
      在这里插入图片描述

HTTP请求协议

格式介绍
  • 请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体。
    在这里插入图片描述

  • 请求行 :HTTP请求中的第一行数据。由:请求方式、资源路径、协议/版本组成(之间使用空格分隔)

  • 常见HTTP请求头

在这里插入图片描述

  • 请求体 :存储请求参数(GET请求的请求参数在请求行中,故不需要设置请求体)
  • GET请求和POST请求的区别:

在这里插入图片描述


获取请求数据
  • 获取请求数据
    Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest) ,并在调用Controller方法的时候传递给了该方法。这样,就使得程序员不必直接对协议进行操作,让Web开发更加便捷。

HTTP响应协议

格式介绍
  • 响应协议:服务器将数据以响应格式返回给浏览器。包括:响应行响应头响应体

在这里插入图片描述

  • 响应行:响应数据的第一行。响应行由协议及版本、响应状态码、状态码描述组成。
  • 响应头:响应数据的第二行开始。格式为key:value形式。
  • 响应体: 响应数据的最后一部分。存储响应的数据。(响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束))

响应状态码

在这里插入图片描述

  • 200 ok 客户端请求成功
  • 404 Not Found 请求资源不存在
  • 500 Internal Server Error 服务端发生不可预期的错误

分层解耦

三层架构

介绍
  • 单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。(这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利于后期的维护。)
  • 项目开发中可以将代码分为三层

在这里插入图片描述

  • Controller控制层。接收前端发送的请求,对请求进行处理,并响应数据。
  • Service业务逻辑层。处理具体的业务逻辑。
  • Dao数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

在这里插入图片描述


代码拆分
  • 控制层包名:com.itheima.controller
    • 创建UserController类(调用Service,响应数据)
  • 业务逻辑层包名:com.itheima.service
    • 创建UserSerivce接口
    • 在 com.itheima.service.impl 中创建UserSerivceImpl接口(调用UserDao)
  • 数据访问层包名:com.itheima.dao
    • 创建 UserDao接口
    • com.itheima.dao.impl 中创建UserDaoImpl接口

分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则高内聚低耦合。(目的是使程序模块的可重用性、移植性大大增强。)
  • 解耦思路
    • 不在EmpController中使用new对象
    • 将要用到的对象交给一个容器管理。
    • 应用程序中用到这个对象,就直接从容器中获取

在这里插入图片描述


IOC&DI入门

  • 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器)。
  • 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • bean对象:IOC容器中创建、管理的对象,称之为:bean对象。

  • 将Service及Dao层的实现类,交给IOC容器管理,在实现类加上 @Component 注解,就代表把当前类产生的对象交给IOC容器管理。
  • 使用 @Autowired 为Controller 及 Service注入运行时所依赖的对象。

IOC详解

  • Spring框架为了更好的标识web应用程序开发当中bean对象到底归属于哪一层,提供了 @Component的衍生注解:

在这里插入图片描述

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
  • 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。

注意:将项目中的所有的业务类,都放在启动类所在包的子包中,就无需考虑组件扫描问题


DI详解

  • @Autowired 进行依赖注入,常见的方式,有如下三种:
  • 属性注入:代码简洁、方便快速开发。(但隐藏了类之间的依赖关系、可能会破坏类的封装性。)
@RestController 
public class UserController { 
    //方式一: 属性注入
    @Autowired
    private UserService userService;
}
  • 构造函数注入:能清晰地看到类的依赖关系、提高了代码的安全性。(但代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。)
@RestController 
public class UserController { 
    //方式二: 构造器注入 
    private final UserService userService;     
    @Autowired //如果当前类中只存在一个构造函数, @Autowired可以省略 
    public UserController(UserService userService) { 
        this.userService = userService;
    }
}
  • setter注入:保持了类的封装性,依赖关系更清晰。(但需要额外编写setter方法,增加了代码量。)
@RestController
public class UserController { 
    //方式三: setter注入 
    private UserService userService;   
    @Autowired 
    public void setUserService(UserService userService) { 
        this.userService = userService; 
    }
 }

  • 注意:若IOC容器中,存在多个相同类型的bean对象,需要让框架知道具体注入哪个bean对象。有如下三种方法:
  • 使用@Primary注解
@Primary
@Service 
public class UserServiceImpl implements UserService { }
  • 使用@Qualifier注解
@RestController 
public class UserController { 
    @Qualifier("userServiceImpl")
    @Autowired
    private UserService userService;
}
  • 使用@Resource注解
@RestController
public class UserController { 
    @Resource(name = "userServiceImpl") 
    private UserService userService;

注意:@Autowird 与 @Resource的区别

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource是按照名称注入

注:本篇文章是基于黑马程序员的《JavaWeb+AI》b站课程做的学习笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值