在宠物经济蓬勃发展的数字化时代,一个高效、稳定且用户友好的在线购物平台对于宠物用品零售商而言至关重要。本文深入剖析一个采用经典JSP+Servlet技术栈构建的宠物用品电商系统,该系统不仅实现了完整的在线交易流程,还通过严谨的架构设计确保了系统的可维护性和扩展性。
系统架构与技术选型
该系统严格遵循MVC设计模式,将业务逻辑、数据表示和用户界面分离,提高了代码的组织性和可维护性。
视图层 由JSP页面构成,负责动态内容的展示。JSP页面中嵌入了JSTL标签和EL表达式,实现了业务逻辑与页面表现的分离,避免了在页面中直接编写Java代码的弊端。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div class="product-list">
<c:forEach var="product" items="${productList}">
<div class="product-item">
<img src="${product.imageUrl}" alt="${product.name}">
<h3>${product.name}</h3>
<p class="price">¥${product.price}</p>
<a href="ProductDetailServlet?id=${product.id}">查看详情</a>
</div>
</c:forEach>
</div>
控制层 由Servlet组件实现,作为系统的核心调度器,负责接收用户请求、调用相应的业务逻辑处理,并转发到合适的JSP页面进行渲染。每个功能模块都有对应的Servlet进行处理。
@WebServlet("/AddToCartServlet")
public class AddToCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String productId = request.getParameter("productId");
int quantity = Integer.parseInt(request.getParameter("quantity"));
HttpSession session = request.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
if (cart == null) {
cart = new ShoppingCart();
session.setAttribute("cart", cart);
}
ProductDAO productDAO = new ProductDAOImpl();
Product product = productDAO.getProductById(productId);
cart.addItem(product, quantity);
response.sendRedirect("cart.jsp");
}
}
模型层 由JavaBean实体类和DAO数据访问对象组成。实体类封装业务数据,DAO类负责所有数据库操作,实现了数据访问逻辑与业务逻辑的分离。
数据库设计与核心表结构分析
系统采用MySQL关系型数据库,设计了8张核心数据表来支撑整个电商业务的运转。其中几个关键表的设计体现了良好的数据库规范化理念。
商品信息表 的设计不仅包含基本商品属性,还通过外键关联实现分类管理:
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
stock_quantity INT NOT NULL DEFAULT 0,
category_id INT,
image_url VARCHAR(200),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
该表设计中包含价格、库存等核心业务字段,同时通过category_id外键与分类表关联,支持商品的多级分类管理。时间戳字段的自动更新机制为数据审计提供了便利。
订单表 的设计体现了电商业务的复杂性:
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_number VARCHAR(50) UNIQUE NOT NULL,
user_id INT NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status ENUM('pending','paid','shipped','delivered','cancelled') DEFAULT 'pending',
shipping_address TEXT NOT NULL,
payment_method VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
订单表通过状态枚举字段清晰标识订单生命周期,总金额字段确保财务准确性,与用户的外键关联实现了用户订单历史的完整追踪。
核心功能模块实现
用户认证与权限管理
系统实现了完整的用户注册、登录和基于角色的访问控制。采用Session机制维护用户登录状态,不同角色(普通用户、管理员)拥有不同的操作权限。
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserDAO userDAO = new UserDAOImpl();
User user = userDAO.authenticate(username, password);
if (user != null) {
HttpSession session = request.getSession();
session.setAttribute("currentUser", user);
if ("admin".equals(user.getRole())) {
response.sendRedirect("admin/dashboard.jsp");
} else {
response.sendRedirect("index.jsp");
}
} else {
request.setAttribute("errorMessage", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}

商品展示与分类浏览
系统提供多种商品展示方式,包括首页推荐、分类浏览和搜索功能。商品分类支持多级结构,方便用户快速找到目标商品。
public class ProductDAOImpl implements ProductDAO {
public List<Product> getProductsByCategory(int categoryId, int page, int pageSize) {
List<Product> products = new ArrayList<>();
String sql = "SELECT * FROM products WHERE category_id = ? LIMIT ?, ?";
try (Connection conn = DatabaseUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, categoryId);
pstmt.setInt(2, (page - 1) * pageSize);
pstmt.setInt(3, pageSize);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
Product product = extractProductFromResultSet(rs);
products.add(product);
}
} catch (SQLException e) {
e.printStackTrace();
}
return products;
}
}

购物车与订单管理
购物车功能采用Session存储,用户添加商品到购物车后可以随时查看、修改商品数量,最终生成订单。订单状态全程可追踪。
public class ShoppingCart {
private Map<Integer, CartItem> items = new HashMap<>();
public void addItem(Product product, int quantity) {
CartItem item = items.get(product.getId());
if (item != null) {
item.setQuantity(item.getQuantity() + quantity);
} else {
item = new CartItem(product, quantity);
items.put(product.getId(), item);
}
}
public BigDecimal getTotalAmount() {
BigDecimal total = BigDecimal.ZERO;
for (CartItem item : items.values()) {
total = total.add(item.getSubtotal());
}
return total;
}
}

后台管理系统
管理员拥有完整的后台管理权限,包括用户管理、商品管理、订单处理、资讯发布等功能模块。
@WebServlet("/AdminProductServlet")
public class AdminProductServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
if ("delete".equals(action)) {
deleteProduct(request, response);
} else {
listProducts(request, response);
}
}
private void listProducts(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ProductDAO productDAO = new ProductDAOImpl();
List<Product> products = productDAO.getAllProducts();
request.setAttribute("products", products);
request.getRequestDispatcher("/admin/product-management.jsp").forward(request, response);
}
}

实体模型与业务逻辑
系统核心实体包括用户、商品、订单、购物车等,每个实体都有对应的业务逻辑处理。采用工厂模式和单例模式优化对象创建和资源管理。
商品实体类 的设计体现了良好的封装性:
public class Product {
private int id;
private String name;
private String description;
private BigDecimal price;
private int stockQuantity;
private int categoryId;
private String imageUrl;
private Date createTime;
private Date updateTime;
// 构造函数、getter和setter方法
public Product() {}
public Product(int id, String name, String description, BigDecimal price,
int stockQuantity, int categoryId, String imageUrl) {
this.id = id;
this.name = name;
this.description = description;
this.price = price;
this.stockQuantity = stockQuantity;
this.categoryId = categoryId;
this.imageUrl = imageUrl;
}
// 省略其他getter和setter方法
}
数据库连接管理 采用连接池技术优化性能:
public class DatabaseUtil {
private static DataSource dataSource;
static {
try {
Context context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/jdbc/petstore");
} catch (NamingException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
系统优化与功能扩展方向
基于当前系统架构,可以考虑以下几个方向的优化和功能扩展:
引入缓存机制:集成Redis等内存数据库,缓存热点商品数据、用户会话信息,显著提升系统响应速度。可以实现商品详情页的静态化生成,减轻数据库压力。
搜索引擎集成:整合Elasticsearch实现更强大的商品搜索功能,支持拼音搜索、同义词扩展、搜索词纠错等高级特性,提升用户体验。
微服务架构改造:将单体应用拆分为用户服务、商品服务、订单服务等微服务,通过Spring Cloud等技术实现服务治理,提高系统可扩展性和容错能力。
移动端适配:开发React Native或Flutter移动应用,提供原生移动体验。后端通过RESTful API为多端提供统一的数据服务。
智能化推荐:基于用户行为数据构建推荐算法,实现个性化商品推荐。可以使用协同过滤、内容推荐等算法提升转化率。
支付系统增强:集成多家支付渠道(微信支付、支付宝、银联等),实现支付方式多样化。增加支付状态回调、退款处理等完整支付业务流程。
库存预警机制:建立库存监控系统,当商品库存低于阈值时自动发送预警通知,支持库存调拨和自动补货建议。
该系统作为宠物用品电商领域的典型解决方案,展现了传统J2EE技术在中小型电商项目中的实用价值。其清晰的架构分层、严谨的数据库设计和完整的功能实现,为后续的技术演进和业务扩展奠定了坚实基础。