技术栈与环境准备
- 基础技术:Servlet + JSP + JDBC
- 数据库:MySQL(示例)
- 依赖:MySQL Connector/J(驱动)、Tomcat 10+ 服务器
- 工具:Maven管理依赖(可选)
数据库设计
以商品分类表 category
为例:
CREATE TABLE category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, -- 分类名称 parent_id INT DEFAULT 0, -- 父级ID (0表示顶级分类) create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
字段说明:
id
:主键parent_id
:实现多级分类(如父级为0表示根分类)- 索引建议:为
parent_id
添加索引加速查询
后端实现(分层架构)
实体类(Model层)
public class Category { private int id; private String name; private int parentId; // getters & setters 省略 }
DAO层(数据访问)
public class CategoryDao { public List<Category> getAllCategories() throws SQLException { List<Category> list = new ArrayList<>(); String sql = "SELECT id, name, parent_id FROM category"; try (Connection conn = DataSourceUtil.getConnection(); // 自定义连接池工具 PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { Category cat = new Category(); cat.setId(rs.getInt("id")); cat.setName(rs.getString("name")); cat.setParentId(rs.getInt("parent_id")); list.add(cat); } } return list; } }
Service层(业务逻辑)
public class CategoryService { private CategoryDao categoryDao = new CategoryDao(); public List<Category> fetchAllCategories() { try { return categoryDao.getAllCategories(); } catch (SQLException e) { e.printStackTrace(); return Collections.emptyList(); // 失败返回空集合 } } }
Servlet(Controller层)
@WebServlet("/category/list") public class CategoryListServlet extends HttpServlet { private CategoryService service = new CategoryService(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Category> categories = service.fetchAllCategories(); request.setAttribute("categories", categories); // 数据传递到JSP // 转发到展示页面 request.getRequestDispatcher("/WEB-INF/jsp/category_list.jsp").forward(request, response); } }
前端展示(JSP示例)
文件路径:/WEB-INF/jsp/category_list.jsp
<%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head>商品分类列表</title> </head> <body> <h2>全部分类</h2> <ul> <c:forEach items="${categories}" var="cat"> <li>${cat.name} (ID: ${cat.id})</li> </c:forEach> </ul> </body> </html>
性能与安全优化
- 连接池:使用Tomcat JDBC Pool或HikariCP替代直连
- 防SQL注入:坚持用
PreparedStatement
- 缓存策略:
- 频繁查询的分类数据存入Redis(代码示例):
// Service层添加缓存逻辑 public List<Category> fetchAllCategories() { String cacheKey = "all_categories"; List<Category> list = redisTemplate.opsForValue().get(cacheKey); if (list == null) { list = categoryDao.getAllCategories(); // 查数据库 redisTemplate.opsForValue().set(cacheKey, list, 30, TimeUnit.MINUTES); } return list; }
- 频繁查询的分类数据存入Redis(代码示例):
- 树形结构展示:递归实现多级分类
// 递归构建树形结构 public List<Category> buildCategoryTree(List<Category> list, int parentId) { return list.stream() .filter(cat -> cat.getParentId() == parentId) .peek(cat -> cat.setChildren(buildCategoryTree(list, cat.getId()))) .collect(Collectors.toList()); }
常见问题解决
- 乱码问题:
- Servlet中加
response.setContentType("text/html;charset=UTF-8");
- JSP顶部加
<%@ page pageEncoding="UTF-8"%>
- Servlet中加
- 空指针异常:Service层返回空集合而非
null
- 跨层级查询:SQL递归查询(MySQL 8.0+ 使用
WITH RECURSIVE
)
JavaWeb种类查询的核心步骤:
- 设计合理的数据库表结构
- 遵循MVC分层:DAO操作数据库 → Service处理业务 → Servlet控制流程
- 前端JSP通过JSTL展示数据
- 优化方向:连接池、缓存、异步加载
引用说明:本文代码基于Servlet 4.0规范,数据库操作遵循JDBC标准,缓存示例采用Spring Data Redis实现,安全建议参考OWASP SQL注入防护指南,性能优化部分借鉴了《阿里巴巴Java开发手册》。
通过此实现,可快速构建高可用的种类查询功能,代码结构清晰且易于扩展至复杂业务场景。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/31671.html