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}
相关推荐
2301_792674861 小时前
java学习(day32)
java
摇滚侠1 小时前
Oracle19c 导出 Oracle11g 导入,Oracle19c 导出导入,Oracle11g 导出导入
java·数据库·oracle
Stella Blog1 小时前
狂神Java基础学习笔记Day05
java·笔记·学习
曹牧1 小时前
Spring WebService 的两种主流实现方式‌
java·后端·spring
pqq的迷弟1 小时前
面试整理:HashMap\ConcurrentHashMap原来
java·面试·职场和发展
用户游民1 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
花月C1 小时前
Agent应用开发零基础入门:核心概念、环境配置与首次LLM调用
java·python
曹牧1 小时前
Java Web:DispatcherServlet
java·开发语言·前端
直奔標竿1 小时前
Java开发者AI转型第二十三课!Spring AI个人知识库实战(二):异步ETL流水线搭建与避坑指南
java·人工智能·spring boot·后端·spring