基于JSP+Servlet的在线蛋糕销售平台 - 源码深度解析

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-02-114 浏览

文章摘要

本系统是一款基于JSP与Servlet技术栈构建的B2C在线蛋糕销售平台,旨在为中小型烘焙商家提供一个功能完整、易于部署和维护的线上商城解决方案。它核心解决了传统实体蛋糕店销售渠道单一、营业时间与空间受限的痛点,通过将业务迁移至线上,实现24小时不间断的商品展示、在线订购与订单管理,有效拓宽了客户来...

在传统烘焙行业数字化转型的浪潮中,中小型蛋糕店面临着实体经营模式固有的局限性:营业时间与空间受限,客户覆盖面窄,订单处理效率低下。针对这一市场痛点,我们设计并实现了一个轻量级、高可用的B2C在线蛋糕销售平台。该系统采用经典的J2EE Model 1架构,通过JSP与Servlet技术栈的有机结合,为烘焙商家提供了一个功能完备的线上商城解决方案,实现了从商品展示、在线订购到订单管理的全流程数字化运营。

系统架构与技术栈

平台采用分层架构设计,严格遵循MVC模式进行功能解耦。表现层使用JSP动态页面结合JSTL标签库进行数据渲染,有效分离了业务逻辑与展示逻辑。控制层由Servlet组件承担,负责接收用户请求、调用业务处理并转发响应。模型层通过JavaBean封装核心业务实体和数据访问逻辑。数据持久化基于JDBC直接连接MySQL数据库,确保了数据操作的高效性和稳定性。

技术选型方面,前端采用HTML5、CSS3和JavaScript构建响应式用户界面,后端基于Java EE标准的Servlet 3.0规范,服务器运行环境支持Tomcat 8.0及以上版本。这种技术组合既保证了系统的稳定运行,又降低了部署和维护成本,特别适合技术资源有限的中小企业。

数据库设计亮点

系统的数据模型设计充分体现了电商业务的复杂性和规范性。以下是几个核心表的深度分析:

商品分类表(s_catalog)的设计体现了良好的可扩展性:

CREATE TABLE `s_catalog` (
  `catalogId` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `catalogName` varchar(20) NOT NULL COMMENT '分类名称',
  PRIMARY KEY (`catalogId`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='分类表'

该表采用自增主键设计,确保分类ID的唯一性和连续性。varchar(20)的字段长度既满足了分类名称的存储需求,又避免了空间浪费。InnoDB存储引擎的支持保证了事务安全和外键约束的完整性。

订单-商品关联表(s_orderitem)的设计展现了复杂业务关系的优雅处理:

CREATE TABLE `s_orderitem` (
  `itemId` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
  `cakeId` int(11) NOT NULL COMMENT '蛋糕ID',
  `orderId` int(11) NOT NULL DEFAULT 0 COMMENT '订单ID',
  `quantity` int(11) NOT NULL DEFAULT 0 COMMENT '数量',
  PRIMARY KEY (`itemId`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='订单项表'

这种设计完美解决了电商系统中经典的多对多关系问题。通过独立的订单项表,系统能够准确记录每个订单中具体商品的购买数量,为库存管理、销售统计等功能提供了数据基础。默认值的设置(DEFAULT 0)增强了数据的完整性。

用户表(s_user)的字段设计考虑了实际业务需求:

CREATE TABLE `s_user` (
  `userId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `userName` varchar(20) NOT NULL COMMENT '用户名',
  `userPassWord` varchar(20) NOT NULL COMMENT '密码',
  `name` varchar(20) NOT NULL COMMENT '姓名',
  `sex` varchar(2) NOT NULL COMMENT '性别',
  `age` int(5) NOT NULL COMMENT '年龄',
  `tell` varchar(20) NOT NULL COMMENT '电话',
  `address` varchar(100) NOT NULL COMMENT '地址',
  `enabled` varchar(1) NOT NULL COMMENT '是否启用',
  PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表'

地址字段预留了100字符的存储空间,充分考虑了国内详细地址的表述需求。enabled字段的设计支持用户账号的软删除功能,符合企业级应用的数据管理规范。

核心功能实现

1. 商品展示与分类浏览

系统首页采用卡片式布局展示热门商品,支持按分类筛选。前端通过AJAX技术实现无刷新加载,提升用户体验。

// 商品查询Servlet核心代码
public class ProductQueryServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String catalogId = request.getParameter("catalogId");
        ProductDAO productDAO = new ProductDAO();
        List<Product> products;
        
        if (catalogId != null && !catalogId.isEmpty()) {
            products = productDAO.getProductsByCatalog(Integer.parseInt(catalogId));
        } else {
            products = productDAO.getAllProducts();
        }
        
        request.setAttribute("products", products);
        RequestDispatcher dispatcher = request.getRequestDispatcher("products.jsp");
        dispatcher.forward(request, response);
    }
}

商城首页

2. 购物车管理

购物车功能采用Session技术实现,支持商品的添加、删除和数量修改。

// 购物车添加商品逻辑
public class AddToCartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        HttpSession session = request.getSession();
        ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
        
        if (cart == null) {
            cart = new ShoppingCart();
            session.setAttribute("cart", cart);
        }
        
        int productId = Integer.parseInt(request.getParameter("productId"));
        int quantity = Integer.parseInt(request.getParameter("quantity"));
        
        Product product = productService.getProductById(productId);
        cart.addItem(product, quantity);
        
        response.sendRedirect("cart.jsp");
    }
}

加入购物车

3. 订单生成与处理

订单系统采用事务处理机制,确保数据的一致性。订单编号生成规则结合时间戳和随机数,避免重复。

// 订单生成核心业务逻辑
public class OrderService {
    public boolean createOrder(Order order, List<OrderItem> items) {
        Connection conn = null;
        try {
            conn = DatabaseUtil.getConnection();
            conn.setAutoCommit(false);
            
            // 插入订单主表
            String orderSQL = "INSERT INTO s_order (orderNum, userId, orderDate, money, orderStatus) VALUES (?, ?, ?, ?, ?)";
            PreparedStatement orderStmt = conn.prepareStatement(orderSQL, Statement.RETURN_GENERATED_KEYS);
            orderStmt.setString(1, generateOrderNumber());
            orderStmt.setInt(2, order.getUserId());
            orderStmt.setString(3, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            orderStmt.setDouble(4, order.getTotalAmount());
            orderStmt.setInt(5, OrderStatus.PENDING.getCode());
            
            int affectedRows = orderStmt.executeUpdate();
            if (affectedRows == 0) {
                throw new SQLException("创建订单失败");
            }
            
            // 获取生成的订单ID
            Result generatedKeys = orderStmt.getGeneratedKeys();
            int orderId;
            if (generatedKeys.next()) {
                orderId = generatedKeys.getInt(1);
                
                // 插入订单明细
                for (OrderItem item : items) {
                    String itemSQL = "INSERT INTO s_orderitem (cakeId, orderId, quantity) VALUES (?, ?, ?)";
                    PreparedStatement itemStmt = conn.prepareStatement(itemSQL);
                    itemStmt.setInt(1, item.getCakeId());
                    itemStmt.setInt(2, orderId);
                    itemStmt.setInt(3, item.getQuantity());
                    itemStmt.executeUpdate();
                }
                
                conn.commit();
                return true;
            }
        } catch (SQLException e) {
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        } finally {
            DatabaseUtil.closeConnection(conn);
        }
        return false;
    }
}

提交订单

4. 后台管理系统

管理员后台提供完整的商品管理、订单处理、用户管理等功能模块。

// 管理员登录验证
public class AdminLoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        AdminService adminService = new AdminService();
        Admin admin = adminService.authenticate(username, password);
        
        if (admin != null) {
            HttpSession session = request.getSession();
            session.setAttribute("admin", admin);
            session.setMaxInactiveInterval(30 * 60); // 30分钟超时
            
            response.sendRedirect("admin/dashboard.jsp");
        } else {
            request.setAttribute("error", "用户名或密码错误");
            request.getRequestDispatcher("admin/login.jsp").forward(request, response);
        }
    }
}

管理员登录

订单管理

实体模型设计

系统采用面向对象的设计思想,通过JavaBean封装业务实体。以下以管理员实体为例展示模型设计:

package bean;

import java.util.Date;
import java.util.Map;

public class Admin {
    private Integer id;                //用户编号
    private String userName;            //用户名
    private String passWord;            //用户密码
    private String name;                //用户姓名
    private Date lastLoginTime;        //最后登录时间
    
    // 多种构造器支持不同的创建场景
    public Admin() {}
    
    public Admin(String userName, String passWord) {
        this.userName = userName;
        this.passWord = passWord;
    }
    
    public Admin(Integer id, String passWord, String name) {
        super();
        this.id = id;
        this.passWord = passWord;
        this.name = name;
    }

    public Admin(String userName, String passWord, String name) {
        super();
        this.userName = userName;
        this.passWord = passWord;
        this.name = name;
    }

    // 支持从Map直接构建对象的构造器
    public Admin(Map<String,Object> map) {
        this.id = (Integer) map.get("id");
        this.userName = (String) map.get("userName");
        this.passWord = (String) map.get("passWord");
        this.name = (String) map.get("name");
        this.lastLoginTime = (Date) map.get("lastLoginTime");
    }
    
    // Getter和Setter方法
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getLastLoginTime() {
        return lastLoginTime;
    }

    public void setLastLoginTime(Date lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }
}

功能展望与优化

基于当前系统架构,未来可以从以下几个方向进行功能扩展和性能优化:

  1. 引入Redis缓存层:针对商品目录、用户会话等高频访问数据,可以引入Redis作为缓存中间件,显著提升系统响应速度。实现思路:在DAO层添加缓存逻辑,先查询Redis,未命中再查询数据库。

  2. 分布式会话管理:当前基于Tomcat Session的架构在集群环境下存在局限性。可以将会话数据存储到Redis中,实现多节点间的会话共享。使用Spring Session框架可以平滑过渡。

  3. 微服务架构改造:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,提升系统的可扩展性和可维护性。使用Spring Cloud体系实现服务治理。

  4. 移动端适配优化:开发专门的移动端界面或渐进式Web应用(PWA),提升移动用户体验。可以采用Vue.js或React框架构建响应式前端。

  5. 智能推荐功能:基于用户行为数据构建推荐算法,实现个性化商品推荐。可以使用协同过滤或基于内容的推荐算法,提升转化率。

总结

该在线蛋糕销售平台通过严谨的架构设计和规范的技术实现,为传统烘焙行业提供了切实可行的数字化转型方案。系统在保证功能完整性的同时,兼顾了性能与可维护性,体现了J2EE技术在中小企业电商应用中的实用价值。清晰的代码结构、合理的数据模型设计以及完善的业务逻辑处理,为后续的功能扩展和技术升级奠定了坚实基础。

随着电商技术的不断发展,平台有望通过持续的技术迭代,演进为更加智能、高效的烘焙行业数字化解决方案,为更多中小型烘焙企业创造商业价值。

本文关键词
JSPServlet在线蛋糕销售平台源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章