欢迎光临
我们一直在努力

JavaWeb(3)-后端web实战

语雀链接

https://www.yuque.com/yulia-i7t01/qt2ypb/etx8fylzbhvx78aq?singleDoc# 《后端web实战》

Tlias智能学习辅助系统

部门管理

准备工作

Apifox

介绍:Apifox是一款集成了Api文档、Api调试、ApiMock、Api测试的一体化协作平台。

作用:接口文档管理、接口请求测试、Mock服务。

官网:https://apifox.com/

查询部门

接口开发

  • @Autowired:Spring 的自动注入注解,作用是让 Spring 自动创建DeptService的实例对象,并赋值给deptService变量(无需手动new对象,是 Spring “依赖注入” 特性的体现);
  • Result:方法的返回值类型,Result是自定义的统一响应类(用于封装接口的返回结果,通常包含 “状态码、提示信息、数据” 三部分);
  • list():方法名,代表 “查询列表” 的功能;方法无参数(因为是查询全部部门,不需要前端传参)。
  • System.out.println("查询全部部门数据");:在服务器控制台打印日志,用于开发阶段调试(方便确认方法是否被触发);
  • List<Dept> deptList = deptService.findAll();:
  • List<Dept>:定义一个 “Dept 类型的集合” 变量deptList,用于存储查询到的所有部门数据;
  • deptService.findAll():调用服务层DeptService的findAll()方法,获取数据库中所有部门的列表数据;
    • return Result.success(deptList);:
  • 调用自定义Result类的success静态方法,将查询到的部门列表deptList作为 “响应数据” 传入;
  • 该方法会返回一个包含 “成功状态码、提示信息、部门数据” 的Result对象,最终被@RestController转换为 JSON 格式返回给前端。
  • ·方式一:手动结果映射-通过@Results及@Result进行手动结果映射

    ·方式二:起别名-在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样

    ·方式三:开启驼峰命名-如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射

    前后端联调测试

    ·反向代理

    反向代理是一种网络架构,通过代理服务器为后端的服务器做代理,客户端的请求直接请求代理服务器,然后转发给后端的服务器。(安全、灵活、负载均衡)

    1.location:用于定义匹配路径匹配的规则。

    2.^~/api/:表示精确匹配,即只匹配以/api/开头的路径。

    3.rewrite:该指令用于重写匹配到的路径。

    4.proxy_pass:该指令用于代理转发,它将匹配到的请求转发给位于后端的指令服务器。

    删除部门

    (不推荐)

    方式二:通过@RequesttParam注解进行参数绑定

    推荐方式:如果请求参数名与形参变量名相同,直接定义方法形参即可接收

    新增项目

    修改部门

    查询回显

    @PathVariable("id"):Spring 的注解,作用是将路径中{id}对应的参数值,自动赋值给deptId变量;

    修改数据

    @Override —— “我是照着接口的要求写的方法”

    • 大白话:这是一个 “标记注解”,告诉 Java 编译器:“下面这个update方法,不是我随便写的,是照着DeptService接口里定义的update方法来写的”。

    日志技术

    Logback:在springboot项目中logback依赖已传递

    logback.xml

    ·常用的两种输出日志的位置:控制台、系统文件

    ·开启日志(ALL),关闭日志(OFF)

    日志级别

    员工管理

    分页查询

    代码实现

    起始索引=(页码-1)*每页展示记录数

    PageHelper分页插件

    注意事项:

    ·定义的SQL语结尾不能加分号

    ·PageHelper仅仅能对紧跟在其后的第一查询语句进行分页处理

    条件分页查询

    基本实现

    通过@DateTimeFormat解决了 “前端字符串日期→后端日期类型” 的自动转换问题;

    程序优化

    如果controller方法的参数较多,且未来可能继续增加,这会使得方法签名变得复杂难以维护,此时可以考虑将多个请求参数封装为一个对象。

    <if>:判断条件是否成立,如果条件为true,则拼接SQL。

    <where>:根据查询条件,来生成where关键字,并会自动去除条件前面多余的and或or。

    新增员工

    保存员工基本信息

    批量保存员工工作经历

    <foreach>属性说明:

    1.collection:集合名称

    2.item:集合遍历出来的元素/项

    3.separator:每一次遍历使用的分隔符

    4.open:遍历开始前拼接的片段

    5.close:遍历结束后拼接的片段

    • collection="exprList":指定要遍历的集合是exprList(这个集合是 Mapper 接口方法传入的参数,比如List<EmpExpr> exprList);
    • item="expr":遍历集合时,当前元素的变量名是expr(后续通过#{expr.empId}取该元素的empId属性);
    • separator=",":每遍历生成一个数据片段后,在后面加一个逗号(用于分隔多条values数据)。

    删除员工

    ·删除单条数据其实是一种特殊的批量删除

    SQL语句

    三层架构需求分析

    Controller层

    @RequestParam

    ·@RequestParam = “精准接收前端 URL 里的参数”

    ·把 URL 里的参数(page/pageSize/name)精准赋值给后端方法的变量;

    ·还能设置默认值、指定是否必传,解决参数缺失的问题。

    批量删除员工信息

    批量删除员工工作经历

    修改员工

    查询回显

    ResultMap

    · MyBatis 查询数据库后,默认会把查询结果的 “字段名” 和实体类的 “属性名” 做大小写不敏感的精准匹配

    ·把数据库查询结果想象成 “快递包裹上的收件人信息(地址写的是‘北京市朝阳区’)”,实体类是 “你的收货地址表单(字段叫‘详细地址’)”:

    ·没有 ResultMap:快递员只会按 “名字一模一样” 填信息,“朝阳区” 没法对应到 “详细地址”;

    ·有 ResultMap:你给快递员一张 “规则表”,写着 “包裹上的‘地址’填到表单的‘详细地址’里”,快递员就能精准填对。

    Mybatis中封装查询结果,什么时候用 resultType,什么时候用resultMap?

    如果查询返回的字段名与实体的属性名可以直接对应上,用resultType。

    如果查询返回的字段名与实体的属性名对应不上,或实体属性比较复杂,可以通过resultMap手动封装。

    修改数据

    @RequestBody

    ·@RequestBody = “自动把前端传的 JSON 数据,转成后端的 Java 对象”

    Spring MVC 中接收前端传入的 JSON 格式请求体的核心注解

    Arrays.asList(…):将单个 ID 转换为List集合

    rollbackFor = Exception.class:指定 “只要发生任何异常,就回滚事务”

    程序优化(动态更新 )

    <!–set标签:会自动生成set关键字;会自动的删除掉更新字段后多余,–>

    事务管理

    介绍&操作

    事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。

    默认MySQL的事务是自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

    Spring事务管理

    控制事物

    ·注解:@Transactional

    ·作用:将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

    ·位置:业务(service)层的方法上、类上、接口上

    插件

    rollbackFor

    ·事务管理-默认出现运行时异常RuntimeException才会回滚

    ·用于控制出现何种异常可以回滚

    propagation

    ·事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。

    四大特性

    文件上传

    本地存储

    1.如何将上传的文件存储在服务器本地?

    .multipartFile.getoriginalFilename():获取原始文件名

    . multipartFile.transferTo(File dest):将文件转存到磁盘文件

    2.上传文件大小受限怎么办?

    .默认上传文件的最大大小为1MB,超过大小需要在配置文件配置

    阿里云OSS

    对象存储OSS(Object Storage Service)

    第三方服务-通用思路

    准备工作-参照官方SDK(软件开发工作包)编写入门程序-集成使用

    @Autowired = “自动找对象并塞给你”

    @Autowired是 Spring 框架的核心注解,作用是:让 Spring 自动帮你创建 / 找到需要的对象,然后赋值给你定义的变量,不用你自己手动写new去创建对象。

    参数配置化

    ·指将一些需要灵活变化的参数,配置在配置文件中,然后通过@Value注解来注入外部配置的属性

    @Value

    ·是 Spring 框架的注解,作用是把配置文件里的参数值,自动赋值给代码里的变量,相当于 “从配置文件里读数据并填到变量里”。 【 把application.properties(Spring Boot 的配置文件)想象成 “公司的规章制度手册”,@Value就是 “帮你从手册里找到对应的规定,然后告诉你”: 】

    ·一个属性一个属性的注解

    @ConfigurationProperties

    ·@ConfigurationProperties是 Spring Boot 中批量读取配置文件并封装成对象的注解,比@Value更适合 “读取多个相关配置” 的场景,

    · 核心作用:“把配置文件里的一组相关参数,自动打包成一个对象”

    · 如果配置文件里有多个同业务的配置项(比如 “阿里云 OSS 存储” 的多个参数),用@Value需要逐个写注解,而@ConfigurationProperties可以 “一次性把这些参数打包成一个对象”,更简洁。

    异常处理

    全局异常处理器

    String message = e.getMessage(); // 获取原始异常信息

    int i = message.indexOf("Duplicate entry"); // 找到异常信息的起始位置

    String errMsg = message.substring(i); // 截取从“Duplicate entry”开始的内容

    String[] arr = errMsg.split(" "); // 按空格分割字符串

    @RestControllerAdvice

    @RestControllerAdvice是 Spring 的注解,作用是标记一个 “全局异常处理类”,这个类里可以写多个 “处理不同异常的方法”,负责接住整个项目里所有 Controller 抛出的异常。

    如果没有@RestControllerAdvice:

    • 每个 Controller 的每个方法里,都得写try-catch处理异常,代码会超级冗余(比如 10 个接口就要写 10 次try-catch);

    所有异常 “集中处理”,代码只写一次,全项目能用;异常提示统一、友好,用户体验更好。

    @ExceptionHandler

    @ExceptionHandler是 Spring 的注解,作用是标记在方法上,指定这个方法专门处理 “某一种异常”(比如专门处理 “数据库唯一键冲突异常”、“参数格式错误异常”)。

    @ExceptionHandler不能单独用,必须 “放在@RestControllerAdvice标记的类里”—— 相当于 “专科医生必须在急救站里上班,不能自己单独行医”。

    @RestControllerAdvice是 “全局异常处理中心的牌子”,@ExceptionHandler是 “中心里的专科医生”—— 两者配合,把项目里所有异常集中接住,转成用户能懂的提示,同时记录日志方便开发排查,是后端项目 “稳定运行 + 友好交互” 的必备配置。

    员工信息统计

    @NoArgsConstructor

    ·给类自动生成一个没有任何参数的构造方法(即public 类名())。

    ·很多框架(比如 Spring、MyBatis)创建对象时,默认需要 “无参构造方法”

    @AllArgsConstructor

    ·给类自动生成一个包含所有属性作为参数的构造方法(参数顺序和类中属性定义顺序一致)

    · 创建对象时可以 “一次性给所有属性赋值”,不用写一堆setXxx()方法:

    依赖 Lombok:这两个注解是 Lombok 提供的,需要在项目中引入 Lombok 依赖才能生效;

    这两个注解经常一起用(既有无参构造满足框架需求,又有全参构造方便创建对象)。

    Case函数

    ·CASE 函数 = SQL 里的 “如果… 就…”

    ·CASE函数是 SQL 中的 “条件判断工具”,相当于编程里的if-else/switch,能根据不同条件给字段返回不同的值,解决 “按规则转换数据” 的需求。

    单条件匹配

    多条件判断

    职位统计

    性别统计

    登录认证

    会话技术

    ·会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

    ·会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。

    ·会话跟踪方案:

    ·客户端会话跟踪技术:Cookie

    ·服务端会话跟踪技术:Session

    ·令牌技术

    ·跨域区分三个维度:协议、IP/域名、端口

    JWT令牌

    ·全称:JSoN Web Token (https://jwt.io/)

    ·定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。

    ·组成:

    >第一部分:Header(头),记录令牌类型、签名算法等。例如:{"alg":"HS256","type":"JWT"}

    >第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

    >第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload融入,并加入指定秘钥,通过指定签名算法计算而来。

    Base64:是一种基于64个可打印字符(A-Z a-z 0-9 +/)来表示二进制数据的编码方式。

    JWT令牌由哪几个部分组成,每个部分都存储什么内容?

    ·header(头),记录令牌类型、签名算法

    ·payload(载荷),携带一些自定义的信息

    ·signature(签名),访问被篡改,保证安全性

    JWT令牌生成及校验?

    Jwts.builder()…

    Jwts.parser()…

    JWT令牌解析(校验)时什么情况会报错?

    JWT令牌被篡改或过期失效了

    注意事项

    JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的

    过滤器(Filter)

    ·概念:Filter过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

    ·过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

    ·过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

    1.Filter的开发步骤?

    定义:定义一个类实现Filter接口(init、doFilter、destroy)

    配置:

    @WebFilter(urlPatterns="/*")

    @ServletcomponentScan

    2.注意事项

    如果过滤器中不执行放行操作,过滤器拦截到请求之后,就不会访问对应的资源。

    放行:chain.doFilter(request,response)

    令牌校验Filter

    拦截路径

    过滤器链

    Interceptor拦截器

    “Spring 的配置说明书”

    @Configuration是 Spring 框架的核心注解,标记在类上,告诉 Spring:“这个类是一个‘配置类’,里面写了创建对象、配置功能的规则,你要按照这个类里的规则来创建和管理对象”。

    日志管理

    赞(0)
    未经允许不得转载:171主机测评 » JavaWeb(3)-后端web实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址