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 数量过多(AddServlet、DeleteServlet、SelectAllServlet等),不利于管理和维护。

优化方案:

将同一实体的操作方法归到一个 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}
相关推荐
小师兄吃牛肉11 分钟前
Java语法 | 多重循环
java·开发语言·python
Han.miracle25 分钟前
MySQL InnoDB:MVCC、记录锁、间隙锁、二级索引MVCC底层原理
java·开发语言
不停喝水1 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
y1su1 小时前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
霸道流氓气质1 小时前
多Agent通信机制与协议设计完全指南:从FIPA-ACL到A2A/MCP的Java生产级实战
java·开发语言
007张三丰1 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·c语言·c++·内存管理
骇客野人2 小时前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质2 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_587383002 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析