在当今数字化消费时代,线上购物已成为主流消费方式。一个高效、稳定的电子产品在线销售系统能够有效连接消费者与供应商,打破传统零售的时空限制。本系统采用经典的JSP+Servlet技术栈构建,实现了从商品展示、购物车管理到订单处理的全流程电子商务功能。
系统采用典型的三层架构模式,严格遵循MVC设计原则。表现层由JSP页面负责,通过EL表达式和JSTL标签库动态渲染数据;控制层使用Servlet处理业务逻辑和请求分发;模型层由JavaBean实体类和DAO数据访问对象组成。数据库采用MySQL,通过JDBC进行数据持久化操作。
数据库架构设计深度解析
系统数据库包含9个核心表,其中产品表、订单表和用户表的设计尤为关键。
产品表(product)设计体现了完善的商品管理体系:
CREATE TABLE product (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) DEFAULT NULL,
price double DEFAULT NULL,
category varchar(20) DEFAULT NULL,
pnum int(11) DEFAULT NULL,
imgurl varchar(100) DEFAULT NULL,
description varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
该表设计考虑了电子产品的多属性特征:price字段使用double类型精确存储价格,支持小数位计算;pnum字段实时跟踪库存数量,防止超卖;imgurl字段存储产品图片路径,实现可视化展示;description字段提供详细的产品规格说明。这种设计支持灵活的产品分类管理和库存控制。
订单表(orders)采用主从表结构实现复杂业务逻辑:
CREATE TABLE orders (
id varchar(100) NOT NULL,
money double DEFAULT NULL,
receiverAddress varchar(255) DEFAULT NULL,
receiverName varchar(20) DEFAULT NULL,
receiverPhone varchar(20) DEFAULT NULL,
paystate int(11) DEFAULT '0',
ordertime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
user_id int(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
订单ID采用字符串类型而非自增数字,便于生成分布式唯一标识。paystate字段使用状态码模式管理支付流程(0未支付/1已支付)。ordertime字段默认值为CURRENT_TIMESTAMP,自动记录订单创建时间。通过user_id外键关联用户表,建立完整的用户订单体系。
核心业务功能实现
用户认证与会话管理 用户登录功能通过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");
String role = request.getParameter("role");
UserService userService = new UserService();
User user = userService.login(username, password, role);
if(user != null) {
HttpSession session = request.getSession();
session.setAttribute("user", user);
if("admin".equals(role)) {
response.sendRedirect(request.getContextPath() + "/admin/home.jsp");
} else {
response.sendRedirect(request.getContextPath() + "/client/index.jsp");
}
} else {
request.setAttribute("loginError", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
该实现采用预处理语句防止SQL注入,通过角色字段区分普通用户和管理员权限。会话管理使用HttpSession对象,确保用户状态在整个购物流程中保持一致性。

购物车业务逻辑实现 购物车功能采用Session临时存储方案,提供高效的商品暂存能力:
public class AddCartServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("id");
ProductService productService = new ProductService();
Product product = productService.findProductById(id);
HttpSession session = request.getSession();
Map<Product, Integer> cart = (Map<Product, Integer>) session.getAttribute("cart");
if(cart == null) {
cart = new LinkedHashMap<Product, Integer>();
}
if(cart.containsKey(product)) {
cart.put(product, cart.get(product) + 1);
} else {
cart.put(product, 1);
}
session.setAttribute("cart", cart);
request.getRequestDispatcher("/client/cart.jsp").forward(request, response);
}
}
使用LinkedHashMap保持商品添加顺序,值为购买数量。这种设计支持同一商品多次添加,自动累加数量。购物车数据存储在用户会话中,无需频繁访问数据库,提升性能。

订单生成与库存同步 订单提交过程需要处理事务性操作,确保数据一致性:
public class SubmitOrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
Map<Product, Integer> cart = (Map<Product, Integer>) session.getAttribute("cart");
OrderService orderService = new OrderService();
try {
String orderId = orderService.submitOrder(user, cart);
session.removeAttribute("cart");
response.sendRedirect(request.getContextPath() + "/client/pay.jsp?orderid=" + orderId);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("orderError", "订单提交失败,请重试");
request.getRequestDispatcher("/client/cart.jsp").forward(request, response);
}
}
}
OrderService内部使用数据库事务处理订单生成和库存更新,确保要么全部成功要么全部失败。订单提交后立即清空购物车,防止重复下单。

产品搜索与分页查询 商品列表页面实现高效的数据检索和分页展示:
public class ProductListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String category = request.getParameter("category");
String name = request.getParameter("name");
String page = request.getParameter("page");
int currentPage = 1;
if(page != null) {
currentPage = Integer.parseInt(page);
}
ProductService productService = new ProductService();
PageBean<Product> pageBean = productService.findProductsByPage(currentPage, 8, category, name);
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("/client/product_list.jsp").forward(request, response);
}
}
分页查询通过PageBean封装分页信息,包括当前页码、每页记录数、总页数和数据列表。支持按分类和关键词筛选,提升用户体验。

实体模型设计
系统核心实体模型采用JavaBean规范设计,确保数据封装性和方法完整性:
用户实体模型:
public class User implements Serializable {
private int id;
private String username;
private String password;
private String email;
private String role; // 'user' 或 'admin'
private Date createTime;
// 构造函数、getter和setter方法
public User() {}
public User(String username, String password, String email, String role) {
this.username = username;
this.password = password;
this.email = email;
this.role = role;
this.createTime = new Date();
}
// 完整的getter和setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
// 其他getter/setter...
}
产品实体模型包含完整的业务逻辑方法:
public class Product implements Serializable {
private int id;
private String name;
private double price;
private String category;
private int pnum; // 库存数量
private String imgurl;
private String description;
// 库存检查方法
public boolean isAvailable(int quantity) {
return this.pnum >= quantity;
}
// 价格格式化显示
public String getFormattedPrice() {
return String.format("¥%.2f", this.price);
}
// 标准JavaBean方法
public Product() {}
// getter和setter方法
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// 其他getter/setter...
}
管理员功能模块
管理员后台提供完整的系统管理能力,包括用户管理、产品管理和订单处理:
产品管理Servlet实现CRUD操作:
public class ProductManagementServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
ProductService productService = new ProductService();
if("add".equals(action)) {
// 处理产品添加逻辑
Product product = extractProductFromRequest(request);
productService.addProduct(product);
} else if("update".equals(action)) {
// 处理产品更新逻辑
Product product = extractProductFromRequest(request);
product.setId(Integer.parseInt(request.getParameter("id")));
productService.updateProduct(product);
} else if("delete".equals(action)) {
// 处理产品删除逻辑
String id = request.getParameter("id");
productService.deleteProduct(id);
}
response.sendRedirect(request.getContextPath() + "/admin/product_list.jsp");
}
private Product extractProductFromRequest(HttpServletRequest request) {
Product product = new Product();
product.setName(request.getParameter("name"));
product.setPrice(Double.parseDouble(request.getParameter("price")));
product.setCategory(request.getParameter("category"));
product.setPnum(Integer.parseInt(request.getParameter("pnum")));
product.setDescription(request.getParameter("description"));
return product;
}
}

系统优化与扩展方向
性能优化:引入数据库连接池(如HikariCP)替代传统JDBC连接管理,减少连接创建开销。实现二级缓存机制,使用Redis缓存热点商品数据和用户会话信息。
搜索功能增强:集成Elasticsearch实现全文检索,支持商品名称、描述的多字段模糊匹配和智能排序。添加搜索建议和自动补全功能。
支付集成扩展:在现有支付基础上,增加支付宝、微信支付等多渠道接入。实现支付结果异步通知机制,确保交易状态一致性。
微服务架构改造:将单体应用拆分为用户服务、商品服务、订单服务等独立微服务,通过Spring Cloud实现服务治理和分布式配置管理。
移动端适配:开发RESTful API接口,支持iOS和Android移动应用接入。采用JWT令牌替代Session进行无状态认证。
数据分析功能:集成大数据分析平台,对用户行为、销售趋势进行深度挖掘,为库存管理和营销策略提供数据支持。
该系统作为典型的电子商务解决方案,展示了JSP+Servlet技术在Web应用开发中的成熟度和稳定性。通过模块化设计和清晰的代码结构,为后续功能扩展和技术升级奠定了坚实基础。