javaweb--16

一、核心功能流程解析

1. 查询所有品牌

流程

  1. 前端 brand.html 加载完成后发送异步请求
  2. 后端 SelectAllServlet 调用 BrandService.selectAll()
  3. BrandService 调用 BrandMapper.selectAll() 查询数据库
  4. List<Brand> 转为 JSON,响应给前端

2. 新增品牌

流程

  1. 前端提交表单数据,发送异步请求
  2. 后端 AddServlet 接收品牌数据,调用 BrandService.add()
  3. BrandService 调用 BrandMapper.add() 插入数据库
  4. 响应成功标识给前端,关闭窗口并刷新列表

3. 批量删除品牌

流程

  1. 前端点击批量删除按钮,发送选中的 ID 数组
  2. 后端 BrandServlet 接收 ID 数组,调用 BrandService.deleteByIds()
  3. BrandService 调用 BrandMapper.deleteByIds(int[] ids)
  4. MyBatis 通过 <foreach> 标签实现批量删除 SQL:delete from tb_brand where id in (?,?,?)

4. 分页查询

前端传递参数

  • currentPage:当前页码
  • pageSize:每页显示条数

后端返回数据

  • List rows:当前页数据列表
  • int totalCount:总记录数(封装在 PageBean 中)

流程

  1. 前端发送异步请求,携带分页参数
  2. BrandServlet 接收参数,调用 BrandService
  3. BrandService 计算开始索引 begin = (currentPage-1)*pageSize,调用 BrandMapper.selectByPage(begin, pageSize)selectTotalCount()
  4. 封装 PageBean 对象,转为 JSON 响应给前端

5. 条件分页查询

在分页查询基础上增加查询条件(如品牌名称、企业名称、状态):

  1. 前端绑定查询条件对象,点击查询按钮发送请求
  2. BrandServlet 接收分页参数 + 条件对象,调用 BrandService
  3. BrandService 调用 BrandMapper.selectByPageAndCondition(begin, pageSize, brand)selectTotalCount(brand)
  4. 封装带条件的 PageBean,响应给前端

二、Servlet 代码优化

问题:

Web 层 Servlet 数量过多(AddServletDeleteServletSelectAllServlet等),不利于管理和维护。

优化方案:

将同一实体的操作方法归到一个 Servlet 中(如 BrandServlet),通过路径匹配 + 反射调用对应方法。

1. 优化前 vs 优化后

表格

优化前 优化后
每个操作一个 Servlet 一个实体一个 Servlet(如 BrandServlet
类多、管理复杂 类少、按实体归类,结构清晰
2. 核心实现代码

java

运行

复制代码
@WebServlet("/brand/*")
public class BrandServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 获取请求路径最后一段,作为方法名
        String path = request.getPathInfo(); // 如 /selectAll、/add
        String methodName = path.substring(1); // 去掉/,得到方法名
        
        try {
            // 2. 通过反射获取方法对象并执行
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 品牌相关操作方法
    public void selectAll(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 查询所有逻辑
    }

    public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 新增品牌逻辑
    }

    public void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 修改品牌逻辑
    }

    public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 删除品牌逻辑
    }
}
3. 请求路径映射
  • http://localhost:8080/brand-case/brand/selectAll → 调用 selectAll() 方法
  • http://localhost:8080/brand-case/brand/add → 调用 add() 方法

三、关键知识点总结

  1. 三层架构分工

    • Web 层(Servlet):接收请求、参数处理、响应结果
    • Service 层:业务逻辑处理,调用 Dao 层
    • Dao 层(Mapper):数据库交互,执行 SQL
  2. 分页查询核心公式

    • begin = (currentPage - 1) * pageSize
    • totalPage = totalCount % pageSize == 0 ? totalCount/pageSize : totalCount/pageSize + 1
  3. 批量删除 MyBatis 实现

    xml

    复制代码
    <delete id="deleteByIds">
        delete from tb_brand where id in
        <foreach collection="ids" item="id" open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>
  4. 条件查询动态 SQL

    xml

    复制代码
    <select id="selectByPageAndCondition" resultType="Brand">
        select * from tb_brand
        <where>
            <if test="brand.brandName != null and brand.brandName != ''">
                and brand_name like concat('%', #{brand.brandName}, '%')
            </if>
            <if test="brand.companyName != null and brand.companyName != ''">
                and company_name like concat('%', #{brand.companyName}, '%')
            </if>
            <if test="brand.status != null">
                and status = #{brand.status}
            </if>
        </where>
        limit #{begin}, #{size}
相关推荐
二哈赛车手6 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~7 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8297 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
未若君雅裁9 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记10 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding11 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构
小小编程路11 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇11 小时前
linux 检索库 判断库是否支持
java·linux·服务器