Java+WebAI黑马知识点

HTTP协议

概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器与服务器之间数据传输的规则。

特点:

1.基于TCP协议:面向连接,安全

2.基于请求-响应模型:一次请求对应一次响应

3.HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的。

优点:速度快 缺点:多次请求间不能共享数据


请求协议

请求数据格式

请求方式--get:请求参数在请求行中,没有请求体。get请求大小在浏览器中是有限制的

请求方式--post:请求参数在请求体中,post请求大小是没有限制的。

请求行:请求数据第一行(请求方式、资源路径、协议)

请求头:第二行开始,格式key-value

请求体:post请求,存放请求参数

请求数据获取

http请求数据不需要程序员自己解析,web服务器负责对http请求数据进行解析,并封装为了请求对象。

如何获取请求数据?

httpservletrequest对象里面封装了所有的请求信息。

响应数据格式

响应行:响应数据第一行(协议、状态码、描述)

响应头:第二行开始,格式key:value

响应体:最后一部分,存放响应数据


耦合:衡量软件中各个层/各个模块的依赖关联程度

内聚:软件中各个功能模块内部的功能联系

高内聚低耦合

控制反转:IOC(Inversion Of Control),对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转

依赖注入:DI(Dependency Injection)。容器为应用程序提供运行时,所依赖的资源称之为依赖注入

Bean对象:ioc容器中创建、管理的对象称之为Bean

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

@Component:声明bean的基础注解

@Controller:@Component的衍生注解,标注在控制层类上

@Service:@Component的衍生注解,标注在业务层类上

@Repository:@Component的衍生注解,标注在数据访问层类上(由于与mybatis整合,用的少)

在springboot集成web开发中,声明控制器bean只能用@Controller。声明bean的注解想要生效,需要被扫描到,启动类默认扫描当前包及其子包。

基于@Autowired进行依赖注入的常见方式有三种:

1.属性注入(多) 优点:代码简洁、方便快速开发 缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性

复制代码
@RestController
public class UserController{
    @Autowired
    private UserService userService;
    ...
}

2.构造函数注入 优点:能清晰地看到类的依赖关系、提高了代码安全性 缺点:代码繁琐、若构造参数过多会导致构造函数臃肿

java 复制代码
public class UserController{
    private final UserService userService;
    @Autowired
    public UserController(UserService userService){
    this.userService=userService;}
    ...
}

3..setter注入 优点:保持了类的封装性、依赖关系更清晰 缺点:需要额外编写setter方法,增加了代码量

java 复制代码
@RestController
public class UserController{
    private final UserService userService;
    @Autowired
    public void UserService(UserService userService){
    this.userService=userService;}
    ...
}

@Autowired注解,默认是按照类型进行注入。

如果存在多个相同类型的bean,会报错。

解决方法:1.@Primary 2.@Qualifier 3.@Resource

@Resource和@Autowired区别:@Autowired是spring框架提供的注解,而@Resource是javaee规范提供的;@Autowired默认是按照类型注入,而@Resource默认是按照名称注入


JDBC(Java DatBase Connectivity):使用java语言操作关系型数据库的一套API。

MyBatis是一款优秀的持久层框架,由于简化JDBC的开发

数据库连接池是个容器,负责分配、管理数据库连接。它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。释放空闲时间超过最大时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏。优势:资源重用、提升系统响应速度、避免数据库连接遗漏。标准接口:DataSource,功能获取连接。(Druid、Hikari默认)

|-----|-------------------------------|---------------|---------|
| 符号 | 说明 | 场景 | 优缺点 |
| #{} | 占位符。执行时,会将#{...}替换为?,生成预编译sql | 参数值传递 | 安全、性能高 |
| ${} | 拼接符。直接将参数拼接在sql语句中,存在sql注入问题。 | 表名、字段名动态设置时使用 | 不安全、性能低 |

在mybatis中既可以通过注解配置sql语句也可以通过xml配置文件配置sql语句。

默认规则:

1.xml映射文件的名称与mapper接口名称一致,并且将xml映射文件和mapper接口放置在相同包下。

2.xml映射文件的namespace属性为mapper接口全限定名一致

3.xml映射文件中sql语句的id与mapper接口中的方法名一致,并且保持返回类型一致

yml配置文件

格式:数值前边必须有空格,作为分隔符;使用缩进表示层级关系,缩进时不允许使用tab键,只能用空格;缩进的空格数目不重要,只要相同层级的元素左侧对齐即可;#表示注释

Restful

Rest(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。

Rest风格特点:URL定义资源、HTTP动词描述操作


项目解析

代码执行顺序是:

复制代码
浏览器/前端
   ↓
DeptController
   ↓
DeptService
   ↓
DeptServiceImpl
   ↓
DeptMapper
   ↓
数据库 dept 表
   ↓
返回部门列表
   ↓
Result.success(...)
   ↓
返回给前端

1. Controller:接收请求

复制代码
@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

    @GetMapping("/depts")                   //->当前端发送 GET 请求访问 /depts 时,就会执行下面的 findAll() 方法。
    public Result findAll() {
        List<Dept> deptList = deptService.findAll();               //->Controller 自己不去查数据库,而是调用 Service,让 Service 去处理查询部门这件事。
        return Result.success(deptList);              //->把查出来的部门列表包装成统一格式,然后返回给前端。
    }
}

作用是:接收前端请求,并返回响应结果。

2. Service:业务处理

作用是:处理业务逻辑。

复制代码
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Override
    public List<Dept> findAll() {
        return deptMapper.findAll();
    }
}

3. Mapper:操作数据库

复制代码
@Mapper
public interface DeptMapper {

    /**
     * 查询全部部门
     */
    @Select("select * from dept order by update_time desc")
    public List<Dept> findAll();
}

作用是:真正去数据库查询数据。

4. 三个 findAll() 是什么关系?

用户访问 /depts,Controller 接住请求,Controller 调用 Service,Service 调用 Mapper,Mapper 执行 SQL 查 dept 表,查到的数据返回给 Service,再返回给 Controller,最后 Controller 用 Result.success() 包装后返回给前端。

相关推荐
信誓旦旦的程序猿34 分钟前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)34 分钟前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
Flynt2 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
Tangyuewei2 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring
她的男孩2 小时前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
小溪学编程3 小时前
Java BufferedReader 详解:从基础用法到性能优化
java·python·性能优化
HZero.chen3 小时前
Java 匿名类简介
java·匿名类
用户3126874877203 小时前
Java 泛型擦除到底擦掉了什么?类型安全与桥接方法深度拆解
java
暖焰核心3 小时前
继承全解——继承、默认成员函数、切片、隐藏与虚继承
java·前端·javascript
君顾13 小时前
外卖CPS系统开发实战指南:从架构设计到部署全流程解析
java·开发语言·外卖