一、圖書管理系統實現的功能介紹
這裏我們要實現普通用戶和系統管理員的登錄、借書還書功能、購買圖書功能、展示所有圖書的狀態(借出、借出時間是否超期、超期後產生的滯納金的計算等等)。我這裏最初實現的是登錄和查詢功能。
二、數據庫表結構的創建
首先,我們需在在數據庫中建幾張所需要的表,如下圖所示。
建好表之後,需要往表裏面插入相應的值。這裏我就不作具體演示,具體的建表語句和插入數據的語句如下:
CREATE TABLE IF NOT EXISTS tb_book(
book_id INT(11) PRIMARY KEY AUTO_INCREMENT,
book_name VARCHAR(20),
price DOUBLE(15,2),
store INT(11),
des VARCHAR(50),
book_type VARCHAR(20)
)
INSERT INTO tb_library VALUES(1,'高等數學',35.00,20,'大學必修課,很難的','數學'),
(2,'高分子',25.00,30,'反正比高中的分子結構要難','化學'),
(3,'機器人制作',55.00,10,'與科技接軌','科技'),
(4,'走進江蘇',29.00,20,'認識江蘇','人文'),
(5,'新視野英語',15.00,50,'學習新視野,穩過四六級','英語'),
(6,'喀斯特地貌',16.00,30,'瞭解自然的地貌','地理');
CREATE TABLE IF NOT EXISTS tb_borrow(
book_id INT(11),
borrow_id INT(11),
borrow_date DATE,
back_date DATE,
delay_money DOUBLE(15,2)
)
CREATE TABLE IF NOT EXISTS tb_user(
user_id INT(11) PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(10),
pwd VARCHAR(20),
grade INT(11),
phone VARCHAR(11),
user_type VARCHAR(10)
)
INSERT INTO tb_user VALUES(1,'admin','admin',1,'15269584852','管理員'),
(2,'lily','lily',2,'13215469850','學生'),
(3,'mark','mark',2,'15269847593','學生'),
(4,'green','green',3,'13265987485','學生'),
(5,'black','black',3,'18569598784','學生');
CREATE TABLE IF NOT EXISTS tb_bookType(
type_id INT(11) PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(10),
default_date INT(11),
delay_money_per_day DOUBLE(15,2)
)
INSERT INTO tb_booktype VALUES(1,'科技',7,2.50),
(2,'地理',10,1.20),
(3,'人文',7,1.50),
(4,'數學',15,3.00),
(5,'英語',15,3.50),
(6,'化學',10,2.80);
建好表結構以後,接下來就需要進入idea的一些設置
三、idea的環境搭建
idea環境搭建我這裏就不多做贅述,可以參考我上一篇的來進行配置。我們直接開始進行代碼部分,首先來做一下登錄模塊。
四、實現登錄功能
首先進行dao層的搭建,再此之前,我們可以把實體類都建好,如下圖:
實體類裏的getter、setter方法,有參無參構造以及tospring方法的重寫,全都碼一遍。下面再開始dao層的搭建。
在dao層,需要建一個UserDao接口,裏面放一個獲取用戶信息的方法:
public interface UserDao {
User getUserByNameAndPwd(@Param("name") String name,@Param("pwd") String pwd);
}
然後建一個UserDao.xml文件進行配置。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.kb07.dao.user.UserDao">
<select id="getUserByNameAndPwd" resultType="user">
select * from tb_user where user_name=#{name} and pwd=#{pwd};
</select>
</mapper>
這裏面的內容也很簡單,直接就寫一個查詢語句,根據用戶名和密碼,返回一個user對象,當然這裏的user是在mybatis.xml
文件中設置好的別名。
接下來在service層同樣建一個UserService接口,裏面也只是放一個方法:
public interface UserService {
User login(String user_name,String pwd);
}
下面在service層實現類中,就需要進行具體的需求分析判斷了:
public class UserServiceImpl implements UserService {
Logger logger=Logger.getLogger(UserServiceImpl.class);
private SqlSession session;
@Override
public User login(String user_name, String pwd) {
session= MapperConfig.getSession(true);
User user=session.getMapper(UserDao.class).getUserByNameAndPwd(user_name,pwd);
session.close();
if(user==null){
logger.error("查不到該用戶!");
return null;
}
return user;
}
}
通過session對象來調用dao層的方法,這裏的session對象的獲取方法,也是在工具類中設置好的,前一篇都有講解具體設置步驟。
service層獲取到用戶對象之後,就要和前端頁面進行交互,就需要一個servlet進行連接,首先建一個UserServlet類,
繼承一下HttpServlet,重寫一下里面的service方法,然後要在web.xml中進行相關配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>cn.kgc.kb07.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<servlet>
</web-app>
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user_name=req.getParameter("user_name");
String pwd=req.getParameter("pwd");
UserService service=new UserServiceImpl();
User user=service.login(user_name,pwd);
if(user!=null){
if(user.getUser_type().equals("管理員")){
req.getSession().setAttribute("user",user);
resp.sendRedirect("manage.jsp");
}else if(user.getUser_type().equals("學生")) {
req.getSession().setAttribute("user", user);
resp.sendRedirect("choose.jsp");
}
}else {
req.getSession().setAttribute("msg","用戶不存在!");
resp.sendRedirect("index.jsp");
}
}
}
這裏的servlet層直接根據頁面返回的用戶名和密碼,通過service層判斷是否可以查詢的到,如果查詢不到,就跳回原界面,進行再次輸入;如果查詢的到,需要根據用戶的類型,學生和管理員分別進入不同頁面。
登錄頁面也很簡單,直接使用c標籤獲取servlet層的返回結果。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>圖書館首頁</title>
</head>
<body>
<c:if test="${user==null}">
<c:out value="${msg}"></c:out>
<form action="login.do" method="post">
<p>用戶名:<input type="text" name="user_name"></p>
<p>密碼:<input type="password" name="pwd"></p>
<p><input type="submit"></p>
</form>
</c:if>
</body>
</html>
這裏是用戶登錄不成功返回的首頁,進行繼續登錄。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>選擇頁面</title>
</head>
<body>
<p><input type="button" value="購書" onclick="window.location.href='buy.jsp'"></p>
<p><input type="button" value="借書" onclick="window.location.href='borrow.jsp'"></p>
<p><input type="button" value="還書" onclick="window.location.href='back.jsp'"></p>
</body>
</html>
這是學生登錄後可以進行的操作,學生可以選擇購書、借書、還書操作(此功能暫不實現)。
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>管理員頁面</title>
</head>
<body>
<c:if test="${lists==null}">
<form action="show.do" method="post">
<p>書名:<input type="text" name="book_name">
用戶名:<input type="text" name="user_name">
圖書類型:<input type="text" name="book_type">
<input type="submit" value="查詢"></p>
</form>
</c:if>
<c:if test="${lists!=null}">
<c:forEach items="${lists}" var="list">
<p>${list.book_id}</p>
</c:forEach>
</c:if>
</body>
<script>
</script>
</html>
這裏管理員的頁面,可以根據不同屬性進行圖書的查詢(這裏是根據圖書的名稱,借書人的名字,圖書的類來查詢)。
接下來,我們要對此功能進行實現。
五、圖書的查詢展示
同樣進行相同的操作,在dao層建一個BookDao的接口,裏面放一個方法:
public interface BookDao {
List<Book> show(@Param("book_name") String book_name,
@Param("user_name") String user_name,
@Param("book_type") String book_type);
}
再建一個BookDao.xml文件再進行配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.kgc.kb07.dao.book.BookDao">
<select id="show" resultType="book">
SELECT b1.*,b2.`borrow_id`,u.user_name //這裏爲了方便展示,將user_name和borrow_id寫做book的屬性,所以返回值類型是book就可以
FROM tb_book b1,tb_borrow b2,tb_user u
WHERE b1.`book_id`=b2.`book_id`
AND b2.`borrow_id`=u.`user_id`
<if test="book_name!=null and book_name!=''">
and b1.book_name like concat('%',#{book_name},'%')
</if>
<if test="user_name!=null and user_name!=''">
and u.user_name like concat('%',#{user_name},'%')
</if>
<if test="book_type!=null and book_type!=''">
and b1.book_type like concat('%',#{book_type},'%')
</if>
</select>
</mapper>
這裏使用動態Sql實現模糊查詢的功能。
同樣service層和實現類進行相同的操作:
public interface BookService {
List<Book> showBooks(String book_name,String user_name,String book_type);
}
public class BookServiceImpl implements BookService {
Logger logger=Logger.getLogger(UserServiceImpl.class);
private SqlSession session;
@Override
public List<Book> showBooks(String book_name,String user_name,String book_type) {
session= MapperConfig.getSession(true);
List<Book> lists=session.getMapper(BookDao.class).show(book_name,user_name,book_type);
session.close();
if(lists==null) {
return null;
}
return lists;
}
}
接着就是web.xml和servlet層的配置:
<servlet>
<servlet-name>bookServlet</servlet-name>
<servlet-class>cn.kgc.kb07.servlet.BookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>bookServlet</servlet-name>
<url-pattern>/show.do</url-pattern>
</servlet-mapping>
public class BookServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String book_name=req.getParameter("book_name");
String user_name=req.getParameter("user_name");
String book_type=req.getParameter("book_type");
BookService service=new BookServiceImpl();
List<Book>lists =service.showBooks(book_name,user_name,book_type);
if(lists==null){
req.getSession().setAttribute("msg","查不到該書信息");
resp.sendRedirect("error.jsp");
}else {
req.getSession().setAttribute("lists",lists);
req.getSession().setAttribute("book_name",book_name);
req.getSession().setAttribute("user_name",user_name);
req.getSession().setAttribute("book_type",book_type);
resp.sendRedirect("manage.jsp");
}
}
這裏面對請求和響應都進行一下字符編碼的配置,防止出現中文亂碼。
這樣獲取到lists對象後,就可以在頁面進行展示了。
manage.jsp的頁面爲:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>管理員頁面</title>
</head>
<body>
<c:if test="${lists==null}">
<form action="show.do" method="post">
<p>書名:<input type="text" name="book_name">
用戶名:<input type="text" name="user_name">
圖書類型:<input type="text" name="book_type">
<input type="submit" value="查詢"></p>
</form>
</c:if>
<c:if test="${lists!=null}">
<p>書名:<input type="text" value="${book_name}">
借書人:<input type="text" value="${user_name}">
圖書類型:<input type="text" value="${book_type}">
</p>
<table border="1">
<tr>
<th>圖書編號</th>
<th>圖書名稱</th>
<th>圖書價格</th>
<th>圖書類型</th>
<th>圖書庫存</th>
<th>圖書描述</th>
<th>借書人姓名</th>
</tr>
<c:forEach items="${lists}" var="list">
<tr>
<td>${list.book_id}</td>
<td>${list.book_name}</td>
<td>${list.price}</td>
<td>${list.book_type}</td>
<td>${list.store}</td>
<td>${list.des}</td>
<td>${list.user_name}</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
<script>
</script>
</html>
同樣也是採用c標籤的形式獲取servlet層傳過來的對象,使用c:forEach來循環打印結果。
這裏我們使用模糊查詢,來顯示圖書信息:
書名:高 借書人:不填 圖書類型:學
直接在Mysql中可以查到的結果是:
可以看到顯示兩條信息,在頁面中,我們實際來看一下效果:
可以看到頁面中也是顯示兩條結果,證明我們的頁面代碼沒有任何問題。
這樣我們就簡單實現了圖書管理系統的登錄和查詢圖書信息。