book-management-system
javaweb,图书管理系统,软件设计与分析,期末大作业
前言
本项目是一个基于 javaWeb 的图书管理系统
book-management-system
javaweb,图书管理系统,软件设计与分析,期末大作业
前言
本项目是一个基于 javaWeb 的图书管理系统,实现了登录、注册和基本的 CRUD 操作
使用的技术是 Servlet,JSP,AJAX,bootstrap 等
项目没有进行数据库调优(主要还是自己太菜了),所以应该无法撑起大规模访问
之所以我能够在短时间内完成这个 javaWeb 项目,是因为之前的小组大作业,都是我一个人完成的,所以我有权利对之前的项目进行重构,进而改变成我的个人大作业。也正是因为是前一个项目重构完成的,所以,这个项目的界面设计,与我之前完成的学生管理系统(第一次大作业)比较相似。
项目介绍
数据库设计
因为项目比较轻量级,功能不是太复杂,所以设计的数据库表也不多
存储书本的信息,分别是书本 ISBN 编号,书本名称,书本价格,书本数目以及作者
存储读者信息,包含读者的 id,密码,以及真实姓名
存储管理员信息,包含管理员的 id,密码,以及真实姓名
存储读者的借阅信息,包含自增长 id,读者 id,和图书的 ISBN 编号
前端界面一览
登录界面:
注册界面:
读者端首页:
借阅界面:
归还界面:
管理员首页:
图书管理界面:
用户管理界面:
项目内容描述
项目内容,我会分成前端和后端进行介绍,因为是 CRUD 项目,所以难免会出现很多重复的地方,我只会挑选重点来讲解
前端
前端的总体设计布局,是一个 header(导航栏),一个 footer(尾栏),和中间的内容
导航栏用来显示当前用户对象可以进行的操作
尾栏包含这个项目的版权信息(就是我的个人信息)
导航栏
因为读者的导航栏和管理员的导航栏布局类似,所以只介绍一个读者的
代码如下:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--这里不包含taglib,因为重复包含,会导致500的错误--%>
首栏
```
登录界面
代码如下:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
<%@include file="include/taglib.jsp"%>
<%-- 登录界面的logo设计样式--%>
```
在界面设计中,为了加快开发进度,我使用了 bootstrap 库,其中的登录、注册按钮,就是 bootstrap 中的样式
jsp
<input type="button" id="btn_login" value="登录"/>
<input type="button" id="btn_register" value="注册"/>
为了图省事,我没有为 js 代码额外开一个文件,而是直接和前端界面放在了一起(这不是一个好习惯),里面的主要功能,是获取输入框中的内容,然后使用 AJAX 异步访问,让服务端去访问持久层,然后再向登录端传回响应
```jsp
```
注册界面的设计思路和登录界面的差不多,这里就不再额外介绍了
图书借阅
代码如下:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
图书借阅
<%@include file="include/taglib.jsp"%>
<%@include file="include/readerheader.jsp"%>
<%
BookDao bookDao = new BookDao();
List
list = bookDao.list();
request.setAttribute("bookList",list);
%>
所有书籍
序号
|
书籍名称
|
ISBN
|
作者
|
价格
|
剩余数量
|
操作
|
${st.count}
|
${book.name}
|
${book.ISBN}
|
${book.writer}
|
${book.price}
|
${book.num}
|
|
<%@include file="include/footer.jsp"%>
```
这里,我使用了 EL 表达式和 JSTL 标签库,为的是更方便我的开发
EL 表达式:
```jsp
${st.count}
|
```
JSTL 标签库:
jsp
<c:forEach items="${bookList}" var="book" varStatus="st">
当读者点选借阅按钮后,AJAX 会将对应的图书的 ISBN 传回后台,并在后台进行数量、读者是否正在借阅等判断,如果都判断有效,会将该书的数目减 1,并在 reader_book 表中添加借阅数据(具体的后端代码,会在后面进行详细描述)
```jsp
```
表格,是借助 JSP 中的 Java 代码,和 JSTL 标签库实现的
JSP 中的 Java 代码:
```jsp
<%
BookDao bookDao = new BookDao();
List
list = bookDao.list();
request.setAttribute("bookList",list);
%>
```
JSTL 表达式,实现循环:
jsp
<c:forEach items="${bookList}" var="book" varStatus="st">
<tr>
<td>${st.count}</td>
<td>${book.name}</td>
<td>${book.ISBN}</td>
<td>${book.writer}</td>
<td>${book.price}</td>
<td>${book.num}</td>
<td >
<button class="M01_7f62_62c3a5e btn btn-primary" value="${book.ISBN}" id="borrow">借阅</button>
</td>
</tr>
</c:forEach>
Bootstrap
Bootstrap 的使用,为我的开发带来了极大的便利,使得我一个人在两天内开发一个 JavaWeb 项目成为了可能
在使用 bootstrap 前,要导入对应的库:
这里为了图方便,我直接使用了 bootstrap 的在线库
```jsp
<%--新 Bootstrap 核心 CSS 文件--%>
<%--jQuery文件。务必在bootstrap.min.js 之前引入--%>
<%--最新的 Bootstrap 核心 JavaScript 文件--%>
```
下面,我会展示 bootstrap 的便利
定制按钮:
这个之前在讲登录、注册的时候已经提过了
jsp
<input type="button" id="btn_login" value="登录"/>
<input type="button" id="btn_register" value="注册"/>
图形按钮:
比如编辑的笔的形状,删除的小垃圾桶形状
jsp
<a href="/editbook.jsp?bookISBN=${book.ISBN}" ></a>
<a href="/deletebook?bookISBN=${book.ISBN}" ></a>
表格:
项目里的斑马条纹表格,也是使用的 bootstrap
```jsp
```
前端的剩余部分,无论是外观,还是功能上的,都大体类似,所以,我不再做过多的赘述,下面,我们进入后端部分的讲解
### 后端
> 后端的主要编写,在于 Dao 层和 servlet 部分,前者,是用来固化数据的,后者,是用来处理前端传来的数据的(即我们常说的业务代码)
#### Bean 层
> Bean,也称为 pojo,entity(个人习惯问题),是数据库中,每个表的对应类,其中每个成员变量,都对应数据库表中的一个属性
>
> 一般的 bean,都包含带参构造函数,无参构造函数,get set 方法 和重写的 toString 方法(方便打印查看),为了保障通用性,我没有使用 lombok 简化 bean(我觉得用这玩意儿就是绑架)
>
> 编写 Bean 层,是为了保证数据库数据,和业务数据可以有一个良好的交互和完美的转换方案
**bean.Book:**
```java
public class Book {
private String name;
private float price;
private int num;
private String writer;
private int ISBN;
public Book(String name, float price, int num, String writer, int ISBN) {
this.name = name;
this.price = price;
this.num = num;
this.writer = writer;
this.ISBN = ISBN;
}
public Book() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public int getISBN() {
return ISBN;
}
public void setISBN(int ISBN) {
this.ISBN = ISBN;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", price=" + price +
", num=" + num +
", writer='" + writer + '\'' +
", ISBN=" + ISBN +
'}';
}
}
```
#### Dao 层
> Dao 层,是用来固化数据的,其中的业务代码,无非就是增删改查这四种,这里,我拿一个 BookDao 的部分来举例子
**BookDao.list():**
用来提取出 book 表中所有的数据
```java
public List
list() {
List
list = new ArrayList<>();
String sql = "select * from book";
try (Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)){
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
int ISBN = rs.getInt(1);
String name = rs.getString(2);
float price = rs.getFloat(3);
int num = rs.getInt(4);
String writer = rs.getString(5);
Book book = new Book(name, price, num, writer, ISBN);
list.add(book);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return list;
}
```
**BookDao.add(Book bean):**
用来向 book 表中添加数据
```java
public void add(Book bean) {
String sql = "insert into book values(?,?,?,?,?)";
try(Connection conn = DBUtil.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1,bean.getISBN());
stmt.setString(2,bean.getName());
stmt.setFloat(3,bean.getPrice());
stmt.setInt(4,bean.getNum());
stmt.setString(5,bean.getWriter());
stmt.execute();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
```
因为 JDBC 中很多内容,都是挺重复的,所以剩下的我就不展示了
#### Servlet
> 这里,我先来分享一下 servlet 的事件处理流程
>
> ![](https://www.writebug.com/myres/static/uploads/2021/11/3/371adfe9ffce3d4d06c65668e90b3ccd.writebug)
>
> 下面,我就以一个 BorrowBookServlet 来举例,并展示一下整个由前端到后端,再到前端的流程
**servlet.BookBookServlet:**
* **AJAX 异步传输数据:**
> 这里传输的,是书本的 ISBN 编号,并且指定使用 post 方法
>
> 如果传输失败,会弹出提交错误的提示
>
> 请求访问的是/borrowbook,这会在.xml 中进行匹配
```jsp
```
* **XML 配置文件:**
> AJAX 中,要求访问的地址,是/borrowbook,这要在.xml 中匹配,转移到对应的 servlet 中
```xml
BorrowBookServlet
top.faroz.servlet.BorrowBookServlet
BorrowBookServlet
/borrowbook
```
* **Servlet:**
> 这里到了我们的重头戏,servlet
>
> 这里,会根据传来的 ISBN 编号,和当前登录的用户的 ID,向 reader_book 表中存储图书借阅的信息。如果在判断中出现错误,会返回错误代码,以让前端的 AJAX 接收到,从而更具错误代码,对用户进行提示。
```java
@WebServlet(name = "BorrowBookServlet")
public class BorrowBookServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String bookISBN = request.getParameter("bookISBN");
Reader reader = (Reader) request.getSession().getAttribute("user");//登录的读者信息
PrintWriter writer = response.getWriter();
BookDao bookDao = new BookDao();
ReaderBookDao readerBookDao = new ReaderBookDao();
ReaderBookService readerBookService = new ReaderBookService();
Book book = bookDao.get(Integer.parseInt(bookISBN));
//对借阅进行判断
if (book==null) {
writer.print(-1);//-1 没有该图书
return;
}
if (book.getNum()<=0) {
writer.print(-2);//-2 图书不足
return;
}
if (readerBookService.getByReaderAndBook(reader.getId(),Integer.parseInt(bookISBN))!=null) {
writer.print(-3);//-3 读者正在借阅该书
return;
}
//将借阅的书籍个数-1
book.setNum(book.getNum()-1);
bookDao.update(book);
//将读者信息和书本信息存入reader_book
ReaderBook readerBook = new ReaderBook();
readerBook.setReader_id(reader.getId());
readerBook.setBook_ISBN(Integer.parseInt(bookISBN));
readerBookDao.add(readerBook);
request.getRequestDispatcher("/borrowbook.jsp").forward(request,response);
}
```
上面,就是用户选择借阅以后,整个的运行流程。
其他的功能,因为和上面是实现方式差不多,所以不再过多的进行赘述
参考文献
- 基于JSP技术网上书店的设计与实现(吉林大学·佟彤)
- 基于SSH框架的图书馆管理系统分析与设计(云南大学·郑晨)
- 基于JSP的网上书店系统的设计与实现(吉林大学·马新)
- 基于ASP.NET技术的中山图书Web管理系统的设计与实现(江西财经大学·陈宇)
- 网上书店的设计与实现(同济大学·徐爱鸣)
- 基于SSH框架的图书馆管理系统分析与设计(云南大学·郑晨)
- 图书交易网站的设计与实现(吉林大学·刘静言)
- 基于B/S架构的图书管理系统的设计与实现(山东大学·蒲琼)
- 基于JSP的网上书店系统的设计与实现(吉林大学·马新)
- 基于.NET技术的高校图书管理系统的设计与实现(吉林大学·李敏琪)
- 基于Android平台的图书管理系统手机客户端开发(电子科技大学·赵鲲)
- 复旦大学数字图书馆个人图书管理系统的设计与实现(电子科技大学·陆卫国)
- 图书综合管理系统(吉林大学·王宇)
- 图书管理系统设计与开发(电子科技大学·刘晓清)
- Android环境下的沈阳工学院移动图书馆的研究(沈阳理工大学·张波)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设工厂
,原文地址:https://bishedaima.com/yuanma/35727.html