1. 项目概述与核心价值
这个JSP二手交易平台是一个典型的电子商务类Web应用,采用经典的Java Web技术栈构建。作为开发者,我完整经历了从需求分析到生产部署的全过程,特别在数据库设计和调试部署环节积累了不少实战经验。
二手交易平台的核心价值在于连接闲置物品的供需双方。相比传统电商,这类平台需要特别关注以下几个特性:
- 非标商品管理(商品状态描述、多维度分类)
- 买卖双方直接沟通机制
- 信用评价体系构建
- 本地化交易支持(同城交易功能)
技术选型方面,项目采用JSP+Servlet作为基础架构,这是目前Java Web开发中最成熟稳定的方案之一。虽然现在Spring Boot等框架更流行,但JSP在中小型项目中仍有其优势:开发工具链完善、学习曲线平缓、服务器资源要求低。我在项目中使用的是Tomcat 9.x作为应用服务器,配合MySQL 5.7数据库,这个组合在兼容性和性能之间取得了很好的平衡。
提示:实际开发中强烈建议使用Maven管理依赖,可以避免很多jar包冲突问题。我在初期没有使用Maven,后来遇到版本兼容问题时重构项目花费了大量时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境搭建要点
2.1 基础软件准备
完整的开发环境需要以下组件:
- JDK 1.8(注意不是JRE)
- Eclipse IDE for Enterprise Java Developers(或IntelliJ IDEA)
- Apache Tomcat 9.x
- MySQL Community Server 5.7
- 版本控制工具(Git推荐)
安装时最容易出问题的是环境变量配置。这里分享一个检查清单:
- JAVA_HOME指向JDK安装目录(不是bin目录)
- CATALINA_HOME指向Tomcat根目录
- Path中包含%JAVA_HOME%\bin和%CATALINA_HOME%\bin
2.2 数据库连接池配置
直接使用JDBC连接数据库在实际项目中性能很差,必须配置连接池。我对比了多种方案后选择了HikariCP,配置示例:
xml复制<!-- context.xml配置 -->
<Resource name="jdbc/SecondHandDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/secondhand?useSSL=false"
username="root"
password="yourpassword"
maxTotal="20"
maxIdle="10"
maxWaitMillis="10000"/>
常见问题排查:
- 连接泄漏:确保每个Connection都在finally块中关闭
- 字符集问题:在JDBC URL中添加?characterEncoding=utf8
- SSL警告:开发环境可以加useSSL=false参数
3. 数据库设计与优化
3.1 核心表结构
二手平台的核心表包括:
- 用户表(user)
- 商品表(item)
- 订单表(order)
- 评价表(review)
- 消息表(message)
以商品表为例的建表语句:
sql复制CREATE TABLE `item` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`description` text,
`price` decimal(10,2) NOT NULL,
`category_id` int(11) NOT NULL,
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1-在售 2-已售 3-下架',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`view_count` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 性能优化实践
在项目后期,当商品数量超过10万时,出现了明显的性能下降。通过以下措施解决了问题:
-
添加适当的索引:
- 为搜索字段(title, category_id)添加组合索引
- 为排序字段(create_time, price)添加单列索引
-
分表策略:
- 按商品类别进行水平分表
- 将商品图片等大字段分离到单独的表
-
查询优化:
- 避免SELECT *,只查询需要的字段
- 使用JOIN替代子查询
- 对分页查询使用延迟关联技巧
4. 核心功能实现细节
4.1 商品发布模块
商品发布是平台最核心的功能之一,前端采用jQuery+Ajax实现异步提交,后端处理流程:
java复制protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 获取表单数据
String title = request.getParameter("title");
String description = request.getParameter("description");
String priceStr = request.getParameter("price");
// 2. 数据验证
if(StringUtils.isEmpty(title) || !NumberUtils.isParsable(priceStr)) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
// 3. 处理图片上传
Part filePart = request.getPart("image");
String fileName = UUID.randomUUID().toString();
String savePath = getServletContext().getRealPath("/uploads") + File.separator + fileName;
filePart.write(savePath);
// 4. 保存到数据库
Item item = new Item();
item.setTitle(title);
item.setDescription(description);
item.setPrice(new BigDecimal(priceStr));
item.setUserId(getCurrentUserId(request));
ItemDao itemDao = new ItemDao();
int itemId = itemDao.save(item);
// 5. 返回结果
response.setContentType("application/json");
response.getWriter().write("{\"success\":true,\"itemId\":"+itemId+"}");
}
注意:文件上传需要配置Servlet的@MultipartConfig注解,并设置合理的文件大小限制。
4.2 交易流程实现
二手交易的特殊性在于需要买卖双方协商。我设计了这样的状态机:
- 买家发起购买请求 → 订单状态为"待确认"
- 卖家确认订单 → 状态变为"待付款"
- 买家付款 → 状态变为"待发货"
- 卖家发货 → 状态变为"待收货"
- 买家确认收货 → 状态变为"已完成"
关键实现代码片段:
java复制public boolean confirmOrder(int orderId, int sellerId) throws SQLException {
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false);
// 检查订单状态和卖家身份
Order order = orderDao.getById(orderId, conn);
if(order == null || order.getSellerId() != sellerId
|| !order.getStatus().equals(OrderStatus.WAITING_CONFIRM)) {
return false;
}
// 更新订单状态
orderDao.updateStatus(orderId, OrderStatus.WAITING_PAYMENT, conn);
// 发送系统消息
Message message = new Message();
message.setType(MessageType.SYSTEM);
message.setContent("您的订单已被卖家确认,请及时付款");
message.setReceiverId(order.getBuyerId());
messageDao.save(message, conn);
conn.commit();
return true;
} catch (SQLException e) {
if(conn != null) conn.rollback();
throw e;
} finally {
if(conn != null) conn.close();
}
}
5. 调试与部署实战
5.1 常见调试问题
在开发过程中遇到几个典型问题:
-
JSP页面中文乱码:
- 解决方案:在所有JSP页面头部添加
jsp复制<%@ page contentType="text/html;charset=UTF-8" language="java" %> - 并在web.xml中添加过滤器
- 解决方案:在所有JSP页面头部添加
-
静态资源加载失败:
- 确保静态资源放在WEB-INF目录外
- 检查Tomcat的server.xml中Context配置
-
会话失效问题:
- 检查web.xml中session-timeout配置
- 确保服务器时间正确
5.2 生产环境部署
Linux服务器部署要点:
-
安装JDK:
bash复制sudo apt-get update sudo apt-get install openjdk-8-jdk -
配置Tomcat服务:
bash复制sudo cp /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat sudo chmod 755 /etc/init.d/tomcat -
MySQL优化配置(/etc/mysql/my.cnf):
ini复制[mysqld] innodb_buffer_pool_size = 1G max_connections = 200 query_cache_size = 64M -
配置Nginx反向代理:
nginx复制server { listen 80; server_name yourdomain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
6. 安全防护措施
二手交易平台需要特别注意的安全问题:
-
XSS防护:
- 使用JSTL的<c:out>输出用户内容
- 配置Filter对所有请求参数进行HTML转义
-
SQL注入防护:
- 使用PreparedStatement
- 禁止拼接SQL语句
-
CSRF防护:
- 添加随机token验证
- 关键操作使用POST请求
-
文件上传安全:
- 检查文件类型(不要依赖扩展名)
- 限制文件大小
- 存储上传文件到Web根目录外
示例安全过滤器配置:
java复制public class XSSFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);
}
}
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
return cleanXSS(value);
}
private String cleanXSS(String value) {
if(value == null) return null;
return StringEscapeUtils.escapeHtml4(value);
}
}
7. 项目扩展与优化方向
基于当前版本,可以考虑以下扩展:
-
移动端适配:
- 开发响应式前端
- 或单独开发APP(建议使用Flutter跨平台方案)
-
推荐系统:
- 基于用户行为的协同过滤
- 商品相似度推荐
-
支付集成:
- 支付宝/微信支付接入
- 资金托管功能
-
即时通讯:
- WebSocket实现实时聊天
- 集成第三方IM服务
性能优化建议:
- 引入Redis缓存热门商品数据
- 使用Elasticsearch实现商品搜索
- 对静态资源启用CDN加速
- 数据库读写分离
在项目开发过程中,我最大的体会是前期设计比编码更重要。特别是数据库设计,一旦确定后修改成本很高。建议在正式编码前花足够时间进行:
- 详细的需求分析
- 完整的ER图设计
- 接口定义规范
- 技术方案评审
这些前期工作虽然看起来耗时,但能避免后期大量的返工和重构。
