基于SSH框架的在线电子商城系统 - 源码深度解析

JavaScriptSSH框架HTMLCSSMySQLJSP+Servlet
2026-03-283 浏览

文章摘要

本项目是一款基于SSH(Struts2 + Spring + Hibernate)框架技术栈构建的在线电子商城系统,旨在为中小型零售企业及个人创业者提供一套功能完整、易于维护的电商解决方案。系统核心业务价值在于解决了传统线下零售或简单线上店铺在商品管理、订单处理、用户交互等方面的效率低下与数据一致性...

在当今数字化零售时代,中小型企业和个人创业者亟需一套稳定可靠、功能完备的线上销售解决方案。本系统采用经典的SSH(Struts2 + Spring + Hibernate)技术栈构建,旨在为这类用户群体提供从商品展示、交易处理到后台管理的全流程电商服务。系统通过分层架构设计和框架整合,有效解决了传统零售业务中存在的流程冗余、数据不一致和运维成本高等痛点。

系统采用典型的三层架构模式,各层职责明确。表现层由Struts2框架主导,负责接收HTTP请求、调用业务逻辑及返回视图响应。其核心组件Action类作为前端请求的入口点,通过配置struts.xml文件映射URL与业务方法,并结合JSP页面与自定义标签库实现动态内容渲染。业务层基于Spring框架的IoC容器实现组件管理,通过依赖注入(DI)将商品服务、订单服务等业务对象解耦,同时利用Spring的声明式事务管理(@Transactional)确保订单创建、库存更新等关键操作的原子性。数据持久层依托Hibernate实现对象关系映射(ORM),通过配置实体类与数据库表的映射关系,将Java对象操作转化为SQL语句执行,并支持HQL(Hibernate Query Language)进行复杂查询,显著提升了数据访问的抽象度和可维护性。

系统支持多角色协同操作。普通用户可通过前端界面完成商品浏览、购物车管理、订单提交等操作;管理员则拥有商品分类管理、订单处理、用户信息维护等后台管理权限。系统运行时依赖MySQL数据库进行数据存储,并部署于Tomcat等Servlet容器中。


数据库架构设计与核心表解析

系统共设计6张核心数据表,涵盖用户、商品、订单等关键业务实体。以下重点分析product(商品表)和orders(订单表)的设计亮点。

商品表(product)结构如下:

CREATE TABLE `product` (
  `pid` int(11) NOT NULL AUTO_INCREMENT,
  `pname` varchar(255) DEFAULT NULL,
  `market_price` double DEFAULT NULL,
  `shop_price` double DEFAULT NULL,
  `pimage` varchar(255) DEFAULT NULL,
  `pdate` date DEFAULT NULL,
  `is_hot` int(11) DEFAULT NULL,
  `pdesc` varchar(255) DEFAULT NULL,
  `pflag` int(11) DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  PRIMARY KEY (`pid`),
  KEY `FK_product_category` (`cid`),
  CONSTRAINT `FK_product_category` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

该表设计体现了电商场景下商品管理的典型需求:

  1. 价格策略字段market_price(市场价)与shop_price(店铺价)分设,便于开展促销活动时计算折扣幅度。
  2. 热销标识is_hot字段通过布尔值标记热门商品,支持前端按热度排序展示。
  3. 外键关联:通过cid字段关联商品分类表(category),实现商品的多级分类管理。
  4. 状态控制pflag字段用于软删除标记,避免物理删除导致的数据关联断裂。

订单表(orders)设计如下:

CREATE TABLE `orders` (
  `oid` int(11) NOT NULL AUTO_INCREMENT,
  `total` double DEFAULT NULL,
  `ordertime` datetime DEFAULT NULL,
  `state` int(11) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  `phone` varchar(20) DEFAULT NULL,
  `addr` varchar(50) DEFAULT NULL,
  `uid` int(11) DEFAULT NULL,
  PRIMARY KEY (`oid`),
  KEY `FK_orders_user` (`uid`),
  CONSTRAINT `FK_orders_user` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

订单表的核心设计考量包括:

  1. 状态机设计state字段通过整型值表示订单生命周期(如0-待付款、1-已付款、2-已发货),为后续流程扩展预留空间。
  2. 冗余字段优化namephoneaddr字段直接存储下单时的快照信息,避免用户修改个人信息后历史订单数据不一致。
  3. 时间戳记录ordertime字段精确到datetime级别,支持按时间范围统计销售额等业务需求。

核心功能实现与代码解析

1. 商品浏览与分类检索

系统首页通过分层加载策略展示商品信息。前端通过AJAX请求分类数据,后端由Struts2的CategoryAction处理查询逻辑,并通过Hibernate的延迟加载机制优化性能。

分类查询Action核心代码:

public class CategoryAction extends ActionSupport implements ModelDriven<Category> {
    private CategoryService categoryService;
    private List<Category> cList;
    
    public String findAll() {
        cList = categoryService.findAll();
        return "findAll";
    }
    
    // Getter/Setter省略
}

Service层实现数据检索:

@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryDao categoryDao;
    
    @Override
    public List<Category> findAll() {
        return categoryDao.findAll();
    }
}

DAO层使用HQL进行查询:

@Repository
public class CategoryDaoImpl implements CategoryDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    
    @Override
    public List<Category> findAll() {
        return (List<Category>) hibernateTemplate.find("from Category");
    }
}

商品分类展示

2. 购物车管理与状态保持

购物车功能采用Session存储方案,确保用户操作期间的临时数据一致性。CartAction中通过维护一个Map结构存储商品ID与数量的映射关系。

购物车添加商品逻辑:

public class CartAction extends ActionSupport {
    private Map<Integer, CartItem> cart;
    private Integer pid;
    private Integer count;
    
    public String addToCart() {
        Product product = productService.findByPid(pid);
        CartItem item = new CartItem();
        item.setProduct(product);
        item.setCount(count);
        cart.put(pid, item);
        return "addToCart";
    }
}

购物车项实体设计:

public class CartItem {
    private Product product;
    private Integer count;
    private Double subtotal;
    
    public Double getSubtotal() {
        return product.getShop_price() * count;
    }
    // Getter/Setter省略
}

购物车界面

3. 订单创建与事务控制

订单提交涉及多个数据表的原子性操作,包括订单主表插入、订单项批量插入和库存更新等。系统通过Spring的声明式事务确保操作一致性。

订单服务层事务控制:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderDao orderDao;
    
    @Override
    public void save(Orders order, List<OrderItem> items) {
        orderDao.save(order);
        for (OrderItem item : items) {
            orderDao.saveItem(item);
            productDao.updateStock(item.getProduct().getPid(), item.getCount());
        }
    }
}

订单项持久化操作:

@Repository
public class OrderDaoImpl implements OrderDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    
    @Override
    public void save(Orders order) {
        hibernateTemplate.save(order);
    }
    
    @Override
    public void saveItem(OrderItem item) {
        hibernateTemplate.save(item);
    }
}

订单提交界面

4. 后台商品管理

管理员可通过后台系统对商品进行增删改查操作,商品上传功能通过Commons FileUpload组件实现图片文件存储。

商品上传Action处理:

public class AdminProductAction extends ActionSupport {
    private File upload;
    private String uploadFileName;
    
    public String addProduct() {
        String path = ServletActionContext.getServletContext().getRealPath("/products");
        File file = new File(path);
        if (!file.exists()) file.mkdirs();
        File destFile = new File(file, uploadFileName);
        FileUtils.copyFile(upload, destFile);
        
        product.setPimage("products/" + uploadFileName);
        productService.save(product);
        return "addSuccess";
    }
}

商品管理后台


实体模型与关系映射

系统通过Hibernate注解实现对象关系映射,以下为订单实体(Orders)的映射配置:

@Entity
@Table(name = "orders")
public class Orders {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer oid;
    
    private Double total;
    private Date ordertime;
    private Integer state;
    
    @ManyToOne
    @JoinColumn(name = "uid")
    private User user;
    
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private Set<OrderItem> orderItems = new HashSet<>();
    
    // Getter/Setter省略
}

订单项(OrderItem)实体配置体现多对一关联:

@Entity
@Table(name = "orderitem")
public class OrderItem {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer itemid;
    
    private Integer count;
    private Double subtotal;
    
    @ManyToOne
    @JoinColumn(name = "oid")
    private Orders order;
    
    @ManyToOne
    @JoinColumn(name = "pid")
    private Product product;
}

系统优化与功能扩展方向

  1. 缓存机制集成:引入Redis作为二级缓存,将热门商品数据、分类信息等缓存在内存中,降低数据库访问压力。可通过Spring Cache抽象层实现注解式缓存配置。

  2. 搜索引擎优化:集成Elasticsearch实现商品全文检索功能,支持按商品名称、描述等多字段进行模糊匹配,提升搜索准确性和响应速度。

  3. 支付网关扩展:当前系统仅模拟支付流程,可集成支付宝、微信支付等第三方支付接口,通过支付回调接口更新订单状态,实现真实交易闭环。

  4. 微服务架构改造:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,通过Spring Cloud组件实现服务注册发现、配置管理和链路追踪。

  5. 移动端适配:开发RESTful API接口,支持iOS/Android客户端访问,采用JWT令牌进行身份认证,实现多终端数据同步。

该系统通过严谨的架构设计和规范的编码实践,为中小型电商业务提供了可靠的技术基础。其模块化设计使得后续的功能扩展和技术升级具备良好的可行性,能够适应不断变化的业务需求。

本文关键词
SSH框架在线电子商城源码解析Struts2SpringHibernate

上下篇

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