ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JavaWeb图书管理系统源码解析:环境搭建、核心模块与二次开发

JavaWeb图书管理系统源码解析:环境搭建、核心模块与二次开发 简介JavaWeb开发中图书管理系统是经典的综合性实战项目。它以数据库设计和事务处理为核心整合Servlet、JSP、JDBC等基础技术实现用户认证、分页查询、增删改查与借阅归还等完整业务流。掌握这些底层原理是理解企业级Web应用分层架构与状态管理的关键。无论是高校课程设计、毕业设计还是小型图书馆信息化建设这类系统都具备很高的工程参考价值。这套可直接运行的源码覆盖环境搭建、数据库脚本导入、常见故障排查与二次开发验证技巧帮助开发者快速跑通并深入理解JavaWeb全栈开发的核心链路。1. 一套能直接交差的 JavaWeb 图书管理系统源码、数据库与文档该怎么用如果你正在找 JavaWeb 课程设计或期末大作业的完整参考这套图书管理系统源码值得花几分钟看完这篇拆解。它不是我自吹的什么企业级架构而是一个功能完整、能直接运行、注释清楚到小白也能跟完的典型 JavaWeb 项目——按 97 分的标准手打出来的那种。适合三类人期末赶工的学生、想系统看一遍 Servlet JSP Bootstrap 整合套路的初学者、以及想拿现成项目二次开发做毕设或小图书馆管理系统的开发者。它的价值在于完整后端 Java 代码、前端页面、数据库 SQL 脚本、系统设计文档全部给齐你不用再上网东拼西凑。下文会从项目结构和运行环境讲起把导入步骤、数据库脚本执行、核心模块代码、常见坑和二次开发的验证技巧一层层拆开照着走就能跑起来。2. 项目全景前端样式、后端代码与文档三件套怎么配合2.1 从样式文件看前端技术选型拿到压缩包解压后你会看到一批前端资源文件bootstrap.css、bootstrap.min.css、bootstrap-theme.css、bootstrap-theme.min.css、layui.css、layer.css、layui.mobile.css、laydate.css、code.css还有 iconfont.eot 字体文件。这里其实暴露了前端技术栈——Bootstrap 3 Layui 混用。Bootstrap 负责整体响应式布局和基础组件Layui 的 layer 弹窗、laydate 日期选择器用来做交互层。为什么混用Bootstrap 表格和栅格系统成熟Layui 的 laydate 在借阅日期选择场景下更好用两个都是成熟库直接 CDN 或本地引入省去自己写 JavaScript 的麻烦。iconfont.eot 是字体图标文件页面上的小图标靠它渲染。前端文件在部署时的目录结构有讲究webapp/ ├── static/ │ ├── css/ // bootstrap.css、layui.css 等样式 │ ├── fonts/ // iconfont.eot │ └── js/ // bootstrap.js、layui.js 等脚本 ├── WEB-INF/ │ ├── web.xml │ └── lib/ // JDBC 驱动、Servlet API 等 jar 包 ├── index.jsp // 登录或首页入口 └── book/ ├── list.jsp // 图书列表页面 ├── add.jsp └── edit.jsp注意静态资源放 webapp 根目录还是 WEB-INF 下的区别放根目录可以直接用浏览器访问放 WEB-INF 下则必须通过 Controller 转发更安全但配置多一层。我见过不少同学把 css 误放到 WEB-INF 下结果页面全部裸奔没有样式这类问题第 5 章会专门说。2.2 看数据库脚本能反推出哪些业务表项目的 数据库代码.zip 解压后通常是 .sql 文件。打开脚本你会发现建表顺序是经过设计的先建用户表再建图书分类表然后是图书表最后是借阅记录表。这个顺序不是随意的——外键关系决定了必须先有被引用的表。图书表的 category_id 关联分类表借阅记录表的 book_id、user_id 关联图书表和用户表。典型的表结构设计可以参照这个思路-- 用户表读者和管员共表靠 role 字段区分 CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(64) NOT NULL, real_name VARCHAR(50), role TINYINT DEFAULT 0, -- 0 普通用户1 管理员 create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 图书分类表 CREATE TABLE t_category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL ); -- 图书表 CREATE TABLE t_book ( id INT PRIMARY KEY AUTO_INCREMENT, isbn VARCHAR(20) UNIQUE, name VARCHAR(100) NOT NULL, author VARCHAR(50), publisher VARCHAR(100), category_id INT, stock INT DEFAULT 1, FOREIGN KEY (category_id) REFERENCES t_category(id) ); -- 借阅记录表 CREATE TABLE t_borrow ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, book_id INT, borrow_time DATETIME, return_time DATETIME, status TINYINT, -- 0 借出1 已还 FOREIGN KEY (user_id) REFERENCES t_user(id), FOREIGN KEY (book_id) REFERENCES t_book(id) );设计层面最需要注意的坑是图书表不能直接存分类名称必须存 category_id 外键。很多新手为了省事直接存「文学」「科学」这种字符串后期想改分类名得全表更新。文档说明里应该会有 ER 图或表关系描述对照着看能更快理解代码里的 JOIN 逻辑。2.3 文档说明部分要重点关注哪几页文档说明是整个项目的灵魂重点看三块一是数据库设计说明包括每张表的字段含义和关系二是模块划分登录验证、图书管理、借阅管理分别对应哪些 Servlet 和 JSP三是部署说明JDK 版本、Tomcat 版本、数据库版本这些环境要求。文档里如果给了接口定义比如 /book/list 返回什么数据、参数怎么传二次开发时就能直接照着加功能。使用文档时注意这份文档是给人读的不是给机器读的。你按它配置完环境、导入完数据库再对照代码看每个功能模块的实现方式学习效率最高。直接复制代码不读文档遇到报错会无从下手。3. 把项目跑起来IDEA 导入、Tomcat 配置与数据库初始化3.1 环境版本搭配是第一步硬门槛JavaWeb 项目跑不起来八成是环境版本问题。这套系统如果用的 JDK 1.8 Tomcat 8 MySQL 5.7是最稳妥的组合。JDK 版本太高比如 17老项目里的一些反射或 JSP 编译方式可能有兼容问题MySQL 8.0 以上要注意连接驱动版本和时区配置。先确认你本机的 JDK、Tomcat、MySQL 版本再动手下一步。版本搭配参考表组件推荐版本说明JDK1.8JavaWeb 老项目最稳定编译器兼容性好Tomcat8.5 或 9.0Servlet 3.1/4.0 支持完善MySQL5.7与 8.0 相比少了时区和认证插件问题JDBC 驱动mysql-connector-java 5.1.x适配 MySQL 5.x 系列IDEA2020 以上均可社区版也能跑需要配置 Tomcat 插件如果你本机装的是 MySQL 8.0连接 URL 里必须加上serverTimezoneAsia/Shanghai和useSSLfalse否则会报时区错误。这个在第 5 章避坑里会再提。3.2 IDEA 导入的完整操作与关键参数打开 IDEA 后按这个顺序操作File - New - Project from Existing Sources - 选择解压后的项目目录 - 选择 Import project from external model - 选 Eclipse 或 Maven看项目是哪种结构 - 一路 Next 完成导入如果是 Maven 项目IDEA 会自动读取 pom.xml 下载依赖如果是原生 Web 项目需要手动把 lib 目录下的 jar 包 Add as Library。这里有个容易翻车的点导入后项目结构不完整src 目录没被标记为 Sources Root导致所有 Java 类全部爆红。导入完成后做三件事1. Project Structure - Modules - 把 src 标记为 Sources 2. Project Structure - Libraries - 添加 WEB-INF/lib 下的全部 jar 包 3. Project Structure - Artifacts - 确认有 Web Exploded 打包方式然后配置 TomcatRun - Edit Configurations - - Tomcat Server - Local - Application server 选择本机 Tomcat 安装目录 - Deployment 标签页 - - Artifact - 选项目 war exploded - Server 标签页 - HTTP port 填 8080或自定义 - 设置 Application context 为 /bookmanager和实际路径一致配置完成后启动 Tomcat浏览器访问http://localhost:8080/bookmanager能看到登录页说明部署成功。这个 Application context 路径很关键它决定了访问 URL 的前缀如果项目里的跳转写的是绝对路径/book/list而 context 不是/bookmanager就会出现 404。3.3 数据库脚本执行navicat 还是命令行数据库初始化建议用可视化工具比命令行直观得多。以 Navicat 为例连接 MySQL 后右键 - 运行 SQL 文件选择 数据库代码.zip 里解压出来的 .sql 脚本执行完刷新就能看到表。如果是命令行执行方式是这样mysql -u root -p create database db_bookmanager default character set utf8; use db_bookmanager; source /path/to/bookmanager.sql;我一般用命令行更多因为 source 能看到每条 SQL 的实际执行结果哪条语句报错一目了然。注意执行前先建好数据库并且指定 utf8 字符集。如果脚本里已有CREATE DATABASE语句上面那步可以跳过如果没有你先建库再 source 进去否则会报「No database selected」。执行完后验证一下show tables; select * from t_user;能看到预置的图书、用户数据说明导入成功。这里要特别留意脚本里预置的管理员账号密码不能改因为后面登录要用它测试。文档说明里通常写了初始账号一般是 admin/admin 或 admin/123456找不到就翻 SQL 脚本看 INSERT 语句。4. 核心模块拆解登录验证、图书 CRUD 与借阅归还的业务流4.1 登录验证与 Session 权限控制图书管理系统的登录模块是整个项目第一个核心。它做的事情很简单前端表单提交用户名密码后端查数据库比对比对成功就把用户信息放进 Session比对失败返回登录页并提示。代码路径通常是 LoginServlet - UserDao - t_user 表。看代码时注意它的 SQL 写法public User login(String username, String password) { String sql SELECT * FROM t_user WHERE username ? AND password ?; // 用 PreparedStatement 防 SQL 注入不要用字符串拼接 try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setRole(rs.getInt(role)); return user; } } catch (Exception e) { e.printStackTrace(); } return null; }注意这里用了?占位符和 PreparedStatement而不是字符串拼接 SQL——这是区分作业水平的一个细节。直接用SELECT * FROM t_user WHERE username username 这种写法输入 or 11 --就能直接登录成功这是经典的 SQL 注入漏洞。你拿到的这份源码里如果已经用了 PreparedStatement说明作者确实有意识做了防护。登录成功后的 Session 处理是第二个关键点HttpSession session request.getSession(); session.setAttribute(loginUser, user); // 重定向而不是转发防止表单重复提交 response.sendRedirect(request.getContextPath() /book/list);sendRedirect和forward的区别重定向是浏览器重新发起一次请求地址栏会变化刷新不会重复提交表单转发是服务器内部跳转地址栏不变。这里用重定向是正确的做法。权限验证方面写一个过滤器Filter拦截所有需要登录的请求从 Session 里取用户取不到就重定向到登录页。4.2 图书管理模块分页查询与增删改查图书列表页是整个系统信息量最大的页面。它通常包含搜索框按书名或 ISBN 模糊查询、图书表格书名、作者、出版社、分类、库存、分页导航。后端对应的 BookServlet 里 doGet 方法处理查询请求核心代码是这个分页逻辑int pageNum Integer.parseInt(request.getParameter(pageNum)); int pageSize 5; // 每页 5 条 String keyword request.getParameter(keyword); // 计算总记录数和总页数 int totalCount bookDao.count(keyword); int totalPages (int) Math.ceil(totalCount * 1.0 / pageSize); // 查询当前页数据limit 是 MySQL 的分页语法 String sql SELECT b.*, c.name AS categoryName FROM t_book b LEFT JOIN t_category c ON b.category_id c.id WHERE b.name LIKE ? OR b.isbn LIKE ? LIMIT ?, ?; ListBook books bookDao.queryByPage(keyword, (pageNum - 1) * pageSize, pageSize); request.setAttribute(books, books); request.setAttribute(pageNum, pageNum); request.setAttribute(totalPages, totalPages); request.getRequestDispatcher(/book/list.jsp).forward(request, response);页码传参的坑在pageNum越界——用户手动改 URL 参数传 pageNum999后端如果不做边界判断limit会查询到空数据页面一片空白。更严重点如果传负数MySQL 会报错。所以代码里通常要加if (pageNum 1) pageNum 1;和if (pageNum totalPages) pageNum totalPages;的处理。新增和编辑图书走同一个页面 add.jsp 和 edit.jsp表单字段对应 t_book 表的列。保存时后端的校验逻辑要关注ISBN 不能重复数据库有 unique 约束但后端要先查一遍给出友好提示库存不能为负数。修改库存这个操作要小心并发问题——极端情况下两个人同时借同一本书最后一本会被借超。小系统不做乐观锁问题不大但你要知道这个边界在哪。4.3 借阅归还流程与库存联动借阅功能是图书管理系统里最容易写崩的部分因为涉及两张表的联动更新。业务规则是用户点击借阅 → 检查图书库存是否大于 0 → 插入一条借阅记录 → 图书库存减 1 → 用户归还 → 更新借阅记录归还时间 → 图书库存加 1。这个事务控制做得对不对直接决定系统在异常情况下会不会出现「书借了但库存没减」的数据不一致问题。借阅操作的 Java 代码通常长这样Transactional // 如果用了 Spring加这个注解保证事务 public void borrowBook(int userId, int bookId) { // 1. 查库存 Book book bookDao.findById(bookId); if (book.getStock() 0) { throw new RuntimeException(库存不足); } // 2. 插入借阅记录 borrowDao.insert(userId, bookId); // 3. 更新库存 bookDao.decreaseStock(bookId); }如果项目没用 Spring 而是原生的 JDBC Servlet事务需要手动控制Connection conn DBUtil.getConnection(); try { conn.setAutoCommit(false); // 关闭自动提交 // 执行插入借阅记录 // 执行更新库存 conn.commit(); // 全部成功才提交 } catch (Exception e) { conn.rollback(); // 任何一步失败都回滚 } finally { conn.setAutoCommit(true); }这套代码的价值在于它演示了一个最基本的数据库事务场景要么都成功要么都失败。很多初学者写的借阅功能是「先插记录再减库存」中间没加事务控制一旦第二条 SQL 执行失败就出现借阅记录存在但库存没减的脏数据。你阅读这份源码时重点看它有没有处理这个事务这是区分 60 分和 90 分设计的一个关键细节。借阅记录的展示页面会关联查询用户名、书名、借出时间和状态SQL 用 JOIN 关联 t_user 和 t_book 两张表。归还操作实际上是一个 UPDATE 语句把 status 改为 1、填充 return_time然后对图书库存 1。归还时的边界情况是重复归还——用户连续点两次归还按钮库存会被多加一次后端如果没有判断当前记录 status 是否已经是「已还」就会出问题。5. 项目跑不起来的常见坑与排查记录5.1 404 页面部署路径与项目结构不对现象Tomcat 启动成功但访问http://localhost:8080/项目名显示 404。原因最常见的是 Artifact 部署的 Application context 和代码里写的跳转路径不一致。代码里写的是/book/list但 Artifact context 配置成了/导致所有相对路径全部错位。其次是项目没打包成 Artifact 就直接启动了 TomcatIDEA 只启动了空 Tomcat 没带项目。解决打开 Run Configuration确认 Deployment 标签页里有项目的 Artifact并且 Application context 和你的访问路径一致。如果代码里用了绝对路径/book/listcontext 配成/反而更保险如果代码里用的是${pageContext.request.contextPath}动态前缀那 context 配什么都行。5.2 页面有数据但样式全乱CSS 路径和静态资源放错位置现象列表页能看到图书数据但所有样式丢失页面惨不忍睹。原因两个可能。一是页面里引用 CSS 用的是hrefcss/bootstrap.min.css这种相对路径当前 URL 层级一变比如从/book/list变到/book/detail/1相对路径就找不到文件了。二是静态资源放到了 WEB-INF 目录下浏览器无法直接访问。解决把 css、js、fonts 统一放到 webapp/static 目录下JSP 页面里引用路径改成绝对路径c:set varctx value${pageContext.request.contextPath}/然后写href${ctx}/static/css/bootstrap.min.css。启动后直接在浏览器访问http://localhost:8080/项目名/static/css/bootstrap.min.css能打开说明路径没问题打不开就要检查目录结构。5.3 数据库连接报错驱动、时区、字符集三连现象启动项目后点击登录或列表页页面报 500 错误控制台显示ClassNotFoundException或SQLException: The server time zone value。原因ClassNotFoundException是 JDBC 驱动 jar 包没导进来大概率是 IDEA 里没有把 lib 目录下的 jar 包 Add as Library。时区报错是 MySQL 8.0 以上版本默认使用 UTC 时区和本地时间差 8 小时驱动连接时校验不通过。解决Project Structure - Libraries - 把 WEB-INF/lib 下的 mysql-connector-java.jar 加进来。时区问题在 JDBC 连接 URL通常在 db.properties 或 JDBCUtil.java 里加上参数jdbc.urljdbc:mysql://localhost:3306/db_bookmanager?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai注意characterEncodingutf8是必须的否则中文数据乱码serverTimezone在 MySQL 5.7 下可以不写但写上没坏处。另外确认数据库本身字符集是 utf8可以用show create database db_bookmanager;查看。5.4 登录后跳转回登录页Session 作用域和过滤器误伤现象登录成功后短暂进入首页刷新一下或点个链接又跳回登录页。原因登录成功的 Session 没存住或者过滤器把所有请求都拦截了。前者常见于 Session 配置了短超时Tomcat 默认 30 分钟一般够用后者是真凶——Filter 里判断用户是否登录时把登录接口本身也拦截了导致永远无法登录。解决检查过滤器代码排除登录相关的 URLpublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) res; String uri request.getRequestURI(); // 登录接口和静态资源直接放行 if (uri.endsWith(login.jsp) || uri.contains(/static/) || uri.endsWith(LoginServlet)) { chain.doFilter(req, res); return; } HttpSession session request.getSession(); if (session.getAttribute(loginUser) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } chain.doFilter(req, res); }特别注意/static/路径要放行。很多系统的登录页引用了 css js由于过滤器拦截页面加载不出样式用户看着以为系统坏了其实是过滤器把静态资源也拦了。5.5 中文乱码请求参数和数据库双端编码不一致现象页面显示中文正常但往数据库里插入的数据变「???」。原因三层编码不一致。第一层 JSP 页面本身的pageEncoding不是 UTF-8第二层 Servlet 接收请求参数时没设置请求编码第三层 MySQL 表字符集不是 utf8或者 JDBC URL 没指定 characterEncoding。解决统一设置为 UTF-8。建议写一个 CharacterEncodingFilterpublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { request.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); chain.doFilter(request, response); }同时在 web.xml 里把这个过滤器注册在最前面保证所有请求都经过。数据库侧确认表和库的字符集都是 utf8侧边栏执行ALTER TABLE t_book CONVERT TO CHARACTER SET utf8;可以一键转换存量表。JSP 页面顶部写上% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%。5.6 Tomcat 部署时端口被占用现象启动 Tomcat 时控制台报Port 8080 was already in use。原因之前启动的 Tomcat 服务没关干净或者本机其他程序占用了 8080 端口。解决用命令查占用进程并杀掉# Windows netstat -ano | findstr 8080 taskkill /PID 进程号 /F # macOS / Linux lsof -i:8080 kill -9 进程号嫌麻烦也可以直接改 Tomcat 端口在 conf/server.xml 里把Connector port8080改成别的端口比如 8081。但要注意改完后访问路径也要跟着变而且如果项目代码里有硬编码http://localhost:8080的跳转地址那也得同步改。5.7 启动成功但页面空白JSP 编译错误与控制台日志查询现象Tomcat 启动无报错浏览器访问页面全白F12 控制台有很多 JS 报错。原因JSP 页面本身有 Java 代码片段Scriptlet写错了编译失败但不一定在启动时报错JSP 是首次访问时才编译。也可能是引用的 JS 库冲突Bootstrap 和 Layui 的全局变量互相覆盖。解决直接访问该 JSP 对应的 URL然后看 Tomcat 的 catalina.out 日志JSP 编译异常会打出具体的行号和错误描述。修完重新部署再访问。JS 冲突的问题建议 Layui 只在弹窗和日期组件里用表格和按钮样式全走 Bootstrap避免两个框架同时初始化同一个页面元素。6. 二次开发验证技巧从读代码到改功能6.1 用数据库字段反推改造点图书管理系统最常见的二次开发需求是加字段。比如图书表增加「价格」和「上架时间」两个字段这个需求听起来简单但涉及的点至少有四处数据库加列、Book 实体类加属性、新增和编辑 JSP 的表单加输入框、列表页 JSP 加表头。顺序一定是先改数据库再改代码ALTER TABLE t_book ADD COLUMN price DECIMAL(10,2) DEFAULT 0.00 COMMENT 定价; ALTER TABLE t_book ADD COLUMN publish_date DATE COMMENT 上架时间;然后同步修改 Book.java 实体类、BookDao 的增删改查 SQL、add.jsp 和 edit.jsp 的表单、list.jsp 的表头列。这个流程走一遍你对 MVC 三层结构的理解会比看十遍书都深。改完以后建议把整个项目的运行验证点列成一个核对表我一般会按这个顺序过一遍验证项操作步骤预期结果登录模块正确密码/错误密码分别测错误密码提示且不跳转图书分页点第 2、3 页改 URL 页码越界数据正常展示无空白页新增图书填完整数据提交列表页出现新记录借阅流程借书后查库存库存减 1归还流程归还后查库存库存加 1权限控制退出登录后直接访问 /book/list被拦截回登录页6.2 模拟并发借阅压测工具看库存超卖图书管理系统的隐藏 Bug 在并发场景下才会暴露。比如库存只剩最后一本两个用户同时点借阅后端代码如果没做库存校验或事务控制就会出现「超卖」——两个人借到同一本书。这个验证用 JMeter 或 Postman 都能做方式是在同一时间发起两个借阅请求。# 用 curl 模拟两个并发请求观察库存变化 curl -c cookies.txt -b cookies.txt -d userId1bookId5 http://localhost:8080/book/borrow curl -c cookies2.txt -b cookies2.txt -d userId2bookId5 http://localhost:8080/book/borrow wait正常情况只有一个请求会成功或两个都提示库存不足。两个都成功就是并发问题。如果你是拿这套系统做课程设计把并发问题发现并解决写进报告里属于明显的加分项。解决方案也很简单在数据库层面做行锁——查询库存时加FOR UPDATESELECT stock FROM t_book WHERE id ? FOR UPDATE这个语法把选中的行锁住直到事务提交或回滚才释放第二个请求会等待第一个完成后重新查库存自然就避免了超卖。6.3 从这套项目里学到的 JDBC 封装套路不管你是二开还是学习JDBC 的封装方式值得单独研究。这套项目里很可能有一个 DBUtil 类它的作用是把重复代码收敛成一行调用。核心方法长这样public static Connection getConnection() { try { Class.forName(com.mysql.jdbc.Driver); return DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException | SQLException e) { throw new RuntimeException(数据库连接失败, e); } } public static void close(Connection conn, Statement stmt, ResultSet rs) { // 从里到外依次关闭ResultSet - Statement - Connection if (rs ! null) { try { rs.close(); } catch (SQLException e) {} } if (stmt ! null) { try { stmt.close(); } catch (SQLException e) {} } if (conn ! null) { try { conn.close(); } catch (SQLException e) {} } }这套代码你接手后可以直接用注意两点一是关闭顺序必须是 ResultSet、Statement、Connection 从里到外反过来会报「Connection is closed」二是不要在每个 Dao 里都 new DBUtil 实例DBUtil 应该用静态方法或单例模式连接池资源别浪费。如果要进一步升级可以把它换成 Druid 或 HikariCP 连接池改动集中在一个类里DAO 层代码不用动。6.4 把系统部署到服务器上的步骤课程设计一般只要本地跑通就行但如果你想让老师通过公网访问或者想拿它做小型图书馆的实际管理系统需要部署到云服务器。步骤不复杂前提是服务器上装了 JDK、Tomcat、MySQL 三件套。先把项目打成 war 包# 在 IDEA 中 Build - Build Artifacts - 选择 war 包 # 生成的 war 包在 out/artifacts/ 目录下 scp bookmanager.war root你的服务器IP:/usr/local/tomcat/webapps/Tomcat 会自动解压 war 包然后导入数据库。注意生产环境要把数据库密码改成强密码并且修改 Tomcat 的默认端口和管理员密码。如果遇到连不上数据库的问题检查服务器防火墙的 3306 端口是否放行云服务商的「安全组」也要配以及 MySQL 用户权限是不是只允许 localhost 访问——需要执行类似GRANT ALL PRIVILEGES ON db_bookmanager.* TO root% IDENTIFIED BY 密码;的操作。从那以后我每次拿到任何 JavaWeb 课程设计源码都强制自己走一遍「本地环境核对 → 数据库脚本导入 → 部署路径确认 → 核心功能逐个手测 → 并发边界试一次」这个流程。不是信不过源码作者而是环境差异这些坑真的是自己踩一遍才知道深浅。这套图书管理系统本身足够完整你按上面的步骤跑通了再改出属于你自己的功能模块这门课的设计分不会低。希望帮到你。本文还有配套的精品资源点击获取
返回列表