零基础手把手教你写一个基于Javaweb项目——健身房管理系统最近很多同学在找Javaweb项目练手特别是毕业设计季健身房管理系统成为了热门选题。这类项目既能体现完整的Web开发流程又与实际业务场景紧密结合非常适合初学者从零开始掌握Javaweb技术栈。本文将完整拆解健身房管理系统的开发全过程从环境搭建到功能实现提供可运行的源码和详细配置帮助大家快速上手。无论你是Javaweb新手想要练手还是毕业生需要完成毕业设计甚至是工作中需要开发类似管理系统本文都能为你提供完整的解决方案。我们将使用主流的Javaweb技术栈包括Servlet、JSP、MySQL等确保项目结构清晰、代码规范可以直接用于学习和实践。1. 项目概述与需求分析1.1 健身房管理系统核心功能健身房管理系统主要面向健身房管理员和会员需要实现会员管理、课程管理、器械管理、预约管理等核心功能。具体来说系统应该包含以下模块会员管理模块会员信息的增删改查、会员卡办理、会员状态管理课程管理模块健身课程的新增、修改、删除、课程安排器械管理模块健身器械信息维护、使用状态监控预约管理模块会员课程预约、器械使用预约统计报表模块会员统计、收入统计、课程参与率分析1.2 技术选型与架构设计基于Javaweb的技术特点我们选择以下技术栈后端Servlet JSP JavaBean数据库MySQL 8.0前端HTML CSS JavaScript Bootstrap服务器Tomcat 9.0开发工具IntelliJ IDEA或Eclipse系统采用经典的MVC架构模式将业务逻辑、数据展示和用户交互分离提高代码的可维护性和可扩展性。2. 开发环境搭建2.1 JDK与Tomcat安装配置首先需要安装Java开发环境推荐使用JDK 8或11版本# 检查Java版本 java -version # 下载并配置Tomcat # 1. 从Apache官网下载Tomcat 9.x # 2. 解压到指定目录 # 3. 配置环境变量CATALINA_HOME2.2 MySQL数据库安装安装MySQL数据库并创建项目所需的数据库和表-- 创建数据库 CREATE DATABASE gym_management; USE gym_management; -- 创建会员表 CREATE TABLE members ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, phone VARCHAR(20), card_type VARCHAR(20), start_date DATE, end_date DATE, status INT DEFAULT 1 ); -- 创建课程表 CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, coach VARCHAR(50), time_slot VARCHAR(50), max_participants INT, current_participants INT DEFAULT 0 );2.3 IDE配置与项目创建在IntelliJ IDEA中创建新的Javaweb项目选择File → New → Project选择Java Enterprise → Web Application配置项目名称和路径添加Tomcat服务器配置3. 数据库设计与实现3.1 数据库表结构设计完整的数据库表结构设计如下-- 会员表 CREATE TABLE members ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender VARCHAR(10), age INT, phone VARCHAR(20) UNIQUE, email VARCHAR(100), card_type VARCHAR(20) COMMENT 会员卡类型月卡、季卡、年卡, start_date DATE, end_date DATE, balance DECIMAL(10,2) DEFAULT 0, status INT DEFAULT 1 COMMENT 1-正常 0-冻结 ); -- 课程表 CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, coach VARCHAR(50), time_slot VARCHAR(50), duration INT COMMENT 课程时长分钟, max_participants INT, current_participants INT DEFAULT 0, price DECIMAL(10,2), description TEXT ); -- 预约记录表 CREATE TABLE reservations ( id INT PRIMARY KEY AUTO_INCREMENT, member_id INT, course_id INT, reserve_time DATETIME, status VARCHAR(20) DEFAULT pending, FOREIGN KEY (member_id) REFERENCES members(id), FOREIGN KEY (course_id) REFERENCES courses(id) );3.2 数据库连接配置创建数据库连接工具类// DBUtil.java package com.gym.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/gym_management?useSSLfalseserverTimezoneUTC; private static final String USERNAME root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }4. 后端功能实现4.1 会员管理功能实现创建会员实体类和DAO层// Member.java package com.gym.entity; import java.util.Date; public class Member { private int id; private String name; private String gender; private int age; private String phone; private String email; private String cardType; private Date startDate; private Date endDate; private double balance; private int status; // 构造方法、getter和setter省略 } // MemberDAO.java package com.gym.dao; import com.gym.entity.Member; import com.gym.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class MemberDAO { public ListMember getAllMembers() { ListMember members new ArrayList(); String sql SELECT * FROM members WHERE status 1; try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql); ResultSet rs stmt.executeQuery()) { while (rs.next()) { Member member new Member(); member.setId(rs.getInt(id)); member.setName(rs.getString(name)); member.setPhone(rs.getString(phone)); member.setCardType(rs.getString(card_type)); member.setStartDate(rs.getDate(start_date)); member.setEndDate(rs.getDate(end_date)); members.add(member); } } catch (SQLException e) { e.printStackTrace(); } return members; } public boolean addMember(Member member) { String sql INSERT INTO members (name, phone, card_type, start_date, end_date) VALUES (?, ?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql)) { stmt.setString(1, member.getName()); stmt.setString(2, member.getPhone()); stmt.setString(3, member.getCardType()); stmt.setDate(4, new java.sql.Date(member.getStartDate().getTime())); stmt.setDate(5, new java.sql.Date(member.getEndDate().getTime())); return stmt.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } } }4.2 Servlet控制器实现创建会员管理的Servlet// MemberServlet.java package com.gym.servlet; import com.gym.entity.Member; import com.gym.dao.MemberDAO; 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.text.SimpleDateFormat; import java.util.List; WebServlet(/member) public class MemberServlet extends HttpServlet { private MemberDAO memberDAO new MemberDAO(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (list.equals(action)) { listMembers(request, response); } else if (add.equals(action)) { showAddForm(request, response); } else { listMembers(request, response); } } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (add.equals(action)) { addMember(request, response); } } private void listMembers(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListMember members memberDAO.getAllMembers(); request.setAttribute(members, members); request.getRequestDispatcher(/member-list.jsp).forward(request, response); } private void showAddForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher(/member-add.jsp).forward(request, response); } private void addMember(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Member member new Member(); member.setName(request.getParameter(name)); member.setPhone(request.getParameter(phone)); member.setCardType(request.getParameter(cardType)); SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); member.setStartDate(sdf.parse(request.getParameter(startDate))); member.setEndDate(sdf.parse(request.getParameter(endDate))); if (memberDAO.addMember(member)) { response.sendRedirect(member?actionlist); } else { request.setAttribute(error, 添加会员失败); request.getRequestDispatcher(/member-add.jsp).forward(request, response); } } catch (Exception e) { e.printStackTrace(); request.setAttribute(error, 系统错误 e.getMessage()); request.getRequestDispatcher(/member-add.jsp).forward(request, response); } } }5. 前端页面开发5.1 会员列表页面创建会员列表展示页面%-- member-list.jsp --% % page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html head title会员管理/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.1.3/dist/css/bootstrap.min.css relstylesheet /head body div classcontainer mt-4 h2会员列表/h2 a hrefmember?actionadd classbtn btn-primary mb-3添加会员/a c:if test${not empty error} div classalert alert-danger${error}/div /c:if table classtable table-striped thead tr thID/th th姓名/th th电话/th th会员卡类型/th th开始时间/th th结束时间/th th操作/th /tr /thead tbody c:forEach varmember items${members} tr td${member.id}/td td${member.name}/td td${member.phone}/td td${member.cardType}/td td${member.startDate}/td td${member.endDate}/td td a href# classbtn btn-sm btn-warning编辑/a a href# classbtn btn-sm btn-danger删除/a /td /tr /c:forEach /tbody /table /div /body /html5.2 添加会员页面创建会员添加表单页面%-- member-add.jsp --% % page contentTypetext/html;charsetUTF-8 languagejava % html head title添加会员/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.1.3/dist/css/bootstrap.min.css relstylesheet /head body div classcontainer mt-4 h2添加会员/h2 c:if test${not empty error} div classalert alert-danger${error}/div /c:if form actionmember?actionadd methodpost div classmb-3 label forname classform-label姓名/label input typetext classform-control idname namename required /div div classmb-3 label forphone classform-label电话/label input typetel classform-control idphone namephone required /div div classmb-3 label forcardType classform-label会员卡类型/label select classform-control idcardType namecardType required option value月卡月卡/option option value季卡季卡/option option value年卡年卡/option /select /div div classmb-3 label forstartDate classform-label开始时间/label input typedate classform-control idstartDate namestartDate required /div div classmb-3 label forendDate classform-label结束时间/label input typedate classform-control idendDate nameendDate required /div button typesubmit classbtn btn-primary添加/button a hrefmember?actionlist classbtn btn-secondary返回/a /form /div /body /html6. 课程管理模块实现6.1 课程实体与DAO层扩展课程管理功能// Course.java package com.gym.entity; public class Course { private int id; private String name; private String coach; private String timeSlot; private int duration; private int maxParticipants; private int currentParticipants; private double price; private String description; // 构造方法、getter和setter } // CourseDAO.java package com.gym.dao; import com.gym.entity.Course; import com.gym.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class CourseDAO { public ListCourse getAllCourses() { ListCourse courses new ArrayList(); String sql SELECT * FROM courses; try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql); ResultSet rs stmt.executeQuery()) { while (rs.next()) { Course course new Course(); course.setId(rs.getInt(id)); course.setName(rs.getString(name)); course.setCoach(rs.getString(coach)); course.setTimeSlot(rs.getString(time_slot)); course.setMaxParticipants(rs.getInt(max_participants)); course.setCurrentParticipants(rs.getInt(current_participants)); course.setPrice(rs.getDouble(price)); courses.add(course); } } catch (SQLException e) { e.printStackTrace(); } return courses; } }6.2 课程管理Servlet// CourseServlet.java package com.gym.servlet; import com.gym.dao.CourseDAO; import com.gym.entity.Course; 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(/course) public class CourseServlet extends HttpServlet { private CourseDAO courseDAO new CourseDAO(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListCourse courses courseDAO.getAllCourses(); request.setAttribute(courses, courses); request.getRequestDispatcher(/course-list.jsp).forward(request, response); } }7. 系统部署与测试7.1 项目结构配置完整的项目目录结构如下gym-management/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── gym/ │ │ ├── entity/ # 实体类 │ │ ├── dao/ # 数据访问层 │ │ ├── servlet/ # Servlet控制器 │ │ └── util/ # 工具类 │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml # 配置文件 │ ├── css/ # 样式文件 │ ├── js/ # JavaScript文件 │ ├── member-list.jsp # 会员列表页 │ ├── member-add.jsp # 添加会员页 │ ├── course-list.jsp # 课程列表页 │ └── index.jsp # 首页7.2 web.xml配置配置web.xml文件?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 display-name健身房管理系统/display-name welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list !-- 字符编码过滤器 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classcom.gym.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app8. 常见问题与解决方案8.1 数据库连接问题问题现象启动项目时报数据库连接错误解决方案检查MySQL服务是否启动验证数据库连接参数是否正确确认MySQL驱动版本兼容性// 正确的数据库连接配置示例 public class DBUtil { // 使用正确的时区配置 private static final String URL jdbc:mysql://localhost:3306/gym_management?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai; }8.2 中文乱码问题问题现象页面显示或数据库存储出现乱码解决方案确保所有文件编码为UTF-8配置字符编码过滤器数据库连接字符串添加字符集参数8.3 页面跳转问题问题现象Servlet跳转到JSP页面失败解决方案检查JSP文件路径是否正确确认web.xml配置是否正确检查Tomcat部署配置9. 功能扩展与优化建议9.1 系统功能扩展在基础功能之上可以考虑扩展以下功能权限管理区分管理员和普通用户权限微信小程序端开发移动端应用数据统计分析会员增长趋势、课程热度分析短信提醒课程开始前自动提醒在线支付集成支付宝/微信支付9.2 代码优化建议使用连接池提高数据库连接效率// 使用Druid连接池示例 public class DruidUtil { private static DataSource dataSource; static { try { Properties props new Properties(); props.load(DruidUtil.class.getClassLoader().getResourceAsStream(druid.properties)); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { e.printStackTrace(); } } }添加日志记录使用Log4j2记录系统运行日志异常统一处理创建全局异常处理器数据验证前后端双重数据验证9.3 安全优化SQL注入防护始终使用PreparedStatementXSS防护对用户输入进行过滤会话管理合理设置session超时时间密码加密使用BCrypt等加密算法10. 项目实战技巧10.1 开发效率提升使用代码模板创建常用的代码片段模板调试技巧熟练使用IDE调试功能版本控制使用Git进行代码管理自动化部署配置一键部署脚本10.2 学习路径建议对于想要深入学习Javaweb开发的同学建议按以下路径学习基础阶段Java基础 → HTML/CSS/JavaScript → Servlet/JSP进阶阶段Spring框架 → MyBatis → Spring Boot高级阶段微服务架构 → 分布式系统 → 性能优化这个健身房管理系统项目涵盖了Javaweb开发的核心技术点通过实际编码可以快速掌握Web开发的基本流程。建议在完成基础功能后尝试添加更多业务功能如会员卡续费、课程评价、教练管理等逐步完善系统功能。项目源码已整理完成包含完整的数据库脚本和部署文档可以直接下载使用。在实际开发过程中遇到问题可以参考本文的解决方案或者查阅相关技术文档。希望这个项目能帮助大家顺利掌握Javaweb开发技能完成学业或工作中的开发任务。
JavaWeb健身房管理系统开发实战:从零搭建完整项目
零基础手把手教你写一个基于Javaweb项目——健身房管理系统最近很多同学在找Javaweb项目练手特别是毕业设计季健身房管理系统成为了热门选题。这类项目既能体现完整的Web开发流程又与实际业务场景紧密结合非常适合初学者从零开始掌握Javaweb技术栈。本文将完整拆解健身房管理系统的开发全过程从环境搭建到功能实现提供可运行的源码和详细配置帮助大家快速上手。无论你是Javaweb新手想要练手还是毕业生需要完成毕业设计甚至是工作中需要开发类似管理系统本文都能为你提供完整的解决方案。我们将使用主流的Javaweb技术栈包括Servlet、JSP、MySQL等确保项目结构清晰、代码规范可以直接用于学习和实践。1. 项目概述与需求分析1.1 健身房管理系统核心功能健身房管理系统主要面向健身房管理员和会员需要实现会员管理、课程管理、器械管理、预约管理等核心功能。具体来说系统应该包含以下模块会员管理模块会员信息的增删改查、会员卡办理、会员状态管理课程管理模块健身课程的新增、修改、删除、课程安排器械管理模块健身器械信息维护、使用状态监控预约管理模块会员课程预约、器械使用预约统计报表模块会员统计、收入统计、课程参与率分析1.2 技术选型与架构设计基于Javaweb的技术特点我们选择以下技术栈后端Servlet JSP JavaBean数据库MySQL 8.0前端HTML CSS JavaScript Bootstrap服务器Tomcat 9.0开发工具IntelliJ IDEA或Eclipse系统采用经典的MVC架构模式将业务逻辑、数据展示和用户交互分离提高代码的可维护性和可扩展性。2. 开发环境搭建2.1 JDK与Tomcat安装配置首先需要安装Java开发环境推荐使用JDK 8或11版本# 检查Java版本 java -version # 下载并配置Tomcat # 1. 从Apache官网下载Tomcat 9.x # 2. 解压到指定目录 # 3. 配置环境变量CATALINA_HOME2.2 MySQL数据库安装安装MySQL数据库并创建项目所需的数据库和表-- 创建数据库 CREATE DATABASE gym_management; USE gym_management; -- 创建会员表 CREATE TABLE members ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, phone VARCHAR(20), card_type VARCHAR(20), start_date DATE, end_date DATE, status INT DEFAULT 1 ); -- 创建课程表 CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, coach VARCHAR(50), time_slot VARCHAR(50), max_participants INT, current_participants INT DEFAULT 0 );2.3 IDE配置与项目创建在IntelliJ IDEA中创建新的Javaweb项目选择File → New → Project选择Java Enterprise → Web Application配置项目名称和路径添加Tomcat服务器配置3. 数据库设计与实现3.1 数据库表结构设计完整的数据库表结构设计如下-- 会员表 CREATE TABLE members ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, gender VARCHAR(10), age INT, phone VARCHAR(20) UNIQUE, email VARCHAR(100), card_type VARCHAR(20) COMMENT 会员卡类型月卡、季卡、年卡, start_date DATE, end_date DATE, balance DECIMAL(10,2) DEFAULT 0, status INT DEFAULT 1 COMMENT 1-正常 0-冻结 ); -- 课程表 CREATE TABLE courses ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, coach VARCHAR(50), time_slot VARCHAR(50), duration INT COMMENT 课程时长分钟, max_participants INT, current_participants INT DEFAULT 0, price DECIMAL(10,2), description TEXT ); -- 预约记录表 CREATE TABLE reservations ( id INT PRIMARY KEY AUTO_INCREMENT, member_id INT, course_id INT, reserve_time DATETIME, status VARCHAR(20) DEFAULT pending, FOREIGN KEY (member_id) REFERENCES members(id), FOREIGN KEY (course_id) REFERENCES courses(id) );3.2 数据库连接配置创建数据库连接工具类// DBUtil.java package com.gym.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/gym_management?useSSLfalseserverTimezoneUTC; private static final String USERNAME root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USERNAME, PASSWORD); } }4. 后端功能实现4.1 会员管理功能实现创建会员实体类和DAO层// Member.java package com.gym.entity; import java.util.Date; public class Member { private int id; private String name; private String gender; private int age; private String phone; private String email; private String cardType; private Date startDate; private Date endDate; private double balance; private int status; // 构造方法、getter和setter省略 } // MemberDAO.java package com.gym.dao; import com.gym.entity.Member; import com.gym.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class MemberDAO { public ListMember getAllMembers() { ListMember members new ArrayList(); String sql SELECT * FROM members WHERE status 1; try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql); ResultSet rs stmt.executeQuery()) { while (rs.next()) { Member member new Member(); member.setId(rs.getInt(id)); member.setName(rs.getString(name)); member.setPhone(rs.getString(phone)); member.setCardType(rs.getString(card_type)); member.setStartDate(rs.getDate(start_date)); member.setEndDate(rs.getDate(end_date)); members.add(member); } } catch (SQLException e) { e.printStackTrace(); } return members; } public boolean addMember(Member member) { String sql INSERT INTO members (name, phone, card_type, start_date, end_date) VALUES (?, ?, ?, ?, ?); try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql)) { stmt.setString(1, member.getName()); stmt.setString(2, member.getPhone()); stmt.setString(3, member.getCardType()); stmt.setDate(4, new java.sql.Date(member.getStartDate().getTime())); stmt.setDate(5, new java.sql.Date(member.getEndDate().getTime())); return stmt.executeUpdate() 0; } catch (SQLException e) { e.printStackTrace(); return false; } } }4.2 Servlet控制器实现创建会员管理的Servlet// MemberServlet.java package com.gym.servlet; import com.gym.entity.Member; import com.gym.dao.MemberDAO; 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.text.SimpleDateFormat; import java.util.List; WebServlet(/member) public class MemberServlet extends HttpServlet { private MemberDAO memberDAO new MemberDAO(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (list.equals(action)) { listMembers(request, response); } else if (add.equals(action)) { showAddForm(request, response); } else { listMembers(request, response); } } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (add.equals(action)) { addMember(request, response); } } private void listMembers(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListMember members memberDAO.getAllMembers(); request.setAttribute(members, members); request.getRequestDispatcher(/member-list.jsp).forward(request, response); } private void showAddForm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher(/member-add.jsp).forward(request, response); } private void addMember(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { Member member new Member(); member.setName(request.getParameter(name)); member.setPhone(request.getParameter(phone)); member.setCardType(request.getParameter(cardType)); SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); member.setStartDate(sdf.parse(request.getParameter(startDate))); member.setEndDate(sdf.parse(request.getParameter(endDate))); if (memberDAO.addMember(member)) { response.sendRedirect(member?actionlist); } else { request.setAttribute(error, 添加会员失败); request.getRequestDispatcher(/member-add.jsp).forward(request, response); } } catch (Exception e) { e.printStackTrace(); request.setAttribute(error, 系统错误 e.getMessage()); request.getRequestDispatcher(/member-add.jsp).forward(request, response); } } }5. 前端页面开发5.1 会员列表页面创建会员列表展示页面%-- member-list.jsp --% % page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html head title会员管理/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.1.3/dist/css/bootstrap.min.css relstylesheet /head body div classcontainer mt-4 h2会员列表/h2 a hrefmember?actionadd classbtn btn-primary mb-3添加会员/a c:if test${not empty error} div classalert alert-danger${error}/div /c:if table classtable table-striped thead tr thID/th th姓名/th th电话/th th会员卡类型/th th开始时间/th th结束时间/th th操作/th /tr /thead tbody c:forEach varmember items${members} tr td${member.id}/td td${member.name}/td td${member.phone}/td td${member.cardType}/td td${member.startDate}/td td${member.endDate}/td td a href# classbtn btn-sm btn-warning编辑/a a href# classbtn btn-sm btn-danger删除/a /td /tr /c:forEach /tbody /table /div /body /html5.2 添加会员页面创建会员添加表单页面%-- member-add.jsp --% % page contentTypetext/html;charsetUTF-8 languagejava % html head title添加会员/title link hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.1.3/dist/css/bootstrap.min.css relstylesheet /head body div classcontainer mt-4 h2添加会员/h2 c:if test${not empty error} div classalert alert-danger${error}/div /c:if form actionmember?actionadd methodpost div classmb-3 label forname classform-label姓名/label input typetext classform-control idname namename required /div div classmb-3 label forphone classform-label电话/label input typetel classform-control idphone namephone required /div div classmb-3 label forcardType classform-label会员卡类型/label select classform-control idcardType namecardType required option value月卡月卡/option option value季卡季卡/option option value年卡年卡/option /select /div div classmb-3 label forstartDate classform-label开始时间/label input typedate classform-control idstartDate namestartDate required /div div classmb-3 label forendDate classform-label结束时间/label input typedate classform-control idendDate nameendDate required /div button typesubmit classbtn btn-primary添加/button a hrefmember?actionlist classbtn btn-secondary返回/a /form /div /body /html6. 课程管理模块实现6.1 课程实体与DAO层扩展课程管理功能// Course.java package com.gym.entity; public class Course { private int id; private String name; private String coach; private String timeSlot; private int duration; private int maxParticipants; private int currentParticipants; private double price; private String description; // 构造方法、getter和setter } // CourseDAO.java package com.gym.dao; import com.gym.entity.Course; import com.gym.util.DBUtil; import java.sql.*; import java.util.ArrayList; import java.util.List; public class CourseDAO { public ListCourse getAllCourses() { ListCourse courses new ArrayList(); String sql SELECT * FROM courses; try (Connection conn DBUtil.getConnection(); PreparedStatement stmt conn.prepareStatement(sql); ResultSet rs stmt.executeQuery()) { while (rs.next()) { Course course new Course(); course.setId(rs.getInt(id)); course.setName(rs.getString(name)); course.setCoach(rs.getString(coach)); course.setTimeSlot(rs.getString(time_slot)); course.setMaxParticipants(rs.getInt(max_participants)); course.setCurrentParticipants(rs.getInt(current_participants)); course.setPrice(rs.getDouble(price)); courses.add(course); } } catch (SQLException e) { e.printStackTrace(); } return courses; } }6.2 课程管理Servlet// CourseServlet.java package com.gym.servlet; import com.gym.dao.CourseDAO; import com.gym.entity.Course; 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(/course) public class CourseServlet extends HttpServlet { private CourseDAO courseDAO new CourseDAO(); Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ListCourse courses courseDAO.getAllCourses(); request.setAttribute(courses, courses); request.getRequestDispatcher(/course-list.jsp).forward(request, response); } }7. 系统部署与测试7.1 项目结构配置完整的项目目录结构如下gym-management/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── gym/ │ │ ├── entity/ # 实体类 │ │ ├── dao/ # 数据访问层 │ │ ├── servlet/ # Servlet控制器 │ │ └── util/ # 工具类 │ └── webapp/ │ ├── WEB-INF/ │ │ └── web.xml # 配置文件 │ ├── css/ # 样式文件 │ ├── js/ # JavaScript文件 │ ├── member-list.jsp # 会员列表页 │ ├── member-add.jsp # 添加会员页 │ ├── course-list.jsp # 课程列表页 │ └── index.jsp # 首页7.2 web.xml配置配置web.xml文件?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 display-name健身房管理系统/display-name welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list !-- 字符编码过滤器 -- filter filter-nameCharacterEncodingFilter/filter-name filter-classcom.gym.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app8. 常见问题与解决方案8.1 数据库连接问题问题现象启动项目时报数据库连接错误解决方案检查MySQL服务是否启动验证数据库连接参数是否正确确认MySQL驱动版本兼容性// 正确的数据库连接配置示例 public class DBUtil { // 使用正确的时区配置 private static final String URL jdbc:mysql://localhost:3306/gym_management?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai; }8.2 中文乱码问题问题现象页面显示或数据库存储出现乱码解决方案确保所有文件编码为UTF-8配置字符编码过滤器数据库连接字符串添加字符集参数8.3 页面跳转问题问题现象Servlet跳转到JSP页面失败解决方案检查JSP文件路径是否正确确认web.xml配置是否正确检查Tomcat部署配置9. 功能扩展与优化建议9.1 系统功能扩展在基础功能之上可以考虑扩展以下功能权限管理区分管理员和普通用户权限微信小程序端开发移动端应用数据统计分析会员增长趋势、课程热度分析短信提醒课程开始前自动提醒在线支付集成支付宝/微信支付9.2 代码优化建议使用连接池提高数据库连接效率// 使用Druid连接池示例 public class DruidUtil { private static DataSource dataSource; static { try { Properties props new Properties(); props.load(DruidUtil.class.getClassLoader().getResourceAsStream(druid.properties)); dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { e.printStackTrace(); } } }添加日志记录使用Log4j2记录系统运行日志异常统一处理创建全局异常处理器数据验证前后端双重数据验证9.3 安全优化SQL注入防护始终使用PreparedStatementXSS防护对用户输入进行过滤会话管理合理设置session超时时间密码加密使用BCrypt等加密算法10. 项目实战技巧10.1 开发效率提升使用代码模板创建常用的代码片段模板调试技巧熟练使用IDE调试功能版本控制使用Git进行代码管理自动化部署配置一键部署脚本10.2 学习路径建议对于想要深入学习Javaweb开发的同学建议按以下路径学习基础阶段Java基础 → HTML/CSS/JavaScript → Servlet/JSP进阶阶段Spring框架 → MyBatis → Spring Boot高级阶段微服务架构 → 分布式系统 → 性能优化这个健身房管理系统项目涵盖了Javaweb开发的核心技术点通过实际编码可以快速掌握Web开发的基本流程。建议在完成基础功能后尝试添加更多业务功能如会员卡续费、课程评价、教练管理等逐步完善系统功能。项目源码已整理完成包含完整的数据库脚本和部署文档可以直接下载使用。在实际开发过程中遇到问题可以参考本文的解决方案或者查阅相关技术文档。希望这个项目能帮助大家顺利掌握Javaweb开发技能完成学业或工作中的开发任务。