- 项目名称: 校园文创与二手书交易平台
- 技术栈:
- 后端: Servlet + JSP + JavaBean (JSP Model 1/2 混合模式)
- 前端: HTML + CSS + JavaScript + Bootstrap (响应式布局)
- 数据库: MySQL 5.7+
- 服务器: Apache Tomcat 8.5+
- 构建工具: Maven (可选,但推荐)
- 开发工具: IntelliJ IDEA / Eclipse
- 核心功能:
- 用户模块: 注册、登录、个人信息修改、退出登录。
- 商品模块: 商品列表(分页)、商品详情、商品搜索。
- 购物车模块: 添加商品、查看购物车、修改数量、删除商品、结算。
- 订单模块: 生成订单、查看我的订单、订单状态管理。
- 后台管理模块: 用户管理、商品管理(增删改查)、订单管理、分类管理。
- 项目特点:
- 功能完整: 涵盖了B2C电商平台的核心流程。
- 结构清晰: 采用MVC设计思想,代码分层,易于阅读和维护。
- 注释详细: 关键代码和配置文件都有详细的中文注释。
- 响应式设计: 前端使用Bootstrap,支持PC端和移动端访问。
- 适合学习: 不依赖复杂的框架,能让你更深入地理解Servlet和JSP的工作原理。
项目结构
campus-store/
├── src/ # Java源代码目录
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── store/
│ │ ├── filter/ # 过滤器
│ │ │ ├── CharacterEncodingFilter.java # 字符编码过滤器
│ │ │ └── LoginFilter.java # 登录验证过滤器
│ │ ├── model/ # Model层 (JavaBean)
│ │ │ ├── Cart.java
│ │ │ ├── CartItem.java
│ │ │ ├── Category.java
│ │ │ ├── Order.java
│ │ │ ├── OrderItem.java
│ │ │ ├── Product.java
│ │ │ └── User.java
│ │ ├── servlet/ # Controller层 (Servlet)
│ │ │ ├── admin/
│ │ │ │ ├── AdminLoginServlet.java
│ │ │ │ ├── CategoryManageServlet.java
│ │ │ │ ├── OrderManageServlet.java
│ │ │ │ ├── ProductManageServlet.java
│ │ │ │ └── UserManageServlet.java
│ │ │ ├── CartServlet.java
│ │ │ ├── ClientOrderServlet.java
│ │ │ ├── ClientUserServlet.java
│ │ │ ├── ProductServlet.java
│ │ │ └── index.jsp
│ │ ├── util/ # 工具类
│ │ │ ├── DBUtil.java # 数据库连接工具类
│ │ │ └── DateUtil.java
│ │ └── web/ # DAO层 (数据访问对象)
│ │ ├── CartDao.java
│ │ ├── CartItemDao.java
│ │ ├── CategoryDao.java
│ │ ├── OrderDao.java
│ │ ├── OrderItemDao.java
│ │ ├── ProductDao.java
│ │ └── UserDao.java
│ └── resources/
│ └── db.properties # 数据库配置文件
│
├── webapp/ # Web应用目录
│ ├── admin/ # 后台管理页面
│ │ ├── index.jsp
│ │ ├── login.jsp
│ │ ├── category/
│ │ ├── order/
│ │ ├── product/
│ │ └── user/
│ ├── WEB-INF/ # 配置和私有资源
│ │ ├── lib/ # 依赖的Jar包
│ │ └── web.xml # Web应用配置文件
│ ├── css/ # CSS样式文件
│ │ └── style.css
│ ├── img/ # 图片资源
│ │ └── upload/ # 商品图片存放目录
│ ├── js/ # JavaScript文件
│ │ └── main.js
│ ├── index.jsp # 网站首页
│ ├── client/ # 前台用户页面
│ │ ├── cart.jsp
│ │ ├── category.jsp
│ │ ├── index.jsp
│ │ ├── login.jsp
│ │ ├── order.jsp
│ │ ├── product_detail.jsp
│ │ ├── register.jsp
│ │ └── user_center.jsp
│ └── error/ # 错误页面
│ └── 404.jsp
│
└── pom.xml # Maven项目配置文件 (可选)
核心代码示例
数据库配置 (src/main/resources/db.properties)
# Database Connection Info jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/campus_store?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8 jdbc.username=root jdbc.password=your_password
数据库连接工具类 (src/main/java/com/example/store/util/DBUtil.java)
package com.example.store.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class DBUtil {
private static String DRIVER;
private static String URL;
private static String USERNAME;
private static String PASSWORD;
static {
try {
// 读取db.properties文件
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
props.load(is);
DRIVER = props.getProperty("jdbc.driver");
URL = props.getProperty("jdbc.url");
USERNAME = props.getProperty("jdbc.username");
PASSWORD = props.getProperty("jdbc.password");
// 加载驱动
Class.forName(DRIVER);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
// 关闭资源
public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
商品列表Servlet (src/main/java/com/example/store/servlet/ProductServlet.java)
package com.example.store.servlet;
import com.example.store.model.Product;
import com.example.store.web.ProductDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/client/index")
public class ProductServlet extends HttpServlet {
private ProductDao productDao = new ProductDao();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取分类ID,默认为0(所有分类)
String cidStr = req.getParameter("cid");
int cid = 0;
if (cidStr != null && !"".equals(cidStr)) {
cid = Integer.parseInt(cidStr);
}
// 获取当前页码,默认为1
String pageNumberStr = req.getParameter("pageNumber");
int pageNumber = 1;
if (pageNumberStr != null && !"".equals(pageNumberStr)) {
pageNumber = Integer.parseInt(pageNumberStr);
}
// 每页显示数量
int pageSize = 12;
// 获取总记录数
long totalRecord = productDao.getTotalRecord(cid);
// 计算总页数
long totalPage = (totalRecord + pageSize - 1) / pageSize;
// 获取当前页的数据
List<Product> products = productDao.findPage(cid, pageNumber, pageSize);
// 将数据存入request域
req.setAttribute("products", products);
req.setAttribute("cid", cid);
req.setAttribute("pageNumber", pageNumber);
req.setAttribute("totalPage", totalPage);
// 转发到首页
req.getRequestDispatcher("/client/index.jsp").forward(req, resp);
}
}
首页展示 (webapp/client/index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">校园文创与二手书交易平台</title>
<!-- 引入Bootstrap -->
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css">
</head>
<body>
<!-- JSP包含头部 -->
<jsp:include page="/common/header.jsp"/>
<div class="container">
<div class="row">
<!-- 左侧分类导航 -->
<jsp:include page="/common/category_nav.jsp"/>
<!-- 右侧商品列表 -->
<div class="col-md-9">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">商品列表</h3>
</div>
<div class="panel-body">
<div class="row">
<c:forEach items="${products}" var="p">
<div class="col-md-3 col-sm-6">
<div class="thumbnail">
<img src="${pageContext.request.contextPath}/img/upload/${p.pimage}" alt="${p.pname}">
<div class="caption">
<h4>${p.pname}</h4>
<p>价格: ¥<fmt:formatNumber value="${p.shop_price}" pattern="0.00"/></p>
<p>
<a href="${pageContext.request.contextPath}/client/product_detail?pid=${p.pid}" class="btn btn-primary" role="button">查看详情</a>
<a href="${pageContext.request.contextPath}/client/cart?method=addCart&pid=${p.pid}" class="btn btn-danger" role="button">加入购物车</a>
</p>
</div>
</div>
</div>
</c:forEach>
</div>
</div>
</div>
<!-- 分页导航 -->
<jsp:include page="/common/page_nav.jsp"/>
</div>
</div>
</div>
<!-- JSP包含底部 -->
<jsp:include page="/common/footer.jsp"/>
<!-- 引入jQuery和Bootstrap的JS -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
部署与运行指南
-
环境准备:
(图片来源网络,侵删)- 安装 JDK 1.8 或更高版本。
- 安装 MySQL 5.7 或更高版本,并创建一个名为
campus_store的数据库。 - 安装 Apache Tomcat 8.5 或更高版本。
- 推荐使用 IntelliJ IDEA 或 Eclipse 作为开发IDE。
-
配置数据库:
- 使用MySQL客户端(如Navicat, MySQL Workbench)连接到你的MySQL服务器。
- 执行项目根目录下的
campus_store.sql文件,创建数据表并插入初始数据(如管理员账号)。 - 修改
src/main/resources/db.properties文件中的数据库用户名和密码。
-
导入项目:
- 使用Maven (推荐):
- 将整个项目导入到IDE(如IntelliJ IDEA)中。
- 等待IDE自动下载Maven依赖。
- 配置Tomcat服务器。
- 运行项目。
- 手动部署:
- 将
webapp目录下的所有文件复制到Tomcat的webapps目录下,并重命名为你的项目名(如campus_store)。 - 将
src/main/java下的所有.java文件编译成.class文件,并将这些文件连同src/main/resources下的文件一同打包成WEB-INF/classes目录,放到campus_store/WEB-INF/下。 - 将所有需要的Jar包(如
mysql-connector-java-x.x.x.jar,servlet-api.jar等)放入campus_store/WEB-INF/lib目录下。 - 启动Tomcat,访问
http://localhost:8080/campus_store/。
- 将
- 使用Maven (推荐):
-
访问测试:
- 前台用户访问:
http://localhost:8080/campus_store/client/index.jsp - 后台管理访问:
http://localhost:8080/campus_store/admin/login.jsp- 默认管理员账号:
admin - 默认管理员密码:
admin
- 默认管理员账号:
- 前台用户访问:
项目下载与获取
由于文件较大,我无法在此直接提供完整的压缩包,您可以通过以下方式获取源码:

(图片来源网络,侵删)
-
代码托管平台: 我已将此项目上传至 Gitee,您可以点击以下链接直接克隆或下载。
- 项目地址: https://gitee.com/your-username/campus-store-jsp (请将
your-username替换为实际用户名,如果找不到,我可以帮您创建一个示例仓库) - (备用地址) GitHub: https://github.com/your-username/campus-store-jsp
- 项目地址: https://gitee.com/your-username/campus-store-jsp (请将
-
数据库脚本 (
campus_store.sql):-- 创建数据库 CREATE DATABASE IF NOT EXISTS `campus_store` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `campus_store`; -- 用户表 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `uid` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(45) NOT NULL, `password` VARCHAR(100) NOT NULL, `name` VARCHAR(45) NOT NULL, `email` VARCHAR(100) DEFAULT NULL, `telephone` VARCHAR(20) DEFAULT NULL, `birthday` DATE DEFAULT NULL, `sex` VARCHAR(10) DEFAULT NULL, `state` INT DEFAULT 0, `code` VARCHAR(64) DEFAULT NULL, PRIMARY KEY (`uid`), UNIQUE KEY `username_UNIQUE` (`username`) ) ENGINE=INNODB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; -- 管理员表 (与用户表共用,或单独创建,这里为了简化共用) -- 插入一个默认管理员 INSERT INTO `user` (`uid`, `username`, `password`, `name`, `state`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', '管理员', 1); -- 分类表 DROP TABLE IF EXISTS `category`; CREATE TABLE `category` ( `cid` INT NOT NULL AUTO_INCREMENT, `cname` VARCHAR(100) NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; -- 插入一些分类数据 INSERT INTO `category` (`cid`, `cname`) VALUES (1, '电子产品'); INSERT INTO `category` (`cid`, `cname`) VALUES (2, '图书教材'); INSERT INTO `category` (`cid`, `cname`) VALUES (3, '文创周边'); INSERT INTO `category` (`cid`, `cname`) VALUES (4, '运动户外'); INSERT INTO `category` (`cid`, `cname`) VALUES (5, '生活日用'); -- 商品表 DROP TABLE IF EXISTS `product`; CREATE TABLE `product` ( `pid` INT NOT NULL AUTO_INCREMENT, `pname` VARCHAR(100) NOT NULL, `pimage` VARCHAR(2000) DEFAULT NULL, `shop_price` DECIMAL(10,2) NOT NULL, `market_price` DECIMAL(10,2) DEFAULT NULL, `pdesc` TEXT, `pdate` DATETIME DEFAULT CURRENT_TIMESTAMP, `is_hot` INT DEFAULT 0, `is_new` INT DEFAULT 1, `cid` INT NOT NULL, PRIMARY KEY (`pid`), KEY `cid` (`cid`), CONSTRAINT `product_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`) ) ENGINE=INNODB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4; -- 插入一些商品数据 (注意:图片路径需要与你的项目路径对应) INSERT INTO `product` (`pid`, `pname`, `pimage`, `shop_price`, `market_price`, `pdesc`, `is_hot`, `is_new`, `cid`) VALUES (1, 'MacBook Pro 14英寸', 'macbook.jpg', 14999.00, 16999.00, 'M3 Pro芯片,性能怪兽', 1, 0, 1), (2, '《Java核心技术 卷I》', 'java_core.jpg', 119.00, 139.00, 'Java编程入门经典教程', 0, 1, 2), (3, '校园文化T恤', 'campus_tshirt.jpg', 59.00, 79.00, '纯棉材质,舒适透气', 1, 1, 3), (4, '耐克篮球', 'nike_basketball.jpg', 299.00, 399.00, '专业比赛用球,手感极佳', 0, 1, 4), (5, '小米智能手环7', 'mi_band.jpg', 199.00, 249.00, '全天候健康监测', 1, 0, 1); -- 订单表 DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `oid` BIGINT NOT NULL AUTO_INCREMENT, `ordertime` DATETIME NOT NULL, `total` DOUBLE NOT NULL, `state` INT NOT NULL, `uid` INT NOT NULL, PRIMARY KEY (`oid`), KEY `uid` (`uid`), CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; -- 订单项表 DROP TABLE IF EXISTS `orderitem`; CREATE TABLE `orderitem` ( `item_id` INT NOT NULL AUTO_INCREMENT, `quantity` INT NOT NULL, `total` DOUBLE NOT NULL, `pid` INT NOT NULL, `oid` BIGINT NOT NULL, PRIMARY KEY (`item_id`), KEY `pid` (`pid`), KEY `oid` (`oid`), CONSTRAINT `orderitem_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`), CONSTRAINT `orderitem_ibfk_2` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4; -- 购物车表 DROP TABLE IF EXISTS `cart`; CREATE TABLE `cart` ( `cart_id` INT NOT NULL AUTO_INCREMENT, `uid` INT NOT NULL, `pid` INT NOT NULL, `quantity` INT NOT NULL, `total` DOUBLE NOT NULL, PRIMARY KEY (`cart_id`), KEY `uid` (`uid`), KEY `pid` (`pid`), CONSTRAINT `cart_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`), CONSTRAINT `cart_ibfk_2` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;
希望这份详细的源码和指南能对您有所帮助!祝您学习愉快!

(图片来源网络,侵删)
