基于JSP+Servlet的多商家零食销售平台 - 源码深度解析
随着互联网技术的快速发展,电子商务模式已从传统的B2C向更加多元化的B2B2C模式演进。零食行业作为快消品的重要组成部分,面临着渠道分散、信息不对称、小型商家线上运营能力不足等挑战。多商家零食集市平台应运而生,通过集中化的技术架构,为零食供应商提供统一的线上销售渠道,同时为消费者打造一站式购物体验。
本平台采用经典的J2EE MVC架构:前端使用JSP结合JSTL标签库进行页面渲染,业务逻辑层由Servlet控制器统一处理,数据持久层基于JDBC和DAO模式实现。这种分层架构确保了系统的高内聚低耦合,便于后续功能扩展和维护。
系统架构与技术栈
平台采用典型的三层架构设计,每一层都有明确的职责分工:
表示层
- 技术选型:JSP技术结合JSTL标签库和EL表达式
- 设计理念:严格的MVC分离,确保业务逻辑不侵入视图层
- 优势:动态页面渲染能力强,标签库提供丰富的页面逻辑控制
// 典型的Servlet控制器示例
@WebServlet("/product/*")
public class ProductServlet extends HttpServlet {
private ProductDAO productDAO;
@Override
public void init() throws ServletException {
productDAO = new ProductDAOImpl();
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getPathInfo();
switch (action) {
case "/list":
listProducts(request, response);
break;
case "/detail":
showProductDetail(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
private void listProducts(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String categoryId = request.getParameter("categoryId");
List<Product> products = productDAO.findByCategory(categoryId);
request.setAttribute("products", products);
request.getRequestDispatcher("/WEB-INF/views/product/list.jsp").forward(request, response);
}
}
业务逻辑层
- 核心组件:Servlet作为控制器
- 主要职责:请求路由、参数验证、业务处理和数据传递
- 模块化设计:每个功能模块都有对应的Servlet处理相关请求
数据访问层
- 设计模式:采用DAO设计模式
- 架构优势:接口与实现类分离,提供统一的数据访问接口
- 扩展性:便于切换不同的数据源实现
// 商品数据访问接口
public interface ProductDAO {
Product findById(int id);
List<Product> findByCategory(String categoryId);
List<Product> findByShop(String shopId);
void save(Product product);
void update(Product product);
void delete(int id);
}
// JDBC实现类
public class ProductDAOImpl implements ProductDAO {
private Connection getConnection() throws SQLException {
return DataSourceManager.getConnection();
}
@Override
public Product findById(int id) {
String sql = "SELECT * FROM pros WHERE id = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return mapResultSetToProduct(rs);
}
} catch (SQLException e) {
throw new RuntimeException("数据库查询失败", e);
}
return null;
}
private Product mapResultSetToProduct(ResultSet rs) throws SQLException {
Product product = new Product();
product.setId(rs.getInt("id"));
product.setProshop(rs.getString("proshop"));
product.setProname(rs.getString("proname"));
product.setPrice(rs.getString("price"));
product.setDiscount(rs.getString("discount"));
product.setFilename(rs.getString("filename"));
product.setBei(rs.getString("bei"));
product.setExtbei(rs.getString("extbei"));
product.setStatus(rs.getString("status"));
product.setSavetime(rs.getString("savetime"));
product.setCjnum(rs.getString("cjnum"));
return product;
}
}
数据库设计亮点分析
商品表(pros)设计优化
商品表作为核心业务表,其设计直接影响到系统性能和扩展性:
CREATE TABLE `pros` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`proshop` varchar(255) DEFAULT NULL COMMENT '商品店铺',
`proname` varchar(255) DEFAULT NULL COMMENT '商品名称',
`price` varchar(255) DEFAULT NULL COMMENT '商品价格',
`discount` varchar(255) DEFAULT NULL COMMENT '折扣',
`filename` varchar(255) DEFAULT NULL COMMENT '文件名',
`bei` varchar(255) DEFAULT NULL COMMENT '备注',
`extbei` varchar(255) DEFAULT NULL COMMENT '扩展备注',
`status` varchar(255) DEFAULT NULL COMMENT '状态',
`savetime` varchar(255) DEFAULT NULL COMMENT '保存时间',
`cjnum` varchar(255) DEFAULT NULL COMMENT '成交数量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'
设计亮点分析:
字段类型优化
- 价格字段采用varchar类型存储,便于处理复杂的价格格式(如区间价格、促销价等)
- 虽然在实际应用中建议使用DECIMAL类型确保精度,但varchar设计提供了更大的灵活性
扩展性设计
- 通过
bei和extbei两个备注字段,为商品信息提供了良好的扩展性 - 支持存储各种自定义属性和业务扩展需求
- 通过
状态管理机制
status字段支持商品上下架、审核等状态流转cjnum字段记录成交数量,便于实现热门商品推荐算法
商品类别表(splb)层级设计
类别表采用经典的父子层级结构,支持无限级分类:
CREATE TABLE `splb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pid` varchar(255) DEFAULT NULL COMMENT '父级ID',
`lbname` varchar(255) DEFAULT NULL COMMENT '类别名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品类别表'
层级查询优化方案:
-- 递归查询所有子类别(MySQL 8.0+)
WITH RECURSIVE category_tree AS (
SELECT id, pid, lbname, 1 as level
FROM splb
WHERE pid = '0'
UNION ALL
SELECT c.id, c.pid, c.lbname, ct.level + 1
FROM splb c
INNER JOIN category_tree ct ON c.pid = ct.id
)
SELECT * FROM category_tree ORDER BY level, id;
技术优势:
- 无限级分类支持:通过父子关系实现灵活的类别管理
- 查询性能优化:采用递归查询技术,提高层级数据检索效率
- 数据结构清晰:简单的三字段设计满足复杂的业务分类需求
这种数据库设计方案不仅满足了当前业务需求,还为未来的功能扩展预留了充足的空间,体现了良好的系统架构思维。