一、核心功能流程解析
1. 查询所有品牌
流程:
- 前端
brand.html加载完成后发送异步请求 - 后端
SelectAllServlet调用BrandService.selectAll() BrandService调用BrandMapper.selectAll()查询数据库- 将
List<Brand>转为 JSON,响应给前端
2. 新增品牌
流程:
- 前端提交表单数据,发送异步请求
- 后端
AddServlet接收品牌数据,调用BrandService.add() BrandService调用BrandMapper.add()插入数据库- 响应成功标识给前端,关闭窗口并刷新列表
3. 批量删除品牌
流程:
- 前端点击批量删除按钮,发送选中的 ID 数组
- 后端
BrandServlet接收 ID 数组,调用BrandService.deleteByIds() BrandService调用BrandMapper.deleteByIds(int[] ids)- MyBatis 通过
<foreach>标签实现批量删除 SQL:delete from tb_brand where id in (?,?,?)
4. 分页查询
前端传递参数:
currentPage:当前页码pageSize:每页显示条数
后端返回数据:
List rows:当前页数据列表int totalCount:总记录数(封装在PageBean中)
流程:
- 前端发送异步请求,携带分页参数
BrandServlet接收参数,调用BrandServiceBrandService计算开始索引begin = (currentPage-1)*pageSize,调用BrandMapper.selectByPage(begin, pageSize)和selectTotalCount()- 封装
PageBean对象,转为 JSON 响应给前端
5. 条件分页查询
在分页查询基础上增加查询条件(如品牌名称、企业名称、状态):
- 前端绑定查询条件对象,点击查询按钮发送请求
BrandServlet接收分页参数 + 条件对象,调用BrandServiceBrandService调用BrandMapper.selectByPageAndCondition(begin, pageSize, brand)和selectTotalCount(brand)- 封装带条件的
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()方法
三、关键知识点总结
-
三层架构分工:
- Web 层(Servlet):接收请求、参数处理、响应结果
- Service 层:业务逻辑处理,调用 Dao 层
- Dao 层(Mapper):数据库交互,执行 SQL
-
分页查询核心公式:
begin = (currentPage - 1) * pageSizetotalPage = totalCount % pageSize == 0 ? totalCount/pageSize : totalCount/pageSize + 1
-
批量删除 MyBatis 实现:
xml
<delete id="deleteByIds"> delete from tb_brand where id in <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> -
条件查询动态 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}