JavaWeb知识点总结

news/2024/11/29 20:43:44/文章来源:https://www.cnblogs.com/ezan/p/18577425

目录
  • JavaWeb
    • junit
      • 黑盒测试
      • 白盒测试
      • 注解
      • 所需jar包
    • 反射
      • 作用
      • 获取Class对象的方式
      • class对象功能
      • 应用
    • 注解
      • 作用
      • 预定义的注解
      • 自定义注解
      • 解析注解
    • 动态代理
      • Proxy
    • Maven
      • 作用
      • 概述
      • 仓库
      • maven依赖仓库:
      • IDEA集成
      • Maven高级功能
    • JDBC
      • 概念
      • 本质
      • 快速入门
      • 各个对象
      • 抽取JDBC工具类(JDBCUtils)
      • JDBC控制事务
    • 数据库连接池
      • 概念
      • 实现
    • Spring JDBC
      • spring框架对JDBC的简单封装
      • spring_jar包下载官网
      • 步骤
    • HTTP协议
      • 特点
      • 请求协议 (请求数据格式)
      • 响应协议(响应数据格式)
      • 协议解析
    • Tomcat
      • 简介
      • 基本使用
      • 入门程序解析
    • 请求响应
      • DispatcherServlet(前端控制器)
      • BS架构(浏览器/服务器架构)
      • postman调试插件
      • 请求参数
      • 响应
      • 分层解耦
    • Mybatis
      • 概念
      • 注意点
      • 入门
      • 基础操作(增删改查)
      • XML映射文件
      • 动态SQL
    • 开发案例
      • 开发规范
      • 输出结果(用日志的方法)
      • 开发流程
      • 接口调试
      • 开发常用操作
    • 事务管理
      • @Transactional
      • 配置文件中开启事务管理日志
      • rollbackFor
      • propagation
    • AOP
      • 概念
      • 本质
      • 入门
      • 核心概念
      • 通知
      • 切入点表达式
      • 连接点
    • SpringBoot原理
      • 配置优先级
      • Bean管理
      • SpringBoot原理
    • 后端技术总结
      • SpringBoot开发框架
      • 概念区别
      • 概念一览图
    • 思维导图版本
      • XMind文件链接:
    • 声明

JavaWeb

junit

黑盒测试

白盒测试

注解

  • @Test
    • 断言Assert.assertEquals
  • @Before
    • 用于资源申请,所有测试方法在执行之前都会先执行该方法
  • @After
    • 在所有测试方法执行完后,都会自动执行该方法

所需jar包

  • hamcrest-core-1.1.jar
  • junit-4.12.jar

反射

作用

  • 程序运行过程中,可以操作这些对象
  • 可以解耦,提高程序的可扩展性

获取Class对象的方式

  • Class.forName("全类名")
    • 将字节码文件加载进内存,返回Class对象
    • 对用于配置文件,将类名定义在配置文件中。读取文件,加载类
  • 类名.class
    • 通过类名的属性Class获取
    • 多用于参数传递
  • 对象.getClass()
    • getClass()方法在Object类中定义
    • 多用于对象的获取字节码的方式

class对象功能

  • 获取成员变量
    • 设置值
    • 获取值
    • 忽略访问权限修饰符的安全检查
  • 获取构造方法
  • 获取成员方法
  • 获取类名

应用

  • 在不改变任何代码的前提下,可以创建任意类的对象,并执行其中的任意方法
    • 实现
      • 配置文件+反射
    • 步骤
      • 1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
      • 2.在程序中加载读取配置文件
      • 3.使用反射技术来加载类文件进内存
      • 4.创建对象
      • 5.执行方法

注解

作用

  • 编译检查(override)
  • 编写文档
    • doc文档
  • 代码分析
    • 使用反射

预定义的注解

  • @Override
    • 检测该注解标注的方法是否是继承父类(接口)的
  • @Deprecated
    • 表示已过时的方法
  • @SuppressWarnings
    • 压制警告
    • 一般传递参数“all”

自定义注解

  • 格式

    • 元注解
    • public @interface 名称
  • 本质

    image-20241129141828564

  • 属性

    • 接口中可以定义的成员方法
    • 返回值
      • 基本数据类型
      • String
      • 枚举
      • 注解
      • 以上类型的数组
    • 定义属性后,使用时需要给属性赋值
      • 1.如果定义属性时,用default关键字给属性默认初始化值,则在使用注解时,可以不对属性赋值
      • 2.如果只有一个属性需要赋值,并且属性名是value时,则value可以省略,直接定义值
      • 3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略
  • 元注解

    • 描述注解的注解
    • Target
      • 描述注解能够作用的位置
        • TYPE
          • 作用于类
        • METHOD
          • 作用于方法上
        • FIELD
          • 作用于成员变量上
    • Retention
      • SOURCE
      • CLASS
      • RUNTIME
        • @Retention(RetentionPolicy.RUNTIME)
        • 当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
    • Documented
      • 描述注解是否被抽到api文档中
    • Inherited
      • 描述注解是否被子类继承

解析注解

  • 获取注解中定义的属性值
    • 1.获取注解定义的位置的对象
      • CLass,Method,Field
    • 2.获取指定的注解
      • getAnnotation(Class)
        • 本质:在内存中生成了一个该注解接口的子类实现对象
    • 3.调用注解中抽象方法获取配置的属性值

动态代理

Proxy

  • newProxyInstance
    • 参数
      • ClassLoader
        • 类加载器
      • new Class[]
        • 接口数组
      • new InvocationHandler
        • 匿名内部类对象
          • 指定代理干什么事情
        • 重写invoke方法

Maven

作用

  • 依赖管理

    • 方便自动导入jar包
  • 统一项目结构

    image-20241129160913071
  • 标准化项目构建流程

概述

  • 构建和管理

仓库

  • 存储资源,管理jar包
  • 分类
    • 本地仓库
    • 中央仓库
    • 远程仓库(私服)

maven依赖仓库:

https://mvnrepository.com/

IDEA集成

  • 依赖配置

  • 依赖传递<dependencies>

    • 直接依赖
    • 间接依赖
    • 排除依赖
      • 主动断开依赖资源
      • <exclusions>
  • 依赖范围

    image-20241129161350044

  • 生命周期

    • clean

      • 清理工作
        • clean
    • default

      • 核心工作
        • compile
        • test
        • package
        • install
    • site

    • 各阶段作用

      image-20241129161410446

Maven高级功能

  • 分模块设计与开发

    • eg
      • 实体类、工具类使用maven模块拆分出来,使用时引入这些类的依赖即可
  • 继承与聚合

    • 继承
      • 概念
        • 子工程继承父工程的配置信息,常见于依赖关系的继承
        • 简化依赖配置,统一依赖管理
        • <parent>……</parent>
      • 实现
        • 打包方式
          • jar包
            • springboot
          • war包
            • SpringMVC
          • pom包
            • 父工程或聚合工程
        • 父工程
          • 设置打包方式pom
            • <packaging>
          • 配置共有的依赖
        • 子工程
          • 配置继承关系
            • <parent>
            • <relativePath>
              • 父工程的相对路径
      • 版本锁定
        • 统一管理依赖版本
          • <dependencyManagement>
          • 子工程不会引入依赖,只是对用到此依赖的模块进行依赖版本的统一管理
          • 引入指定依赖的子工程的<version>可以省略
          • 自定义属性/引用属性
            • <properties>
            • 集中的将各个依赖的版本号维护在标签<properties>中
            • <dependencyManagement>下的版本改为$
    • 聚合
      • 原始打包方式(繁琐)
        • Maven生命周期
          • 对应依赖模块的instal
            • package
      • 聚合方式打包(推荐)
        • 聚合工程
          • 一个不具有业务功能的“空”工程(有且仅有一个pom文件)
        • <modules>
          • <module>要打包的模块路径</module>
        • 聚合模块下一键操作
          • package
  • 私服

    • 概念

      • 远程仓库,用来代理位于外部的中央仓库,解决资源共享同步问题
    • 资源上传与下载

      • 图解

        image-20241129161716912

      • 项目版本

        • RELEASE(发行版本)
        • SNAPSHOT(快照版本)
      • 配置

        • xml文件中设置私服访问用户名和密码
        • pom文件中上传地址
        • xml文件中设置下载的仓库组地址
    • 本地私服配置

      • 启动本地私服
        1. 解压:apache-maven-nexus.zip
        2. 进入目录:apache-maven-nexus\nexus-3.39.0-01\bin
        3. 启动服务:双击start.bat
        4. 访问服务: localhost:8081
        5. 私服配置说明:将上述配置私服信息的192.168.150.101 改为localhost

JDBC

概念

  • Java datebase connectivity
    • Java数据库连接
      • Java语言操作数据库

本质

  • 官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类

快速入门

  • 步骤
    • 1.导入驱动jar包

    • 2.注册驱动

      Class.forName("com.mysql.cj.jdbc.Driver");  
      
    • 3.获取数据库连接对象 Connection

      conn = DriverManager.getConnection("jdbc:mysql:///db1","user","password");  
      
    • 4.定义sql

      String sql="";  
      
    • 5.获取执行sql语句的对象 Statement

      stmt=conn.createStatement();  
      
    • 6.执行sql 接收返回结果

      int count = stmt.executeUpdate(sql);  
      
    • 7.处理结果

    • 8.释放资源

      • 用finally
        • 先判断stmt和conn是否为空,再进行释放

各个对象

  • DriverManager(驱动管理对象)

    • 功能
      • 注册驱动

        static void registerDriver(Driver driver);
        
      • 获取数据库连接

        static Connection getConnection(String url,String user,String password);
        
        • 参数
          • URL
            • 指定连接的路径
              • jdbc:mysql://ip地址(域名):端口号/数据库名称
            • 本地mysql服务器连接+默认端口号3306
              • 简写:jdbc:mysql:///数据库名称
          • user
            • 用户
          • password
            • 密码
  • Connection(数据库连接对象)

    • 获取执行sql的对象

      Statement createStatemnt();
      PreparedStatement prepareStatement(String url);  
      
    • 管理事务

      • 开启事务

        setAutoCommit(boolean autoCommit);
        
        • 调用该方法设置参数为false,即为开启事务
      • 提交事务

        commit(); 
        
      • 回滚事务

        rollback();  
        
  • Statement(执行sql对象)

    • 执行sql
      • int executeUpdate(String sql)
        • 执行DML、DDL语句
        • 返回值:影响的行数
          • 判断DML语句是否执行成功(返回值>0)
        • DDL语句没有返回结果
      • ResultSet executeQuery(String sql)
        • 执行DQL语句
  • ResultSet(结果集对象,封装查询结果)

    • next()
      • 游标向下移动一行
    • getXxx()
      • 获取数据(某一行的某一列)
      • eg: getInt(),getString()
      • 参数
        • int
          • 代表列的编号,从1开始
          • getString(1)
        • String
          • 代表列名
          • getDouble("列名")
    • 操作
      • 1.游标向下移动一行
        • next()
      • 2.判断是否有数据
        • boolen next()
      • 3.获取数据
  • PreparedStatement(执行sql对象)

    • sql注入问题

      • 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,造成安全性问题
    • 解决sql注入问题

      • 使用PreparedStatement对象
    • 预编译的sql

      • 参数使用?作为占位符
    • 步骤

      • 1.导入驱动jar包

      • 2.注册驱动

      • 3.获取数据库连接对象Connection

      • 4.定义sql

        • sql的参数使用?作为占位符

          select * from user where username = ? and password = ?;
          
      • 5.获取执行sql的对象preparedStatement

        Connection.preparedStatement(String sql);
        
      • 6.给?赋值

        • setXxx(参数1,参数2)
          • 参数1:?的位置编号,从1开始
          • 参数2:?的值
      • 7.执行sql语句

        • 无需传递sql语句作为参数
      • 8.处理结果

      • 9.释放资源

抽取JDBC工具类(JDBCUtils)

  • 抽取注册驱动
  • 抽取一个方法获取连接对象
    • 要求
      • 不传递参数,还得保证工具类的通用性
    • 解决
      • 配置文件
  • 抽取一个方法释放资源

JDBC控制事务

  • 使用Connection对象来管理事务
    • 开启事务

      setAutoCommit(boolean autoCommit);  
      
      • 调用该方法设置参数为false,即为开启事务

      • 在执行sql之前开启事务

    • 提交事务

      commit(); 
      
      • 当所有sql都执行完提交事务
    • 回滚事务

      rollback();  
      
      • 在抓取异常catch中回滚事务

数据库连接池

概念

  • 存放数据库连接的容器

实现

  • 标准接口
    • DataSource
      • javax.sql包下的
    • 方法
      • 获取连接:getConnection()
      • 归还连接:调用Connection.close()
  • 数据库厂商实现数据库连接池
    • C3P0
      • 步骤
        • 1.导入jar包(两个),同时还要导入驱动jar包
        • 2.定义配置文件
          • 名称
            • c3p0.properties 或 c3p0-config.xml
          • 路径
            • 放在src目录下
        • 3.创建核心对象 数据库连接池对象
          • CombopooledDataSource
        • 4.获取连接对象
          • getConnection
    • Druid
      • 步骤
        • 1.导入jar包
        • 2.定义配置文件
          • properites
          • 可以放任意目录下
        • 3.加载配置文件
          • Properties
          • pro.load()
        • 4.获取数据库连接池对象
          • 通过工厂来获取
            • DruidDataSourceFactory
        • 5.获取连接
          • getConnection
      • 定义工具类
        • 1.定义一个类
          • JDBCUtils
        • 2.提供静态代码块加载配置文件,初始化连接池对象
        • 3.提供方法
          • 1.获取连接方法
            • 通过数据库连接池获取连接
          • 2.释放资源
          • 3.获取连接池的方法

Spring JDBC

spring框架对JDBC的简单封装

  • 提供了一个JDBCTemplate对象简化了JDBC的开发

spring_jar包下载官网

https://repo.maven.apache.org/maven2/org/springframework/

http://commons.apache.org/proper/commons-logging/download_logging.cgi

步骤

  • 1.导入jar包

  • 2.创建JdbcTemplate对象。依赖于数据源DataSource

    JdbcTemplate template = new JdbcTemplate(ds);  
    
  • 3.调用JdbcTemplate的方法来完成CRUD操作

    • update()

      • 执行DML语句;增删改语句
    • queryForMap()

      • 查询结果将结果集封装成map集合
        • 将列名作为key,将值作为value,将这条记录封装为map集合
      • 注意:这个方法查询的结果集长度只能是1
    • qureyForList()

      • 查询结果将结果集封装为list集合
      • 注意:将每一条记录封装为map集合,再将所有的map集合封装为List
    • query()

      • 查询结果将结果封装为JavaBean对象

        List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class)); 
        
        • Emp为封装的类型
    • queryForObject()

      • 查询结果,将结果封装为对象

      • 一般用于聚合函数的查询

        • eg:

          Long total = template.queryForObject(sql,Long.class);  
          

HTTP协议

特点

  • 基于TCP协议
    • 面向连接,安全
  • 基于请求-响应模型的
    • 一次请求对应一次响应
  • HTTP协议是无状态的协议
    • 对于事务处理没有记忆能力。每次请求-响应都是独立的。
      • 缺点: 多次请求间不能共享数据。
      • 优点: 速度快

请求协议 (请求数据格式)

  • 请求行(第一行)

    • 请求方式 、资源路径、协议
  • 请求头(第二行)

    • 格式 key:value

    • 常见key

  • 请求体

    • POST请求,存放请求参数
  • 请求方式GET和POST的区别

    image-20241129164518364

响应协议(响应数据格式)

  • 响应行(第一行)

    • 协议、状态码、描述
  • 响应头(第二行)

    • 格式 key:value
  • 响应体(响应正文)

    • 存放响应数据
  • 常见状态码

    image-20241129165008645

    image-20241129165015224

    image-20241129165029623

协议解析

  • 详见“请求响应”部分

Tomcat

简介

  • Web服务器,是一个软件程序,对HTTP协议的操作进行封装

  • 也称Web容器,Servlet容器

  • 官网

    https://tomcat.apache.org/

基本使用

  • 启动与关闭

    image-20241129165157129
  • 端口修改

    image-20241129165245933

  • 部署项目

    • 将项目放置webapps目录下即可完成部署

入门程序解析

  • 起步依赖

    • spring-boot-starter-web

      • 包含了web应用开发所需要的常见依赖。
    • spring-boot-starter-test

      • 包含了单元测试所需要的常见依赖。
  • 内嵌Tomcat服务器

    • 基于SpringBoot开发的web应用程序

请求响应

DispatcherServlet(前端控制器)

  • HttpServletRequest
  • HttpServletResponse

BS架构(浏览器/服务器架构)

  • 图解

    image-20241129165447051

postman调试插件

  • 接口测试
    • 网页调试,发送网页HTTP请求的插件

请求参数

  • 简单参数
    • 参数名与形参变量名相同,定义形参即可接收参数
    • 若方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
  • 实体参数
    • 简单实体参数
      • 请求参数名与实体对象的属性名一致,自动接收封装
    • 复杂实体参数
  • 数组集合参数
    • 数组
      • 请求参数名与形参中数组变量名相同,直接用数组封装
    • 集合
      • 请求参数名与形参中集合变量名相同,通过@RequestParam绑定参数关系
  • 日期参数
    • 使用@DateTimeFormat注解完成日期参数格式转换
  • Json参数
    • POST请求
      • raw - JSON
    • Json数据键名与形参对象属性名相同,定义pojo类型形参即可接收参数,需使用@RequestBody标识
  • 路径参数
    • 通过请求URL直接传递参数,使用{……}来标识该路径参数,需要使用@PathVariable获取路径参数

响应

  • @RespondBody

    • 介绍

      image-20241129165535207

    • @RestController包含此注解

  • 封装Result(code,msg,data)

分层解耦

  • 三层架构

    • 原则

      • 单一职责原则
    • 图解

      image-20241129165637057

    • 三层架构

      • Controller(控制层)
        • 调用Service层,响应请求
      • Service(业务逻辑层/业务层)
        • 获取Dao数据后对数据进行逻辑处理
      • Dao(数据访问层/持久层)
    • 实现步骤

      • 先实现Dao层,Service层调用Dao层,Controller层调用Service层
      • 面向接口编程
  • 分层解耦

    • 内聚

      • 软件中各个功能模块内部的功能联系
    • 耦合

      • 衡量软件中各个层/模块之间的依赖、关联的程度
    • 软件设计原则

      • 高内聚低耦合
    • 实现分层解耦

      • 控制反转(IOC)+ 依赖注入(DI)

      • Bean对象

        • IOC容器中创建、管理的对象,成为bean
      • 图解

        image-20241129165704103

  • IOC(控制反转)

    • 概念

      • 对象的创建控制权由程序自身转移到外部(容器)
    • 操作

      • 加注解@Component
        • 将当前类放入IOC容器中管理
    • 注意

      • 切换bean对象时,只需要去除原来对象的@Component,在新的bean对象增加@Component
      • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
      • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.
    • 衍生注解

      image-20241129165720940

    • 优化版操作

      • Controller层
        • 不加注解,@RestController包含了@Controller
      • Service层
        • 加注解@Service
      • Dao层
        • 加注解@repository
    • Bean组件扫描

      • 以上四大注解要生效需要加@ComponentScan来扫描,但是启动类中@SpringBootApplication中包含@ComponentScan
      • 因此,需要将三层架构的类放到 启动类当前包及其子包 中才可以扫描到
  • DI(依赖注入)

    • 概念
      • 容器为应用程序运行时,所依赖的资源
    • 操作
      • 加注解@Autowired
        • 从IOC容器中获取bean对象
    • 按照类型进行注入
    • 解决存在多个相同类型的bean注入
      • @Primary
        • 在bean对象的类(控制反转的注解)上加注解@Primary
      • @Qualifier
        • 在@Autowired下面加注解@Qualifier("bean名称")
      • @Resource
        • Resource(name = "bean名称"),此时不用加@Autowired

Mybatis

概念

  • 持久层(Dao)框架,简化JDBC的开发

注意点

  • 文件结构中java包下只能放源码,而resources包下放配置文件
  • 创建文件时,目录分隔不用 . 而用 /
  • Ctrl+Alt+L sql语句的格式调整

入门

  • 步骤

    • 1.创建Springboot工程,数据库表user,实体类User

    • 2.引入mybatis的相关依赖并配置mybatis(在properties文件中配置数据库连接信息)

    • 3.编写SQL语句(注解/XML)

      @Mapper
      public interface UserMapper {@Select("select * from user")public List<User> list();
      }
      
      • 注意Mapper接口中要加注解@Mapper
    • 4.单元测试

  • 在IDEA中配置mysql提示

    • 语言注入设置
    • 配置数据库源
  • lombok

    • 作用
      • 减少实体类的代码量
    • 需要添加lombok依赖
    • 注解@Data
      • 提供了@Getter+@Setter+@ToString+@EqualsAndHashCode
    • 注解@NoArgsConstruct
      • 提供无参构造
    • 注解@AllArgsConstruct
      • 提供全参构造

基础操作(增删改查)

  • 注意点

    • sql语句占位符 #{}
    • 占位符如果出现在' '引号(字符串)内,则要用${ }来占位
    • 日志输出
      • 在properties文件中配置
  • 删除

    • @Delete
  • 新增

    • @Insert

      • 如果有多个参数,则封装成对象传入参数,占位符中是对象的属性值
    • 主键返回

      • 在@Insert上面增加注解

        @Options(useGeneratedKeys=true,keyProperty="id")
        
      • "keyProperty"

        • 主键值封装到对象的哪个属性
  • 更新

    • @Update
  • 查询

    • @Select

    • 有返回值

      • 单条
        • 实体类对象
      • 多条
        • 集合
    • 数据封装

      • 实体类属性名 和 数据库查询返回的字段名 一致,mybatis会自动封装,不一致的字段则不会。

      • 图解

        image-20241129170456443

      • 解决方案

        • 方案一(不推荐)

          • 给字段起别名,使其与实体类属性名一致

            image-20241129170706531

        • 方案二(不推荐)

          • 通过注解@Results,手动映射封装

        • 方案三(强烈推荐)

          • 开启mybatis的驼峰命名的自动映射开关
            • 用cam关键字来提示
            • mybatis.configuration.map-underscore-to-camel-case=true
    • 条件查询

      • 需求

        • 模糊查询、精确查询、范围查询、排序,分页
      • 模糊查询

        • 法一

          like '%${ name }%'  
          
        • 法二(推荐)

          like concat('%' , #{ name } , '%') 
          

XML映射文件

  • 规范

    • 同包同名
      • XML映射文件和Mapper接口同名,且在相同包下
    • namespace属性一致
      • XML映射文件中namespace的值为Mapper接口包的全限定名(复制类名的引用)
    • sql语句id一致,返回类型一致
      • XML映射文件中sql语句的id的值与Mapper接口中的方法一致,返回类型也一致
      • 返回类型resultType为单条记录的返回值类型(用全限定名)
  • 步骤

    • 创建XML文件(目录分隔)

    • 约束

    • 上网查

          <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">```
    • sql语句按照规范写

  • 用法

    • 简单操作用注解,复杂操作用XML

动态SQL

  • <if>

    • <where>+<if>

      • 根据一个或多个字段动态查询
      • <where>
        • 可以自动去除子句开头的AND和OR
    • <set>+<if>

      • 动态更新数据
    • <set>

      • 可以自动去除额外的逗号
    • 格式

              <where><if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}order by update_time desc</where>
      
  • <foreach>

    • 参数

      • collection
        • 遍历的集合
      • item
        • 遍历出来的元素
      • separator
        • 分隔符
      • open
        • 遍历开始前拼接的sql片段
      • close
        • 遍历结束后拼接的sql片段
    • 格式

                delete from emp where id in <foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
      
      • sql片段相当于:in (id1 , id2 , id3)

      • 注意

        • 批量处理数据的数组封装

          List<Integer> ids = Arrays.asList(id1,id2,……); 
          
  • <include> + <sql>

    • <sql>
      • 定义可重复用的sql片段
        • <sql id=""></sql>
      • 用于Select片段的抽取
    • <include>
      • 通过属性refid,指定包含的sql片段
        • < include refid="sql的id" />

开发案例

开发规范

  • REST风格
    • http请求操作
      • GET查询、POST新增、PUT更新、DELETE删除
      • 注解@GetMapper、@PostMapper……
      • 代码简化:
        • 路径的公共部分抽取到类上
          • @RequestMapping("/")
    • 统一响应结果
      • Result

输出结果(用日志的方法)

  • 加注解@Slf4j
    • log.info("输出内容")

开发流程

  • 明确需求
    • 接口文档
      • 思路分析
        • 接口开发

接口调试

  • postman调试
    • 前后端联调

开发常用操作

  • 分页查询

    • PageHelper插件
  • 批量删除

    • 遍历
  • 文件上传

    • 前端页面三要素

      • type="file"

      • method="post"

      • enctype="multipart/form-data"

      • 后端的书写

        public Result upload(String username , Integer age, MultipartFile image)  
        
    • 存储方案

      • 本地存储(不推荐用)

        • image.transferTo(File)

          • 构造唯一文件名

            • UUID.randomUUID().toString()
          • 配置上传文件大小限制

            • 关键词multipart

              #配置单个文件上传大小限制
              spring.servlet.multipart.max-file-size=10MB#配置单个请求最大大小的限制(上传多个文件的总大小)
              spring.servlet.multipart.max-request-size=100MB
              
          • 缺点:

            • 无法在浏览器中直接访问文件
            • 磁盘容量有限
            • 磁盘损坏导致的文件丢失
      • 云存储(阿里云oss)(推荐)

        • 创建bucket
          • 获取AccessKey
            • 参照官方SDK编写程序
        • 集成
          • 创建阿里云工具类并放入IOC容器管理
            • 依赖注入并调用工具类实现文件上传
          • 参数配置法
            • 配置文件中配置工具类信息来优化代码
              • 利用注解@Value("${参数}")
          • yml配置法(常用)
            • 对象/Map集合
            • 数组/List/Set集合
            • 利用注解@ConfigurationProperties(prefix = "aliyun.oss")
              • 注意另建一个properties类
  • 登录功能(登录校验)

    • 登录标记

      • 会话技术
        • 概念
          • 会话
            • 打开浏览器访问Web服务器资源,会话建立,直到有一方断开,会话结束
            • 一次会话可以有多次请求响应
          • 会话跟踪
            • 服务器识别多次请求是否来自于同一个服务器
            • 同一次会话的多个请求中共享数据
        • 会话跟踪技术
          • Cookie
            • HTTP请求头:Cookie
            • HTTP响应头:Set-Cookie
            • 缺点
              • Cookie不能跨域
                • 跨域: 协议、ip/域名、端口号有一点不同则跨域
              • 移动端不能使用Cookie
              • 用户可以自己禁用Cookie
          • Session
            • 响应头
              • Set-Cookie:JSESSIONID=?
            • 请求头
              • Cookie:JSESSIONID=?
            • 通过JSESSIONID在众多的session对象中找到符合ID的一个
            • 缺点
              • 服务器集群环境下无法直接使用session
              • Cookie的缺点
          • 令牌技术(推荐)
            • JWT令牌(JSON Web Token)
      • JWT令牌
        • 概念
          • 简洁、自包含的格式,将JSON数据格式封装为安全信息
          • 采用Base64编码方式
        • 组成
          • Header(头)
            • 签名算法
            • 令牌类型
          • Payload(有效载荷)
            • 自定义信息
            • 默认信息
          • Signature(签名)
            • 防止Token被篡改
            • Header+Payload+指定秘钥----> 通过签名算法----->计算而来
        • 登录认证
          • 登录成功后生成令牌
            • 返回给前端服务器
              • 请求响应时: 统一拦截+校验令牌
        • JWT-生成
          • 引入依赖
            • jjwt
          • 调用JWT的API
            • 利用链式编程
        • JWT-校验
          • 统一拦截时进行
    • 统一拦截

      • 过滤器(Filter)

        • 概念

          • 把对资源的请求拦截下来
        • 入门

          • 定义Filter
            • 实现Filter接口,重写方法
          • 配置Filter
            • 加注解@WebFilter(urlPatterns="/"),配置拦截资源的路径
            • 启动类加注解@ServletComponentScan,支持Servlet组件
        • 拦截

          • 具体路径的拦截
            • /Path
          • 目录拦截
            • /dir/*
          • 拦截所有
            • /*
        • 执行流程

          • 放行之前的逻辑
          • 放行
            • chain.doFilter()
          • 放行之后的逻辑
        • 过滤器链

          • 配置多个过滤器
          • 过滤器执行顺序按类名(字符串)的自然排序
        • 登录校验流程

          image-20241129172449982
      • 拦截器

        • 概念

          • 动态拦截方法调用
          • 指定方法的调用前后,根据预设的代码拦截请求
        • 入门

          • 定义拦截器
            • 1.实现HandlerInterceptor接口,重写方法
            • 2.@Component放入IOC容器
          • 注册拦截器
            • 1.实现WebMvcConfigurer接口,重写addInterceptors方法
            • 2.注解@Configuration声明配置类
            • 3.容器注入@Autowired
            • 4.拦截资源(/**代表所有)
        • 拦截路径配置

          • addPathPattern (拦截路径)
          • excludePathPattern(排除拦截路径)
          • /*
            • 一级路径
              • /emps /depts /login
          • /**
            • 任意级路径
              • /emps /emps/1 /depts/2
          • /dir/*
            • dir下的一级路径
          • /dir/**
            • dir下的任意级路径
        • 执行流程

          image-20241129172937666

        • 与过滤器的区别

          • 过滤器会拦截所有资源,拦截器则拦截进入spring环境中的资源
          • 实现接口不一样
  • 异常处理

    • 全局异常处理器
      • @RestControllerAdvice
      • @ExceptionHandler(Exception.class)
        • 捕获全局异常

事务管理

@Transactional

  • spring事务管理注解
  • 在执行多次业务访问的操作的业务方法上添加注解
  • 默认运行时异常会回滚

配置文件中开启事务管理日志

rollbackFor

  • 所有异常都会出现事务回滚
  • @Transactional(rollbackFor = Exception.class)

propagation

  • 事务传播行为
  • 事务属性
    • REQUIRED
    • REQUIRES_NEW
      • 不希望事务之间相互影响时可使用

AOP

概念

  • Aspect Oriented Programming(面向切面编程)
    • 面向方法编程

本质

  • 动态代理

入门

  • 导入依赖

  • 定义AOP类:加注解@Aspect

  • 代理哪些方法:加注解@Around

    • 切入点表达式

    • 示例

      @Around("execution(* com.ezan.service.*.*(..))")  
      

核心概念

  • 连接点(joinPoint)
    • 可以被AOP控制的方法
  • 通知(Advice)
    • 这些方法要实现的共性功能
  • 切入点(PointCut)
    • 匹配连接点的条件,指明AOP要控制哪些方法
  • 切面(Aspect)
    • 通知+切入点
  • 目标对象(Target)
    • 通知所应用的对象

通知

  • 通知类型
    • @Around
    • 其他类型通知
      • @Before
      • @After
      • ……
  • 通知顺序
    • 法一
      • 与类名的命名自然排序有关
    • 法二
      • 加注解@Order(数字)
        • 数字越小越先执行

切入点表达式

  • 抽取切入点表达式
    • @PointCut("execution")
      • public void pt(){}
  • 通配符号
    • *
      • 单个独立的任意符号
        • eg :一个层级的任意包
    • ..
      • 多个连续的任意符号
        • eg:任意个层级的任意包
  • execution(访问修饰符 返回值 包名.类名.方法名(方法参数) throws 异常)
    • 访问修饰符、包名类名、异常可以省略
  • @annotation(某个注解的全类名) 【推荐】
    • 通过注解的方式来匹配切入点方法
    • 作用于 标识了某个注解的方法上(某个注解需要自定义)

连接点

  • 获取连接点信息

SpringBoot原理

配置优先级

  • 配置属性
    • 命令行参数(--)
    • java系统属性(-D)
  • 配置文件 (优先级从高到低 )
    • properties
    • yml
    • yaml

Bean管理

  • 获取bean

    • 获取名称

      applicationContext.getBean("name")  
      
    • 获取类型

      applicationContext.getBean(value)  
      
    • 获取类型和mingc

      applicationContext.getBean("name",value) 
      
  • bean作用域

    • singleton
      • 单例
    • prototype
      • 非单例
    • 注解@Lazy
      • 延迟初始化bean实例对象,当第一次使用bean时才初始化
    • 注解Scope("作用域")
      • 配置类的作用域
  • 第三方bean

    • 注解@Bean
      • 声明第三方bean
      • 注意:第三方bean对象(非自定义)无法用@Component只能用其衍生注解@Bean
      • 如果第三方bean还需要依赖其他的bean对象,则直接在bean定义方法中设置形参(其他的bean对象作为方法形参)
    • 第三方bean集中管理
      • 管理第三方bean对象,需集中分类配置,创建配置类,用@Configuration声明配置类

SpringBoot原理

  • 起步依赖

    • 原理
      • maven的依赖传递
  • 自动配置

    • 原理
    • @Import 导入
      • 普通类
      • 配置类
      • ImportSelector 接口实现类
        • String[] selectImports()
          • 封装一些类的全类名
      • @EnableXxxx注解(推荐)
  • 源码跟踪

    • @SpringBootApplication
      • @EnableAutoConfiguration
        • @Import
          • String[] selectImports()

            • 下面这个文件中自动配置了一些类的全类名

              image-20241129173627900

              • @Bean
                • 由bean注解声明一个个bean对象
              • @Conditional
                - 满足一定条件后才会注入IOC容器中(条件装配)
                - 衍生的大量子注解
                • @ConditionalOnClass(name="全类名")
                  • 判断环境中是否存在该全类名的类(是否存在字节码文件)
                • @ConditionalOnMissingBean
                  • 不存在该类型的bean,才会将bean加入IOC容器
                • @ConditionalOnProperty(name="" , havingValue="")
                  • 配置文件中是否存在对应的属性与值,存在才会加入IOC容器
  • 自定义starter

    • starter模块
      • 依赖管理功能
      • 引入autoconfigure依赖
    • autoconfigure模块
      • 自动配置功能
      • 自定义自动配置类,并且放入自动配置文件中(META-INF/spring/xxxx.imports)

后端技术总结

SpringBoot开发框架

image-20241129173715536

概念区别

  • Javaweb

    • 过滤器、会话技术(Cookie、Session)
  • 解决方案

    • JWT,阿里云OSS
  • SSM框架

    • SpringMVC
      • 拦截器、全局异常处理、接受请求、响应数据
    • Spring framework
      • IOC、DI、AOP、事务管理
    • Mybatis
      • 在DAO层操作数据库
  • SpringBoot

概念一览图

image-20241129174055811

  • SpringMVC是Spring framework的一种

思维导图版本

XMind文件链接:

https://github.com/Ezan-p/JavaWeb/blob/main/JavaWeb.xmind

声明

  • 基于“黑马程序员JavaWeb视频课程”的个人学习总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电话号码的字母序列

题目描述 输入一个仅包含数字 2-9 的字符串,输出所有它能表示的字母序列。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。输入 输入一个包含数字 2-9 的字符串,长度不超过6。 输出 按字典序输出所有能表示的字母序列,每行输出一个。 输入样例 23输出…

IDEA-idea设置导航栏字体大小代码编辑区字体大小

一、设置导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font二、设置代码编辑区字体大小 Setting - Font - Size

Pycharm-Pycharm设置左侧导航栏字体大小和代码编辑区字体大小

一、左侧导航栏字体大小 Setting - Appearance & Behavior - Appearance - Use custom font - Size二、代码编辑区字体大小

DevEco Studio 实战第一节:字符串拼接与组件构建

DevEco Studio 实战第一节:字符串拼接与组件构建 引言 在现代软件开发中,TypeScript 提供了强类型的优势,而 DevEco Studio 作为华为推出的开发集成环境,提供了便捷的代码管理和版本控制功能。本文将通过一个简单的示例,介绍如何在 TypeScript 和 DevEco Studio 中进行字符…

WIN11任务栏右下角wifi、音量、电源三个模块无法弹窗

在平时使用win11电脑时候偶发WIN11任务栏右下角wifi、音量、电源三个模块无法弹窗的问题,一般重启后恢复正常,还有一种方法,打开任务管理器,找到Windows资源管理器选择重新启动,之后就恢复正常啦!代码成就万世基积沙镇海 梦想永在凌云意意气风发

【泛微E9】移动应用将页面按钮置灰

效果如下:实现方法: $load(function() {setTimeout(function() {var kpbm = $f("kpbm").val();var zcbm = $f("zcbm").val();const date = new Date();const year = date.getFullYear();const month = String(date.getMonth() + 1).padStart(2, 0); // 月…

超详细 HarmonyOS 开发教程之开发环境搭建指南

HarmonyOS开发环境搭建指南:DevEco Studio安装教程 一、系统要求 操作系统:Windows 10 64位或更高版本 RAM:至少8GB,推荐16GB 硬盘空间:至少10GB可用空间 处理器:Intel Core i5或更高配置 二、安装步骤 1. 下载DevEco Studio 2. 访问华为开发者联盟官网:https://develop…

用SS8050三极管实现一个开关功能,并测试集电极工作电流

测试一个简单的三极管开关电路原理图如图用一个SS8050三极管当作开关,控制小灯泡的亮灭,可调电阻调节偏置电压的大小来控制基极电流,分别接上A1和A2来测量基极电流和集电极电流实际工作时,电阻要调到10k,此时A1=406uA,A2=120.8mA三极管的放大倍数测量值为295,以上计算得…

基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR

1.算法仿真效果vivado2019.2仿真结果如下:设置SNR=20db设置SNR=15db设置SNR=10db2.算法涉及理论知识概要在现代通信系统中,数字调制技术被广泛应用于无线通信、卫星通信以及有线通信等领域。其中,振幅键控(Amplitude Shift Keying, ASK)是一种简单的数字调制方式,通过改变…

“4步实现”CAD模型与实物以图搜图的精准匹配,“6倍效率提升”机械加工比对

在机械制造与加工领域,设计图纸与实物的比对是确保产品质量的重要环节。然而,传统比对方式耗时长、易出错,严重影响生产效率。针对这一痛点,思通数科推出了一套基于大模型技术的智能比对系统,集成以图搜图、实物比对和多视图生成等功能,为用户带来高效、精准的解决方案。…

大数据学习记录,Python基础(3)

算术运算符a = 3 b = 4 print(a + b) # 7 print(a - b) # -1 print(a * b) # 12 print(a / b) # 0.75 print(a % b) # 3 print(a ** b) # 81 print(a // b) # 0 整除比较(关系)运算符注意:=是赋值运算符,==是比较运算符 比较运算符的结果一定是bool类型的扩展知识:比较两个…

ECharts 实战

EChart 资源Vue-EChart 不想封装 Echart, 可以选用这种方案。 Vue-ECharts 是一个 Vue 组件,旨在简化在 Vue 应用中集成 ECharts 的过程。它封装了 ECharts 的初始化和使用逻辑,用户只需要在 Vue 模板中添加组件并传递相应的 props,即可轻松创建图表。 支持Vue2 & Vue3…