这个JavaWeb图书馆管理系统是我大三时的课程设计作品,后来经过优化完善也适合作为毕业设计项目。系统采用经典的B/S架构,前端使用JSP+HTML+CSS+JavaScript,后端基于Servlet+JavaBean实现,数据库选用MySQL 5.7。整个系统实现了图书管理、读者管理、借阅归还、数据统计等核心功能模块,代码结构清晰,文档完整规范。
提示:系统采用MVC分层设计模式,各层职责分明,便于后续功能扩展和维护。源码已通过Eclipse和IDEA双环境测试,数据库脚本包含测试数据。
系统主要面向中小型图书馆的日常管理工作,需要实现以下核心功能:
性能需求:
安全需求:
兼容性需求:
| 技术分类 | 选型方案 | 选择理由 |
|---|---|---|
| 前端技术 | JSP+JSTL | 适合JavaWeb初学者,便于与后端交互 |
| 后端框架 | Servlet+JavaBean | 轻量级,不依赖第三方框架 |
| 数据库 | MySQL 5.7 | 开源免费,适合教学场景 |
| 服务器 | Tomcat 9.0 | 与Servlet规范完美兼容 |
| 开发工具 | Eclipse/IDEA | 高校教学常用IDE |
核心表结构设计:
图书表(book_info):
sql复制CREATE TABLE `book_info` (
`book_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`author` varchar(50) NOT NULL,
`publish` varchar(30) NOT NULL,
`ISBN` varchar(13) NOT NULL,
`introduction` text,
`price` decimal(10,2) NOT NULL,
`pubdate` date NOT NULL,
`class_id` int(11) DEFAULT NULL,
`pressmark` int(11) DEFAULT NULL,
`state` smallint(6) DEFAULT 1,
PRIMARY KEY (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
读者表(reader_info):
sql复制CREATE TABLE `reader_info` (
`reader_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`sex` varchar(5) NOT NULL,
`birth` date NOT NULL,
`address` varchar(50) NOT NULL,
`telcode` varchar(11) NOT NULL,
`card_state` smallint(6) DEFAULT 1,
PRIMARY KEY (`reader_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
借阅记录表(lend_list):
sql复制CREATE TABLE `lend_list` (
`ser_num` int(11) NOT NULL AUTO_INCREMENT,
`book_id` int(11) NOT NULL,
`reader_id` int(11) NOT NULL,
`lend_date` date DEFAULT NULL,
`back_date` date DEFAULT NULL,
`fine` decimal(10,2) DEFAULT 0.00,
PRIMARY KEY (`ser_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:所有表都设置了适当的外键约束和索引,确保数据完整性和查询效率。
采用典型的三层架构:
关键类设计:
图书添加Servlet示例代码:
java复制public class BookAddServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String author = request.getParameter("author");
String publish = request.getParameter("publish");
String isbn = request.getParameter("isbn");
String introduction = request.getParameter("introduction");
String price = request.getParameter("price");
String pubdate = request.getParameter("pubdate");
String classId = request.getParameter("classId");
Book book = new Book();
book.setName(name);
book.setAuthor(author);
// 其他属性设置...
BookDao bookDao = new BookDao();
if(bookDao.addBook(book)) {
response.sendRedirect("admin_book.jsp?info=success");
} else {
response.sendRedirect("admin_book.jsp?info=error");
}
}
}
借书业务处理流程:
关键代码片段:
java复制public boolean lendBook(int bookId, int readerId) {
Connection con = null;
try {
con = DBUtil.getConnection();
con.setAutoCommit(false); // 开启事务
// 检查图书状态
String sql1 = "SELECT state FROM book_info WHERE book_id=?";
PreparedStatement pst1 = con.prepareStatement(sql1);
pst1.setInt(1, bookId);
ResultSet rs = pst1.executeQuery();
if(!rs.next() || rs.getInt("state") != 1) {
return false;
}
// 检查读者可借数量
String sql2 = "SELECT COUNT(*) FROM lend_list WHERE reader_id=? AND back_date IS NULL";
PreparedStatement pst2 = con.prepareStatement(sql2);
pst2.setInt(1, readerId);
ResultSet rs2 = pst2.executeQuery();
if(rs2.next() && rs2.getInt(1) >= 5) {
return false;
}
// 插入借阅记录
String sql3 = "INSERT INTO lend_list(book_id,reader_id,lend_date) VALUES(?,?,NOW())";
PreparedStatement pst3 = con.prepareStatement(sql3);
pst3.setInt(1, bookId);
pst3.setInt(2, readerId);
pst3.executeUpdate();
// 更新图书状态
String sql4 = "UPDATE book_info SET state=0 WHERE book_id=?";
PreparedStatement pst4 = con.prepareStatement(sql4);
pst4.setInt(1, bookId);
pst4.executeUpdate();
con.commit();
return true;
} catch (SQLException e) {
if(con != null) {
try { con.rollback(); } catch (SQLException ex) {}
}
return false;
} finally {
DBUtil.closeConnection(con);
}
}
使用JFreeChart实现借阅排行统计:
java复制public class ChartServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取借阅排行数据
BookDao bookDao = new BookDao();
List<Book> topBooks = bookDao.getTopBooks(10);
// 创建数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
for(Book book : topBooks) {
dataset.addValue(book.getLendCount(), "借阅量", book.getName());
}
// 创建图表
JFreeChart chart = ChartFactory.createBarChart(
"图书借阅排行TOP10", // 标题
"图书名称", // 横轴标签
"借阅次数", // 纵轴标签
dataset, // 数据集
PlotOrientation.VERTICAL,
true, true, false);
// 设置响应头
response.setContentType("image/png");
// 输出图表
ChartUtils.writeChartAsPNG(response.getOutputStream(), chart, 800, 500);
}
}
开发环境准备:
数据库初始化:
bash复制mysql -u root -p < library.sql
项目导入与配置:
启动系统:
功能测试:
性能测试:
安全测试:
需求分析文档:
设计文档:
测试文档:
用户手册:
使用专业工具:
内容组织建议:
格式规范:
中文乱码问题:
java复制request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
jsp复制<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
数据库连接失败:
Tomcat启动报错:
JSP页面无法访问:
性能优化:
功能扩展:
界面改进:
在实际开发过程中,有几个关键点值得特别注意:
事务处理:借还书业务涉及多表操作,必须使用事务确保数据一致性。最初版本没有考虑事务导致出现数据不一致问题,后来通过JDBC事务机制解决了这个问题。
异常处理:数据库操作、文件IO等都需要完善的异常处理。建议使用统一的异常处理机制,避免在每个方法中重复try-catch。
代码规范:良好的包结构设计和命名规范能显著提高代码可读性。建议按功能模块分包,类名和方法名要见名知意。
文档同步:开发过程中要及时更新文档,避免最后补文档时遗漏细节。可以使用Swagger等工具自动生成API文档。
这个项目虽然规模不大,但涵盖了JavaWeb开发的完整流程,从需求分析到系统部署,对理解MVC架构、数据库设计和前后端交互非常有帮助。建议初学者在理解本项目的基础上,尝试添加新功能或改用其他框架(如Spring Boot)重构系统,以加深对JavaWeb开发的理解。