尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

JavaEE图书借阅系统:Servlet+JSP+MySQL完整闭环实现

JavaEE图书借阅系统:Servlet+JSP+MySQL完整闭环实现 简介本资源是一份面向高校计算机专业本科生的JavaEE期末综合实践项目聚焦图书管理网站开发助力学生系统掌握企业级Web应用开发全流程。项目覆盖需求分析、系统设计、Servlet/JSP后端开发、MySQL数据库操作、JPA对象关系映射及MVC架构实现等核心能力特别适合作为期末大作业参考或课程设计实战范例。压缩包含356个文件总计26.39MB其中52个JSP文件构成前端视图层52个Java类与53个Class文件支撑业务逻辑与控制器40个JS和19个CSS实现交互与样式另含1个SQL数据库脚本、78个GIF操作示意图及配套文档如docx、pptx结构完整、开箱即用。已有6666人学习下载提供从需求文档到可运行代码的全链路素材包含管理员与借阅管理等典型模块的完整类结构如Admin.class、BorrowTable.class、ReturnTable.class便于理解分层设计与实际部署。1. 大学生JavaEE期末大作业不是堆功能而是用标准组件跑通一个可验证的图书借阅闭环很多同学拿到“JavaEE期末大作业”这个题目第一反应是去GitHub搜“JavaEE图书管理系统”下载一个带Admin后台、Book列表、Borrow操作的完整项目改个包名就交差。结果部署时报错ORA-28547: connection to server failed, probable oracle net admin error查半天发现是Oracle JDBC驱动没配对或者在VSCode里反复调试admin登录逻辑却卡在c:\users\admin\appdata\local\nvidia\dxcache这类路径干扰上——这根本不是JavaEE的问题而是没厘清JavaEE作为规范体系的落地边界。真正的JavaEE期末作业核心不是实现多少功能而是用ServletJSPJDBC或轻量级EJB替代MySQL/PostgreSQL在Tomcat容器中跑通“用户登录→图书检索→借阅提交→状态更新”这一完整事务流并能通过URL路径、HTTP状态码、数据库记录三者交叉验证每一步是否真实生效。它面向的是刚学完《Java Web程序设计》课程、熟悉Java基础但尚未接触Spring Boot的本科生目标是让TA亲手把课本第5章的Servlet生命周期、第7章的JDBC连接池、第9章的JSP EL表达式串成一条可调试、可断点、可截图演示的执行链。2. 用ServletJSPMySQL构建图书借阅核心流程从零初始化Web应用结构2.1 为什么不用Spring Boot而坚持原生JavaEE技术栈当前网络热词中频繁出现vscode配置javaee语言环境、javaee课程设计恰恰说明高校教学仍以JavaEE规范为纲而非直接切入Spring生态。Spring Boot虽简化了配置但会掩盖web.xml部署描述符的作用、ServletContext的生命周期管理、HttpSession与Cookie的底层绑定机制——这些正是期末答辩时老师必问的考点。例如admin账户的权限校验若用Spring Security学生可能只写PreAuthorize(hasRole(ADMIN))却答不出HttpServletRequest.getRemoteUser()和HttpSession.getAttribute(userRole)的区别而原生Servlet中手动实现Filter拦截、RequestDispatcher.forward()跳转能强制暴露HTTP请求流转的每个环节。此外Illegal类名如IllegalStateException在Servlet中高频出现正是理解容器线程模型的关键入口——比如在doPost()中调用response.getWriter()后又试图forward()就会触发该异常这比任何PPT讲解都更直观。提示不要用IDE自动创建的“Dynamic Web Project”模板直接开干。必须手动验证WEB-INF/web.xml是否存在且被Tomcat加载——这是判断是否真走JavaEE规范路径的黄金标准。2.2 创建最小可运行Web应用目录结构与关键配置文件按JavaEE 7规范要求项目根目录下必须包含WEB-INF/子目录其内需有web.xml和lib/。以下是经VSCodeTomcat 9实测的最小结构无任何框架jarbook-borrow-system/ ├── index.jsp ├── login.jsp ├── admin/ │ └── book-list.jsp ├── WEB-INF/ │ ├── web.xml │ └── lib/ │ └── mysql-connector-java-8.0.33.jar ← 必须与MySQL版本匹配 └── src/ └── servlet/ ├── LoginServlet.java ├── BorrowServlet.java └── AdminBookListServlet.javaWEB-INF/web.xml必须声明Servlet映射这是Tomcat识别业务逻辑的唯一依据?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 servlet servlet-nameLoginServlet/servlet-name servlet-classservlet.LoginServlet/servlet-class /servlet servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mapping servlet servlet-nameBorrowServlet/servlet-name servlet-classservlet.BorrowServlet/servlet-class /servlet servlet-mapping servlet-nameBorrowServlet/servlet-name url-pattern/borrow/url-pattern /servlet-mapping /web-app这段XML定义了两个关键契约所有发往/login路径的POST请求由LoginServlet类处理/borrow路径的请求交由BorrowServlet响应。没有这个映射即使Java类编译成功Tomcat也完全无法路由请求——这也是ORA-28547类错误常被误判为数据库问题的根源实际是Servlet未注册导致请求根本未到达JDBC层。2.3 实现图书借阅核心Servlet用try-with-resources确保资源释放BorrowServlet.java必须体现JavaEE对资源管理的强约束。以下代码片段展示了如何避免常见内存泄漏WebServlet(/borrow) public class BorrowServlet extends HttpServlet { Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String bookId req.getParameter(bookId); String userId (String) req.getSession().getAttribute(userId); String sql UPDATE books SET statusborrowed WHERE id? AND statusavailable; try (Connection conn DriverManager.getConnection( jdbc:mysql://localhost:3306/library?useSSLfalseserverTimezoneUTC, root, password); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, bookId); int rowsAffected ps.executeUpdate(); if (rowsAffected 1) { // 借阅成功记录日志到borrow_records表 String logSql INSERT INTO borrow_records (book_id, user_id, borrow_time) VALUES (?, ?, NOW()); try (PreparedStatement logPs conn.prepareStatement(logSql)) { logPs.setString(1, bookId); logPs.setString(2, userId); logPs.executeUpdate(); } req.setAttribute(message, 借阅成功); } else { req.setAttribute(message, 图书已被借出或不存在); } } catch (SQLException e) { // 关键不能吞掉SQLException必须记录并转为用户可见提示 e.printStackTrace(); // 开发期保留上线应写入log4j req.setAttribute(message, 系统繁忙请稍后再试); } req.getRequestDispatcher(result.jsp).forward(req, resp); } }参数说明useSSLfalse本地开发环境禁用SSL可避免证书配置问题生产环境必须启用serverTimezoneUTC强制统一时区防止NOW()函数返回值与JavaLocalDateTime不一致try-with-resources自动关闭Connection和PreparedStatement避免连接池耗尽——这是IllegalStateException高发场景rowsAffected 1用SQL层面的原子更新代替先SELECT再UPDATE规避并发借阅冲突。3. 数据库设计与JDBC连接池配置解决ORA-28547类连接失败的根本方法3.1 图书借阅场景的最小化MySQL表结构针对Book、Borrow、Admin三大热词设计三张表即可覆盖全部业务表名字段类型约束说明usersid,username,password,roleINT, VARCHAR, VARCHAR, VARCHARPK, NOT NULLrole值为admin或user对应admin账户权限booksid,title,author,statusINT, VARCHAR, VARCHAR, ENUMPK, NOT NULLstatusENUM(available,borrowed)避免字符串拼写错误borrow_recordsid,book_id,user_id,borrow_timeINT, INT, INT, DATETIMEPK, FK记录每次借阅动作支持历史追溯建表SQL必须显式指定字符集否则JSP中文显示为乱码CREATE DATABASE library CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE library; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role VARCHAR(20) NOT NULL DEFAULT user ); CREATE TABLE books ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, author VARCHAR(50), status ENUM(available,borrowed) DEFAULT available ); CREATE TABLE borrow_records ( id INT PRIMARY KEY AUTO_INCREMENT, book_id INT NOT NULL, user_id INT NOT NULL, borrow_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (book_id) REFERENCES books(id), FOREIGN KEY (user_id) REFERENCES users(id) );注意ENUM类型比VARCHAR更安全——status字段只能存available或borrowed杜绝statusavilable这类拼写错误导致的逻辑漏洞这正是Illegal状态的预防性设计。3.2 Tomcat内置连接池配置绕过Oracle Net Admin错误的务实方案网络热词ora-28547: connection to server failed, probable oracle net admin error本质是Oracle客户端配置错误而大学生作业必须用MySQL。Tomcat 9默认使用DBCP2连接池需在context.xml中配置!-- conf/context.xml -- ?xml version1.0 encodingUTF-8? Context Resource namejdbc/BookDB authContainer typejavax.sql.DataSource factoryorg.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory maxTotal20 maxIdle10 minIdle5 initialSize5 maxWaitMillis10000 usernameroot passwordpassword driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/library?useSSLfalseamp;serverTimezoneUTCamp;allowPublicKeyRetrievaltrue/ /Context关键参数解析maxTotal20最大连接数避免高并发时抛出SQLExceptionallowPublicKeyRetrievaltrueMySQL 8.0必需参数否则连接被拒绝url中amp;是XML实体转义若写成会导致Tomcat启动失败factory指向DBCP2工厂类Tomcat 9自带无需额外jar。在Servlet中获取连接的代码必须使用JNDI查找Context ctx new InitialContext(); DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/BookDB); Connection conn ds.getConnection(); // 此处不再硬编码URL这种解耦方式使数据库配置与Java代码分离修改密码只需改context.xml无需重编译——这才是JavaEE“配置即代码”的精髓。3.3 验证连接池是否生效用JMX监控连接数Tomcat Manager界面http://localhost:8080/manager/html提供实时连接池监控。登录后点击应用名进入详情页查看JDBC Data Sources链接可看到jdbc/BookDB的Active Connections和Idle Connections数值。当执行借阅操作时Active Connections应瞬时增加再回落证明连接池正常复用。若始终为0则检查context.xml是否放在conf/目录而非WEB-INF/web.xml中是否遗漏resource-ref声明MySQL服务是否真正运行netstat -an | findstr :3306。4. Admin后台与安全加固用Filter实现角色拦截而非硬编码if-else4.1 构建Admin专属页面JSP EL表达式驱动动态内容admin/book-list.jsp不应是静态HTML而要利用JSP EL展示实时数据% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % !DOCTYPE html html headtitle管理员图书管理/title/head body h2图书列表共${fn:length(books)}本/h2 table border1 trthID/thth书名/thth作者/thth状态/thth操作/th/tr c:forEach items${books} varbook tr td${book.id}/td td${book.title}/td td${book.author}/td tdc:out value${book.status}//td td c:choose c:when test${book.status available} a hrefborrow?bookId${book.id}借阅/a /c:when c:otherwise span stylecolor:red已借出/span /c:otherwise /c:choose /td /tr /c:forEach /table /body /htmlc:out value${book.status}/自动转义HTML特殊字符防止XSS攻击c:choose实现状态分支比Java脚本片段更符合JSP最佳实践。此处books由AdminBookListServlet通过req.setAttribute(books, bookList)传入体现MVC分层。4.2 用Filter拦截未授权访问替代admin密码修改电脑账户的粗暴做法网络热词admin密码修改电脑账户暴露了常见误区——把Web应用admin账户与操作系统账户混淆。正确做法是用Filter统一校验WebFilter(/admin/*) public class AdminAuthFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; HttpSession session request.getSession(false); String role session ! null ? (String) session.getAttribute(role) : null; if (admin.equals(role)) { chain.doFilter(req, resp); // 放行 } else { response.sendRedirect(request.getContextPath() /login.jsp?erroradmin_required); } } }此Filter拦截所有/admin/*路径请求检查Session中的role属性。若用户登录时已将role存入Sessionreq.getSession().setAttribute(role, admin)则放行否则重定向到登录页。相比在每个Servlet里写if(!admin.equals(role)) return;Filter实现了横切关注点的集中管理。提示WebFilter(/admin/*)注解需配合web.xml中filter声明才能在Tomcat 8生效否则会静默失效。4.3 密码安全存储用BCrypt替代明文存储LoginServlet中密码校验必须使用强哈希// 用户注册时非作业必需但体现工程素养 String hashedPassword BCrypt.hashpw(rawPassword, BCrypt.gensalt(12)); // 登录校验时 if (BCrypt.checkpw(inputPassword, storedHash)) { // 密码正确 }BCrypt.gensalt(12)生成12轮哈希足够抵御暴力破解。若作业要求简单实现至少用MessageDigest.getInstance(SHA-256)加盐salt绝不可存明文密码——这是admin账户安全的底线。5. VSCode调试与Docker部署让作业成果可演示、可复现、可验证5.1 VSCode配置JavaEE开发环境解决vscode配置javaee语言环境痛点在VSCode中安装以下扩展Extension Pack for Java微软官方Tomcat for Java提供一键部署按钮Language Support for Java™ by Red Hat智能补全关键配置settings.json{ java.configuration.updateBuildConfiguration: interactive, tomcat.javaHome: C:\\Program Files\\Java\\jdk-11.0.12, tomcat.serverPath: C:\\apache-tomcat-9.0.50, tomcat.contextPath: /book-borrow-system }启动调试时右键web.xml选择Deploy to TomcatVSCode自动编译、打包、部署。断点打在LoginServlet.java的doPost()方法首行输入http://localhost:8080/book-borrow-system/login.jsp提交表单即可单步跟踪request.getParameter(username)获取过程——这才是javaee课程设计应有的调试深度。5.2 Docker容器化部署用docker 安装 spring ai alibaba admin思路反推JavaEE最小镜像虽然作业不强制Docker但用它可彻底解决环境差异问题。编写DockerfileFROM tomcat:9.0-jre11-openjdk-slim COPY ./target/book-borrow-system.war /usr/local/tomcat/webapps/ COPY ./mysql-connector-java-8.0.33.jar /usr/local/tomcat/lib/ EXPOSE 8080 CMD [catalina.sh, run]构建命令docker build -t book-borrow-app . docker run -d -p 8080:8080 --name book-app book-borrow-app此时访问http://localhost:8080/book-borrow-system即为完整环境。对比spring ai alibaba admin等复杂方案此镜像仅280MB启动秒级完成——证明JavaEE原生方案的轻量优势。5.3 验证作业完成度的三个黄金指标不要依赖“页面能打开”这种模糊标准用以下可量化指标验收URL路径验证访问/login返回HTTP 200访问/admin/book-list.jsp返回HTTP 302重定向到登录页证明Filter生效数据库记录验证执行一次借阅后borrow_records表新增一行且books.status变为borrowed日志交叉验证Tomcatcatalina.out中出现BorrowServlet: 借阅成功同时MySQL慢查询日志记录对应UPDATE语句。这三个指标缺一不可。当答辩老师问“你怎么证明借阅功能真实有效”直接打开浏览器开发者工具Network面板、MySQL命令行、Tomcat日志文件三窗口并排展示比任何PPT都更有说服力。本文还有配套的精品资源点击获取
返回列表