基于jsp的图书管理系统
用JSP做图书管理系统,基于最头疼的图书不是借阅逻辑,是管理数据库连接池。我见过太多学生项目在Tomcat里每请求一次就DriverManager.getConnection一次,系统并发一上来直接崩。基于去年帮学弟调一个类似系统,图书20个用户同时点“借书”,管理MySQL就报了Too many connections。系统后来换成DBCP2,基于把maxTotal调到30,图书问题才消失。管理JSP本身只是系统视图层,真正撑住系统的基于是背后那套Servlet+JDBC的配合。
图书管理系统的图书核心表就三张:books、users、管理borrow_records。books里放ISBN、书名、作者、库存量;users存读者证号和密码;borrow_records记录谁在什么时候借了哪本书、还书日期。JSP页面负责展示,比如book_list.jsp用JSTL的<c:forEach>遍历结果集,比在脚本片段里写while(rs.next())干净得多。但要注意,JSP里别直接写SQL,那是Model1时代的坏习惯。我习惯用Servlet做控制器,比如BorrowServlet接收bookId和userId,先查库存,再插借阅记录,最后更新库存——这三步必须放在一个事务里。否则有人借走最后一本,库存还没减,另一个请求又查到了。
实际部署时,中文乱码是个老坑。JSP页面顶部加<%@ page contentType="text/html;charset=UTF-8" %>只能解决响应编码,表单提交的POST数据还得在Servlet里调request.setCharacterEncoding("UTF-8")。更稳妥的做法是写个CharacterEncodingFilter,在web.xml里配/*。另外,图书封面上传功能别用JSP直接处理文件流,用commons-fileupload在Servlet里解析,存到webapp外的目录,数据库只存相对路径。我见过有人把图片存进BLOB字段,结果备份一次数据库要半小时。
借阅期限和逾期计算,别在JSP里用JavaScript算。服务器时间才是准的。借书时在borrow_records里存due_date,还书时用new Date()和due_date比。如果超期,按天扣读者积分——这个逻辑写在Java的Service层,JSP只负责显示“您已逾期3天”。有个细节:时区问题。Tomcat默认GMT,MySQL用系统时区,两边差8小时。要么统一用UTC,要么在JDBC URL里加serverTimezone=Asia/Shanghai。
分页查询别用limit offset,数据量大了性能直线下降。图书表通常几千条,用id > lastId order by id limit 10的游标方式更稳。JSP里显示分页链接时,把当前页和总页数放在request属性里,用<c:if>判断是否显示“上一页”。搜索功能用LIKE '%keyword%'会全表扫,如果书名有索引,改成LIKE 'keyword%'能走索引。但用户往往记不住开头,所以实际项目里我推荐用MySQL的全文索引,或者干脆上Elasticsearch——不过对课程设计来说,那太重了。
权限控制别只在前端藏按钮。JSP里用<c:if test="${ sessionScope.user.role == 'admin'}">包住删除链接,但后台Servlet必须再查一次session。有人直接改URL就能删书,就是因为Servlet里没验角色。另外,JSP页面不要放Java代码块太多,用JSTL和EL表达式,否则改个界面得重启Tomcat。最后,连接池配置写在context.xml里,别硬编码在Java类中。数据库密码用JNDI数据源,Tomcat的server.xml里配Resource,JSP里用<sql:query dataSource="jdbc/library">——虽然JSTL的sql标签库不推荐在生产用,但课程设计里能省不少事。
本文地址:http://www.79wt.cn/news/1841d9599720.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。