
1. 项目概述茗茶文化网站全栈开发实录这个基于JSP技术的茗茶文化网站项目是我去年为一家传统茶企完成的数字化转型案例。整套系统从需求分析到上线部署历时3个月完整实现了茶叶展示、文化传播、在线商城三大核心模块。现在把整个开发过程的关键技术点和踩坑经验整理出来特别适合想用传统JavaWeb技术栈练手全流程开发的同学参考。项目采用经典的MVC分层架构前端用BootStrapjQuery实现响应式布局后端基于JSPServletMySQL组合部署在Tomcat9容器。这套技术栈虽然不算新潮但胜在稳定成熟特别适合需要快速交付的中小型企业网站。下面我会从技术选型、功能实现、数据库设计、部署调优四个维度详细拆解。2. 技术架构与开发环境搭建2.1 技术栈选型背后的思考选择JSP而不是SpringBoot主要基于三个考量客户服务器是老旧Windows Server 2008系统需要兼容JDK1.8环境项目预算有限要求使用客户现有MySQL5.7数据库后期维护将由非Java专业的网管人员负责需要降低技术复杂度开发环境配置要点Eclipse IDE for Enterprise Java Developers版本2020-06Apache Tomcat 9.0.41需配置URIEncodingUTF-8解决中文乱码MySQL Connector/J 5.1.48驱动前端库版本锁定Bootstrap 3.4.1 jQuery 3.5.1重要提示新版本Tomcat10移除了javax包如果使用需替换为jakarta命名空间建议老项目保持Tomcat9更稳定2.2 项目目录结构规范/qf7a3 ├── /WebContent # 前端资源 │ ├── /admin # 后台管理页面 │ ├── /css # 样式文件 │ ├── /js # 脚本文件 │ └── /upload # 图片上传目录 ├── /src │ ├── /com │ │ ├── /bean # 实体类 │ │ ├── /dao # 数据访问层 │ │ ├── /service # 业务逻辑层 │ │ └── /util # 工具类 │ └── /filter # 过滤器 ├── /lib # 依赖库 └── /sql # 数据库脚本3. 核心功能模块实现3.1 茶叶展示系统开发要点采用JSTLEL表达式替代脚本片段提升JSP可维护性% taglib urihttp://java.sun.com/jsp/jstl/core prefixc % c:forEach items${teaList} vartea div classcol-md-4 img src${tea.imageUrl} classimg-responsive h3${tea.name}/h3 p${tea.description}/p /div /c:forEach分页查询的DAO层实现技巧public ListTea queryByPage(int pageNo, int pageSize) throws SQLException { String sql SELECT * FROM t_tea LIMIT ?,?; try(Connection conn DataSourceUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)){ ps.setInt(1, (pageNo-1)*pageSize); // 注意页码转换 ps.setInt(2, pageSize); ResultSet rs ps.executeQuery(); // 结果集转换逻辑... } }3.2 购物车模块的Session管理采用三层存储结构优化性能未登录用户使用HttpSession存储临时购物车已登录用户合并Session数据到数据库定期任务清理超过7天的未登录用户购物车数据// 购物车合并逻辑示例 public void mergeCart(HttpSession session, int userId) { Cart sessionCart (Cart)session.getAttribute(cart); if(sessionCart ! null) { Cart dbCart cartDao.findByUser(userId); // 合并商品数量逻辑... cartDao.update(dbCart); session.removeAttribute(cart); } }4. 数据库设计与优化4.1 主要表结构设计茶叶分类表设计含冗余字段优化查询CREATE TABLE t_category ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(20) NOT NULL COMMENT 分类名称, tea_count int(11) DEFAULT 0 COMMENT 关联茶叶数量, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;订单表的水平分表策略-- 按年份分表 CREATE TABLE t_order_2023 ( id bigint(20) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单编号, user_id int(11) NOT NULL, total_amount decimal(10,2) NOT NULL, payment_type tinyint(4) NOT NULL COMMENT 1-支付宝 2-微信, status tinyint(4) NOT NULL DEFAULT 0 COMMENT 0-未支付 1-已支付, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_user_id (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4.2 性能优化实践慢查询优化案例-- 原查询执行时间2s SELECT * FROM t_tea WHERE category_id IN ( SELECT id FROM t_category WHERE name LIKE %绿茶% ); -- 优化后添加联合索引后200ms ALTER TABLE t_category ADD INDEX idx_name (name); SELECT t.* FROM t_tea t JOIN t_category c ON t.category_id c.id WHERE c.name LIKE %绿茶%;连接池配置建议Tomcat context.xmlResource namejdbc/teaDB authContainer typejavax.sql.DataSource maxTotal50 maxIdle10 maxWaitMillis30000 usernameroot password加密密码 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/tea_db?useSSLfalseamp;serverTimezoneAsia/Shanghai/5. 部署与调试实战5.1 生产环境部署清单服务器基础配置CentOS 7.6 最小化安装JDK1.8.0_301配置JAVA_HOME环境变量MySQL5.7.34调整innodb_buffer_pool_size2GTomcat9配置server.xml的ConnectorConnector port80 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 compressionon compressableMimeTypetext/html,text/xml,text/css,application/javascript/必做的安全加固删除webapps下所有示例项目修改Tomcat管理密码conf/tomcat-users.xml关闭自动部署Host标签设置autoDeployfalse5.2 常见问题排查指南中文乱码问题四重检查JSP页面头部% page contentTypetext/html;charsetUTF-8 %数据库连接串添加useUnicodetruecharacterEncodingUTF-8Tomcat配置server.xml的Connector添加URIEncodingUTF-8过滤器配置添加CharacterEncodingFilter内存泄漏排查步骤# 1. 查找进程ID ps -ef | grep tomcat # 2. 生成堆转储文件 jmap -dump:formatb,fileheap.hprof pid # 3. 用MAT工具分析可疑对象6. 源码设计与扩展建议6.1 核心工具类实现数据库连接池工具类关键代码public class DataSourceUtil { private static DataSource ds; static { try { Context ctx new InitialContext(); ds (DataSource)ctx.lookup(java:comp/env/jdbc/teaDB); } catch (NamingException e) { throw new ExceptionInInitializerError(e); } } public static Connection getConnection() throws SQLException { return ds.getConnection(); } }6.2 项目扩展方向缓存层改造引入Redis缓存热门茶叶数据使用Guava Cache实现本地二级缓存安全增强方案添加HikariCP连接池替代DBCP使用PreparedStatement全面防止SQL注入重要操作添加日志审计前后端分离改造后端改造成RESTful API前端采用Vue.jsElementUI重构这个项目最让我有成就感的是帮客户将线下茶文化讲座搬到了线上通过视频模块让年轻用户也能接触传统茶道。技术上最大的教训是要提前规划好图片存储方案——我们最初用数据库存图片导致性能瓶颈后来改造为FastDFS分布式存储才解决。