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}
相关推荐
咩咩啃树皮13 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚13 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白15 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司15 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地16 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415916 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风19 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898619 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112320 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员20 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus