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

JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-03-107 浏览

文章摘要

本项目是一款基于JSP和Servlet技术栈构建的酒类在线销售平台,专为满足酒类商品便捷、安全的线上交易需求而设计。它旨在解决传统酒类销售中信息不透明、选购流程繁琐、地域限制强等核心痛点,通过一个集成化的网络商店,为用户提供从浏览、筛选、下单到支付的完整购物体验,帮助酒商拓展销售渠道并提升运营效率。...

在传统零售行业数字化转型的浪潮中,酒类商品因其特殊性,对线上销售平台提出了更高的要求。酒品在线商城系统应运而生,它采用经典的J2EE技术体系,以JSP和Servlet为核心,构建了一个功能完备、安全稳定的B2C电商解决方案。该系统不仅实现了商品展示、在线交易、订单管理等核心电商功能,还针对酒类销售的特点,设计了会员管理、消息推送、库存预警等特色模块。

系统采用典型的三层架构模式,展现层使用JSP动态页面技术,结合JSTL标签库和EL表达式实现数据渲染;控制层通过Servlet统一处理HTTP请求,实现业务逻辑的调度和转发;数据持久层则基于JDBC技术封装了标准的DAO数据访问接口,确保数据库操作的安全性和一致性。这种分层设计使得系统具有良好的可维护性和扩展性。

用户首页

数据库设计体现了系统的核心业务逻辑。商品表的设计特别考虑了酒类商品的特性,除了基本的商品信息外,还包含了酒精度、香型、产地等专业字段。订单表采用主从表结构设计,主表记录订单概要信息,从表详细记录每个商品的购买数量和价格,这种设计既保证了数据的完整性,又便于后续的统计分析和库存管理。

用户表的设计注重安全性和扩展性,采用MD5加密存储用户密码,同时预留了会员等级、积分等字段,为后续的会员体系扩展打下基础。地址管理表支持用户维护多个收货地址,并设置了默认地址标志,提升了用户体验。

CREATE TABLE product (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    category_id INT,
    brand VARCHAR(50),
    alcohol_degree DECIMAL(3,1),
    aroma_type VARCHAR(20),
    origin VARCHAR(50),
    price DECIMAL(10,2),
    stock INT,
    image_url VARCHAR(200),
    description TEXT,
    status TINYINT DEFAULT 1,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    id VARCHAR(32) PRIMARY KEY,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2),
    status TINYINT DEFAULT 0,
    shipping_address TEXT,
    payment_method VARCHAR(20),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

用户认证与权限控制是系统安全的重要保障。登录Servlet通过Session机制管理用户状态,同时对密码进行MD5加密验证,防止敏感信息泄露。管理员和普通用户通过角色字段进行区分,系统根据用户角色动态加载对应的功能菜单。

public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = MD5Util.encode(request.getParameter("password"));
        
        UserDAO userDAO = new UserDAO();
        User user = userDAO.findByUsernameAndPassword(username, password);
        
        if (user != null) {
            HttpSession session = request.getSession();
            session.setAttribute("currentUser", user);
            session.setMaxInactiveInterval(30 * 60);
            
            if (user.getRole() == 1) {
                response.sendRedirect("admin/index.jsp");
            } else {
                response.sendRedirect("index.jsp");
            }
        } else {
            request.setAttribute("errorMsg", "用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

管理员登录

购物车功能的实现采用了Session临时存储与数据库持久化相结合的方式。用户添加商品到购物车时,系统首先将商品信息存入Session,确保响应速度;当用户登录后,再将Session中的购物车数据同步到数据库,实现数据的持久化存储。这种设计既保证了性能,又避免了用户关闭浏览器后购物车数据丢失的问题。

public class CartServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        String action = request.getParameter("action");
        HttpSession session = request.getSession();
        Cart cart = (Cart) session.getAttribute("cart");
        
        if (cart == null) {
            cart = new Cart();
            session.setAttribute("cart", cart);
        }
        
        if ("add".equals(action)) {
            int productId = Integer.parseInt(request.getParameter("productId"));
            int quantity = Integer.parseInt(request.getParameter("quantity"));
            
            ProductDAO productDAO = new ProductDAO();
            Product product = productDAO.findById(productId);
            
            if (product != null && product.getStock() >= quantity) {
                CartItem item = new CartItem(product, quantity);
                cart.addItem(item);
                request.setAttribute("message", "商品已成功加入购物车");
            }
        }
    }
}

加入购物车

订单处理流程涵盖了从购物车结算到订单生成的完整业务逻辑。系统在生成订单前会进行库存校验,防止超卖现象的发生。订单编号采用时间戳+随机数的生成策略,确保订单号的唯一性。支付状态和订单状态分别管理,支持多种支付方式接入。

public class OrderService {
    public String createOrder(Order order, List<CartItem> cartItems) throws BusinessException {
        Connection conn = null;
        try {
            conn = DBUtil.getConnection();
            conn.setAutoCommit(false);
            
            // 库存校验
            for (CartItem item : cartItems) {
                Product product = productDAO.findById(item.getProduct().getId());
                if (product.getStock() < item.getQuantity()) {
                    throw new BusinessException("商品库存不足: " + product.getName());
                }
            }
            
            // 生成订单号
            String orderId = generateOrderId();
            order.setId(orderId);
            
            // 保存订单主表
            orderDAO.save(order);
            
            // 保存订单明细并扣减库存
            for (CartItem item : cartItems) {
                OrderDetail detail = new OrderDetail(orderId, item);
                orderDetailDAO.save(detail);
                productDAO.updateStock(item.getProduct().getId(), -item.getQuantity());
            }
            
            conn.commit();
            return orderId;
        } catch (SQLException e) {
            if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            throw new BusinessException("订单创建失败");
        }
    }
}

提交订单

后台管理系统提供了全面的业务管理功能。商品管理模块支持图片上传、批量操作等高级功能;订单管理可以实时跟踪订单状态,支持订单备注和异常处理;会员管理实现了用户分级和积分管理;库存管理提供库存预警和自动补货建议。

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table class="table table-striped">
    <thead>
        <tr>
            <th>订单号</th>
            <th>用户</th>
            <th>金额</th>
            <th>状态</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${orderList}" var="order">
        <tr>
            <td>${order.id}</td>
            <td>${order.user.username}</td>
            <td>¥${order.totalAmount}</td>
            <td>
                <c:choose>
                    <c:when test="${order.status == 0}">待付款</c:when>
                    <c:when test="${order.status == 1}">已付款</c:when>
                    <c:when test="${order.status == 2}">已发货</c:when>
                    <c:when test="${order.status == 3}">已完成</c:when>
                </c:choose>
            </td>
            <td>
                <a href="orderDetail?id=${order.id}" class="btn btn-info btn-sm">详情</a>
                <c:if test="${order.status == 1}">
                    <a href="shipOrder?id=${order.id}" class="btn btn-warning btn-sm">发货</a>
                </c:if>
            </td>
        </tr>
        </c:forEach>
    </tbody>
</table>

订单管理

系统的实体模型设计严格遵循面向对象原则,每个实体类都封装了相应的属性和业务方法。Product类不仅包含商品的基本信息,还提供了库存检查、价格计算等业务方法;User类实现了用户权限验证和密码加密等安全功能;Order类管理订单状态流转和金额计算等核心逻辑。

public class Product {
    private Integer id;
    private String name;
    private Integer categoryId;
    private String brand;
    private BigDecimal alcoholDegree;
    private String aromaType;
    private String origin;
    private BigDecimal price;
    private Integer stock;
    private String imageUrl;
    private String description;
    private Integer status;
    private Date createTime;
    
    public boolean isAvailable() {
        return status == 1 && stock > 0;
    }
    
    public BigDecimal calculateDiscountPrice(BigDecimal discount) {
        return price.multiply(discount).setScale(2, RoundingMode.HALF_UP);
    }
}

在数据访问层,系统采用了DAO模式进行数据封装,每个实体类对应一个DAO类,统一管理数据库操作。BaseDAO提供了通用的CRUD方法,各个具体的DAO类继承基类并实现特定的查询逻辑。

public abstract class BaseDAO<T> {
    protected Connection getConnection() throws SQLException {
        return DataSourceManager.getDataSource().getConnection();
    }
    
    public T findById(Integer id) {
        String sql = "SELECT * FROM " + getTableName() + " WHERE id = ?";
        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, id);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return mapResultSetToEntity(rs);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    protected abstract String getTableName();
    protected abstract T mapResultSetToEntity(ResultSet rs) throws SQLException;
}

系统的前端展示采用响应式设计,确保在不同设备上都能提供良好的用户体验。JSP页面通过EL表达式和JSTL标签库动态渲染数据,JavaScript处理前端交互逻辑,CSS确保界面美观统一。

商品详情页展示了完整的商品信息,包括多角度图片展示、详细参数说明、用户评价等。系统还实现了商品收藏、销量统计、库存显示等增强功能,帮助用户做出购买决策。

<div class="product-detail">
    <div class="product-images">
        <img src="${product.imageUrl}" alt="${product.name}">
    </div>
    <div class="product-info">
        <h1>${product.name}</h1>
        <div class="price">¥${product.price}</div>
        <div class="specifications">
            <dl>
                <dt>品牌:</dt><dd>${product.brand}</dd>
                <dt>酒精度:</dt><dd>${product.alcoholDegree}%vol</dd>
                <dt>香型:</dt><dd>${product.aromaType}</dd>
                <dt>产地:</dt><dd>${product.origin}</dd>
            </dl>
        </div>
        <div class="stock">库存:${product.stock}件</div>
        <div class="purchase">
            <input type="number" id="quantity" value="1" min="1" max="${product.stock}">
            <button onclick="addToCart(${product.id})">加入购物车</button>
        </div>
    </div>
</div>

商品详情

在系统安全性方面,除了基本的用户认证和密码加密外,还实现了SQL注入防护、XSS攻击防范、CSRF令牌验证等多重安全机制。所有用户输入都经过严格的验证和过滤,敏感操作需要二次确认,重要数据传输采用加密处理。

系统的扩展性设计考虑了未来业务发展的需要。模块化的架构使得新功能的添加不会影响现有系统运行,配置化的管理界面支持业务规则调整,接口化的设计便于与第三方系统集成。

对于未来的功能扩展,可以考虑以下几个方向:首先,引入Redis缓存机制提升系统性能,特别是商品列表、用户会话等高频访问数据;其次,实现分布式架构支持,通过负载均衡和数据库分片支持更大规模的用户访问;第三,集成智能推荐算法,根据用户浏览和购买历史提供个性化商品推荐;第四,开发移动端APP,提供更便捷的购物体验;最后,接入大数据分析平台,为经营决策提供数据支持。

在技术架构优化方面,可以考虑将现有的JDBC数据访问层迁移到MyBatis等ORM框架,提高开发效率和代码可维护性。引入Spring框架管理Bean生命周期和事务控制,使用Spring MVC替代原生Servlet实现更灵活的控制层设计。前端可以考虑采用Vue.js或React等现代框架,实现前后端分离架构。

酒品在线商城系统作为一个完整的电商解决方案,不仅满足了当前酒类在线销售的业务需求,其良好的架构设计和代码规范也为后续的功能扩展和技术升级奠定了坚实基础。系统的模块化设计、安全性保障和性能优化措施都体现了专业级电商平台的技术水准。

本文关键词
JSPServlet酒类在线销售源码解析B2C电商

上下篇

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