1. 项目概述:JSP二手交易平台全栈开发实录
这个二手交易平台项目采用经典的JSP+Servlet技术栈实现,是一个典型的Java Web全栈应用。作为从学生时代就接触JSP的老程序员,我完整经历了从需求分析到上线的全流程开发。这个项目不仅包含了常规的商品交易功能,还针对二手交易的特殊性设计了信用评价体系、多维度搜索等特色模块。
整套系统采用MVC分层架构,前端使用JSP+JSTL+EL表达式实现动态页面渲染,后端基于Servlet处理业务逻辑,MySQL作为持久化存储。开发环境搭建时特别要注意Tomcat版本与JDK的兼容性问题——我最初用Tomcat 10搭配JDK 8就遇到了JSP解析异常,后来降级到Tomcat 9才解决。数据库设计方面,重点解决了二手商品的多状态流转(上架/交易中/已售出)、用户信用积分计算等业务难点。
关键提示:二手交易平台相比普通电商更注重买卖双方的交互设计,需要特别关注交易安全性和用户信任体系建设,这是项目区别于普通电商的核心特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计与选型考量
2.1 整体技术栈组成
- 前端展示层:JSP 2.3 + Bootstrap 5 + jQuery
- 控制层:Servlet 4.0 + Filter链
- 数据持久层:JDBC + Druid连接池
- 数据库:MySQL 8.0 with InnoDB引擎
- 服务器:Apache Tomcat 9.0.64
- 辅助工具:Lombok + Log4j2
选择这套技术组合主要基于以下考虑:
- 教学场景的兼容性要求(大部分高校Java Web课程仍以JSP/Servlet为核心)
- 二手交易业务对事务一致性的中等要求(不需要分布式架构)
- 快速开发迭代的需求(避免过度设计)
2.2 数据库设计要点
商品主表的设计采用了"宽表+状态机"的模式:
sql复制CREATE TABLE item (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL COMMENT '发布者ID',
title VARCHAR(100) NOT NULL,
category ENUM('数码','服饰','图书','其他') NOT NULL,
price DECIMAL(10,2) UNSIGNED NOT NULL,
original_price DECIMAL(10,2) UNSIGNED COMMENT '原价',
status ENUM('ON_SALE','TRADING','SOLD','REMOVED') DEFAULT 'ON_SALE',
view_count INT UNSIGNED DEFAULT 0,
description TEXT,
cover_url VARCHAR(255),
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES user(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
状态字段的设计特别考虑了二手商品的特殊生命周期:
- ON_SALE:正常售卖中
- TRADING:买卖双方达成意向
- SOLD:已完成交易
- REMOVED:用户主动下架
3. 核心功能模块实现细节
3.1 用户系统实现
采用RBAC模型实现权限控制,核心Servlet代码结构:
java复制@WebServlet("/user/*")
public class UserServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
String pathInfo = req.getPathInfo();
if("/register".equals(pathInfo)) {
handleRegister(req, resp);
}
// 其他路由处理...
}
private void handleRegister(HttpServletRequest req, HttpServletResponse resp) {
// 参数校验
String username = req.getParameter("username");
if(StringUtils.isBlank(username)) {
sendError(resp, "用户名不能为空");
return;
}
// 业务处理
User user = new User();
BeanUtils.populate(user, req.getParameterMap());
try {
userService.register(user);
// 注册成功处理
} catch (DuplicateKeyException e) {
sendError(resp, "用户名已存在");
}
}
}
3.2 商品搜索功能
结合二手商品特点实现了多条件筛选:
- 基础关键词搜索:基于MySQL全文索引
- 价格区间过滤:使用BETWEEN条件
- 分类筛选:ENUM字段精确匹配
- 排序支持:默认按发布时间,可选价格/浏览量
搜索Servlet的核心逻辑:
java复制String keyword = req.getParameter("q");
String category = req.getParameter("category");
String minPrice = req.getParameter("minPrice");
String maxPrice = req.getParameter("maxPrice");
String sort = req.getParameter("sort");
ItemQuery query = new ItemQuery();
if(StringUtils.isNotBlank(keyword)) {
query.setKeyword(keyword.trim());
}
// 其他条件处理...
List<Item> items = itemService.search(query);
req.setAttribute("items", items);
req.getRequestDispatcher("/WEB-INF/view/item/list.jsp").forward(req, resp);
4. 开发环境配置与调试技巧
4.1 标准开发环境搭建
- JDK:1.8.0_301(注意不要用过高版本)
- IDE:Eclipse JEE 2022-06 + Tomcat插件
- 数据库工具:MySQL Workbench 8.0 + Navicat Premium
- 版本控制:Git 2.37 + GitExtensions
环境配置常见问题:
- Tomcat启动时报JSP编译错误:检查JRE版本是否与Tomcat匹配
- 中文乱码问题:统一设置UTF-8编码
- JSP页面:
<%@ page contentType="text/html;charset=UTF-8" %> - Servlet:
resp.setContentType("text/html;charset=UTF-8") - MySQL连接串:
jdbc:mysql://localhost:3306/used_market?useUnicode=true&characterEncoding=UTF-8
- JSP页面:
4.2 调试技巧实录
-
JSP页面调试:
- 在Tomcat的work目录下查看生成的Servlet源码
- 使用
<% System.out.println("debug info"); %>输出日志
-
数据库事务调试:
java复制Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false); // 开启事务
// 业务操作...
conn.commit();
} catch (SQLException e) {
if(conn != null) conn.rollback();
throw e;
} finally {
if(conn != null) conn.close();
}
- 前端问题定位:
- 使用Chrome开发者工具查看网络请求
- 检查JSP生成的最终HTML源码
- 使用Bootstrap的响应式调试工具
5. 部署上线实战指南
5.1 生产环境配置优化
- Tomcat调优:
xml复制<!-- conf/server.xml 配置 -->
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="200"
minSpareThreads="20"
acceptCount="100"
compression="on"
compressableMimeType="text/html,text/xml,text/css,application/javascript"/>
- MySQL优化:
sql复制-- 为高频查询字段添加索引
ALTER TABLE item ADD INDEX idx_category_status (category, status);
ALTER TABLE item ADD FULLTEXT INDEX ft_title_desc (title, description);
-- 调整InnoDB缓冲池大小(根据服务器内存调整)
SET GLOBAL innodb_buffer_pool_size = 1G;
5.2 部署流程
- 项目打包:
mvn clean package生成war文件 - 上传到服务器Tomcat的webapps目录
- 配置生产数据库连接池参数:
properties复制# WEB-INF/classes/druid.properties
druid.url=jdbc:mysql://prod-db:3306/used_market
druid.username=prod_user
druid.password=securePassword123
druid.initialSize=5
druid.maxActive=20
druid.maxWait=60000
- 配置Nginx反向代理:
nginx复制server {
listen 80;
server_name market.example.com;
location / {
proxy_pass http://localhost:8080/used_market;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源缓存
location ~* \.(jpg|css|js)$ {
expires 30d;
}
}
6. 典型问题排查手册
6.1 数据库连接泄露
现象:运行一段时间后系统变慢,MySQL显示连接数爆满
排查步骤:
- 检查Druid监控页面
/druid - 确认连接池配置的最大连接数是否合理
- 检查所有JDBC操作是否在finally块中关闭连接
- 使用
jstack查看线程堆栈
解决方案:
java复制// 正确资源关闭写法
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement("SELECT...");
rs = ps.executeQuery();
// 处理结果
} finally {
if(rs != null) try { rs.close(); } catch(SQLException ignored) {}
if(ps != null) try { ps.close(); } catch(SQLException ignored) {}
}
6.2 JSP编译性能问题
现象:首次访问JSP页面响应极慢
优化方案:
- 预编译JSP:
$CATALINA_HOME/bin/jspc.sh -webapp /path/to/app - 调整Tomcat的JSP编译参数:
xml复制<Context>
<JspServlet>
<init-param>
<param-name>development</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>checkInterval</param-name>
<param-value>300</param-value>
</init-param>
</JspServlet>
</Context>
6.3 并发交易冲突
场景:多个用户同时购买同一商品导致超卖
解决方案:
- 数据库乐观锁:
sql复制UPDATE item SET status='TRADING'
WHERE id=123 AND status='ON_SALE';
- 应用层分布式锁(Redis实现):
java复制public boolean acquireLock(String key, long expireTime) {
String result = jedis.set(key, "LOCK", "NX", "PX", expireTime);
return "OK".equals(result);
}
7. 项目扩展与优化方向
7.1 性能优化建议
-
缓存策略:
- 商品详情页使用Redis缓存
- 热门列表使用Guava Cache
- 实现两级缓存架构
-
静态资源优化:
- 使用WebJars管理前端依赖
- 启用HTTP/2服务器推送
- 实现资源指纹策略
7.2 功能扩展思路
- 即时通讯:集成WebSocket实现买卖家实时沟通
- 推荐系统:基于用户行为实现协同过滤推荐
- 风控系统:识别异常交易行为
- 移动端适配:开发响应式前端或独立APP
这套二手交易平台经过三个月的迭代开发,目前已在校园内网稳定运行。最大的收获是深刻理解了事务一致性与高并发场景的处理策略。建议初学者重点关注数据库设计规范和异常处理机制,这是保证系统健壮性的基石。
