JavaEE实战从零搭建班级通讯录系统附完整源码避坑指南在数字化校园建设的浪潮中班级通讯录系统作为基础但实用的工具既能帮助初学者掌握JavaEE核心技术栈又能解决实际场景中的信息管理需求。本文将带您从零开始用最精简的技术组合ServletJSPMySQL实现一个功能完整的班级通讯录系统特别针对初学者容易踩坑的环节提供解决方案。1. 环境准备与项目初始化1.1 开发环境配置推荐使用以下环境组合JDK 1.8长期支持版本稳定性最佳Apache Tomcat 9.0轻量级Servlet容器MySQL 5.7社区版足够满足需求IntelliJ IDEA Ultimate学生可免费申请教育版注意避免使用过高版本的MySQL如8.0可能遇到驱动兼容性问题。1.2 Maven依赖配置核心依赖仅需以下5个dependencies !-- Servlet API -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- JSTL标签库 -- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.49/version /dependency /dependencies2. 数据库设计与优化2.1 表结构设计采用三范式设计原则核心表结构如下字段名类型约束条件说明student_idVARCHAR(12)PRIMARY KEY学号唯一标识nameVARCHAR(20)NOT NULL学生姓名genderCHAR(1)DEFAULT M性别(M/F)class_nameVARCHAR(30)NOT NULL班级名称phoneVARCHAR(15)UNIQUE手机号码qqVARCHAR(12)QQ号wechatVARCHAR(20)微信号2.2 连接池配置推荐使用Tomcat内置DBCP连接池在context.xml中添加Resource namejdbc/classmateDB authContainer typejavax.sql.DataSource maxTotal20 maxIdle5 maxWaitMillis10000 usernameroot passwordyourpassword driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/classmate_db?useSSLfalseamp;characterEncodingUTF-8/3. 核心功能实现3.1 模糊查询实现在DAO层使用预处理语句防止SQL注入public ListStudent searchByName(String keyword) throws SQLException { String sql SELECT * FROM student WHERE name LIKE ?; try (Connection conn dataSource.getConnection(); PreparedStatement stmt conn.prepareStatement(sql)) { stmt.setString(1, % keyword %); ResultSet rs stmt.executeQuery(); // 结果集处理... } }3.2 班级筛选功能前端使用动态下拉列表select nameclassName option value全部班级/option c:forEach items${classList} varcls option value${cls} ${param.className eq cls ? selected : }${cls}/option /c:forEach /select4. 典型问题解决方案4.1 中文乱码问题统一编码处理方案数据库连接字符串添加characterEncodingUTF-8在Servlet中添加过滤器WebFilter(/*) public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); chain.doFilter(req, resp); } }4.2 重复提交防护采用Token机制防止表单重复提交!-- 在表单中添加隐藏域 -- input typehidden nametoken value${sessionScope.token} !-- Servlet中验证 -- if (!session.getAttribute(token).equals(request.getParameter(token))) { throw new RuntimeException(表单已提交请勿重复操作); }5. 前端交互优化技巧5.1 响应式表格设计使用Bootstrap实现自适应布局div classtable-responsive table classtable table-hover thead classthead-light tr th学号/th th姓名/th !-- 其他表头 -- /tr /thead tbody c:forEach items${studentList} varstu tr td${stu.studentId}/td td${stu.name}/td !-- 其他数据 -- /tr /c:forEach /tbody /table /div5.2 AJAX异步加载使用jQuery实现无刷新查询$(#searchForm).submit(function(e) { e.preventDefault(); $.ajax({ url: search.do, data: $(this).serialize(), success: function(data) { $(#resultTable).html(data); } }); });6. 安全防护措施6.1 密码安全存储采用加盐哈希处理public static String encrypt(String password) { String salt UUID.randomUUID().toString().substring(0, 8); String hash DigestUtils.sha256Hex(password salt); return salt $ hash; } public static boolean verify(String input, String stored) { String[] parts stored.split(\\$); return parts[1].equals(DigestUtils.sha256Hex(input parts[0])); }6.2 XSS防护使用JSTL函数进行HTML转义tdc:out value${stu.name}//td7. 部署与性能调优7.1 Tomcat优化参数在server.xml中调整连接器配置Connector port8080 protocolHTTP/1.1 connectionTimeout20000 maxThreads200 minSpareThreads25 acceptCount100 compressionon compressableMimeTypetext/html,text/xml,text/css,application/javascript/7.2 数据库索引优化为常用查询字段创建索引CREATE INDEX idx_name ON student(name); CREATE INDEX idx_class ON student(class_name);在实际项目中我发现最容易被忽视的是事务处理边界。例如批量导入学生信息时如果没有正确设置事务隔离级别可能导致部分数据插入失败而部分成功的情况。建议在Service层使用声明式事务管理Transactional public void batchImport(ListStudent students) { for (Student stu : students) { if (studentDao.exists(stu.getStudentId())) { throw new RuntimeException(学号重复: stu.getStudentId()); } studentDao.insert(stu); } }