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}
相关推荐
SL_staff2 分钟前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程1 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff1 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
IDEA:Command line is too long
java·ide·intellij-idea
步行cgn1 小时前
Spring p 命名空间注入详解
java·前端·spring
YatHinLay2 小时前
MyBatis 流式查询实战:ResultHandler 处理海量数据
java
天天被压力2 小时前
【跨市场数据实战 #08】可转债折价机会怎么筛:3个接口抓比价、列表和实时盘口
java·人工智能·python
张某布响丸辣3 小时前
附件下载的安全边界:路径白名单、NAS 哨兵文件与 Redis Lua 一次性令牌
java·redis·redis lua·nas哨兵
YatHinLay3 小时前
Spring Boot + Calcite 实现跨库查询
java
酷炫码神4 小时前
MosMos 创意效果与能力边界展示
java