基于Servlet+jsp的图书管理系统

系统介绍

这是本人第一次写的web项目,记录下来做个笔记,有点简陋,因经验不足及技术有限项目中有诸多bug及不足的地方请多包含。

1开发环境

开发工具:Intellij IDEA2021
JDK版本:jdk1.8
mysql版本:5.7.14
前端:html、css、js、jsp
后端:java、Servlet

2系统功能

1.登录注册
2.图书的增删查
3.借书与还书
5.用户管理
6.用户注销

3系统效果

在这里插入图片描述

4系统结构及表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
事先创建userinfo、rootuser、book如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中图书的状态status代表是否被借阅(varchar类型)。

5项目代码
5.0 三个工具类及web.xml文件jdbc配置文件
package com.example.LoginDem.utils;
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
/**
 * @author brett
 * @date 2022-01-30 11:41:44
 *
 * 数据库连接驱动
 * 释放资源
 */
public class JDBCUtils {
    
    

    private static String user;
    private static String password;
    private static String url;

    // 在静态代码块中获取配置文件信息
    static {
    
    
        try {
    
    
            Properties properties = new Properties();
            properties.load(new FileInputStream("F:\\IDEA\\project\\LoginDemo2\\src\\main\\resources\\jdbc.properties"));
             url = properties.getProperty("url");
             user = properties.getProperty("user");
             password = properties.getProperty("password");
            String driver = properties.getProperty("driver");
            Class.forName(driver);
        } catch (Exception e){
    
    
            e.printStackTrace();
        }
    }
    // 获取数据库连接
    public static Connection getConnect() throws SQLException {
    
    
        return DriverManager.getConnection(url,user,password);
    }
    //释放数据库资源
    public static void clean(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
    
    
        if (resultSet != null) {
    
    
            resultSet.close();
        }
        if (statement != null) {
    
    
            statement.close();
        }
        if (connection != null){
    
    
            connection.close();
        }
    }
    // 判断数据库中表是否为空(存在)
    public static boolean isExists(String user) throws SQLException {
    
    
        String userbook = user+"book";
        Connection connect = DriverManager.getConnection(url,"root",password);
        String sql = "show tables like '"+userbook+"'";
        PreparedStatement ps = connect.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        if(rs.next()){
    
    
            rs.close();
            ps.close();
            connect.close();
            return true;
        }
        return false;
    }
}

package com.example.LoginDem.utils;
import com.example.LoginDem.entity.Book;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-01 21:24:21
 * 
 * 操作分页查询的工具类
 */
public class Page {
    
    
    // 总页数
    private int totalPageCount;
    // 页面大小,即每页显示记录条数
    private int pageSize = 5;
    // 记录总数
    private int totalCount;
    // 当前页码
    private int currentPageNo = 1;
    // 每页网站集合
    private List<Book> BookList;

    public int getTotalPageCount() {
    
    
        return totalPageCount;
    }

    public void setTotalPageCount(int totalPageCount) {
    
    
        this.totalPageCount = totalPageCount;
    }

    public int getPageSize() {
    
    
        return pageSize;
    }

    public void setPageSize(int pageSize) {
    
    
        if (pageSize > 0)
            this.pageSize = pageSize;
    }

    public int getTotalCount() {
    
    
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
    
    
        if (totalCount > 0)
           this.totalCount = totalCount;
        // 计算总页数
        this.totalPageCount = this.totalCount % pageSize == 0? (this.totalCount / pageSize) :(this.totalCount / pageSize + 1);
    }

    public int getCurrentPageNo() {
    
    
        if (currentPageNo == 0)
            return 0;
        else return currentPageNo;
    }

    public void setCurrentPageNo(int currentPageNo) {
    
    
        if (currentPageNo > 0)
        this.currentPageNo = currentPageNo;
    }

    public List<Book> getBookList() {
    
    
        return BookList;
    }

    public void setBookList(List<Book> bookList) {
    
    
        this.BookList = bookList;
    }
}

package com.example.LoginDem.utils;
import com.example.LoginDem.entity.User;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-01 23:39:16
 */
public class UserObject {
    
    
    List<User> userList;
    public UserObject(List<User> list) {
    
    
        this.userList = list;
    }
    public List<User> getUserList() {
    
    
        return userList;
    }
    public void setUserList(List<User> userList) {
    
    
        this.userList = userList;
    }
}

<?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">
    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>
    <session-config>  <!-- 设置session的过期时间为5分钟(5*60s内没有对发送新的请求,该session过期) -->
        <session-timeout>5</session-timeout>
    </session-config>
</web-app>
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
user=root
password=986836
driver=com.mysql.jdbc.Driver
5.1 登录

login.jsp

<%@ page import="java.io.PrintWriter" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/1/30
  Time: 8:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <style>
        #Login-Form {
      
      
            width: 300px;
            height: 200px;
            margin: 10% 40%;
        }
    </style>
</head>
<body>
    <div id="Login-Form">
        <form method="post" action="${pageContext.request.contextPath}/login" id="Form">
            <input type="text" name="username" id="username" placeholder="请输入用户名:" onfocus="Fun2()"/>
            <span id="error1" style="color: red;font-size: 10px"></span><br><br>
            <input type="password" name="password" id="password" placeholder="请输入密码:" onfocus="Fun4()"/>
            <span id="error2" style="color: red;font-size: 10px"></span><br><br>
            <select id="userLogin" name="v">
                <option selected="selected" value="普通用户登录">普通用户登录</option>
                <option value="管理员登录">管理员登录</option>
            </select><br><br>
            <button type="button" onclick="Fun()">登录</button>
            <button type="button" onclick="Fun3()">注册</button><br><br>
            <span id="error" style="color:red; font-size: 10px">${error}</span>
        </form>
    </div>
    <script type="text/javascript">
        function Fun(){
      
      
            var username = document.getElementById("username").value;
            var password = document.getElementById("password").value;
            var Form = document.getElementById("Form");
            if (username === ''){
      
      
                document.getElementById("error1").innerHTML="用户名不能为空!"
               return;
            }
            if(password === ''){
      
      
                document.getElementById("error2").innerHTML="密码不能为空!"
                return;
            }
            Form.submit();
        }
        function Fun2(){
      
      
            var username = document.getElementById("username").value;
           if (username === ''){
      
      
               document.getElementById("error").innerHTML="";
               document.getElementById("error1").innerHTML="";
           }
        }
        function Fun3(){
      
      
            window.location.href="register.jsp";
        }
        function Fun4(){
      
      
            const pwd = document.getElementById("password").value;
            if (pwd.length === 0) {
      
      
                document.getElementById("error2").innerHTML="";
            }
        }
    </script>
</body>
</html>

5.2 注册(register.jsp)
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/1/30
  Time: 13:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
    <style>
        #Register-Form {
      
      
            width: 330px;
            height: 200px;
            margin: 10% 40%;
        }
    </style>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<div id="Register-Form">
    <form method="post" action="${pageContext.request.contextPath}/register" id="Form">
        <input type="text" name="username" id="username" placeholder="用户名:"  onfocus="Fun2('username','error1')" onblur="Valid()"/>
        <span id="error1" style="color: red;font-size: 10px"></span><br><br>
        <input type="password" name="password" id="password1" placeholder="密码:" onfocus="Fun2('password1','error2')" />
        <span id="error2" style="color: red;font-size: 10px"></span><br><br>
        <input type="password" id="password2" placeholder="确认密码:" onfocus="Fun2('password2','error3')"/>
        <span id="error3" style="color: red;font-size: 10px"></span><br><br>
        <button type="button" onclick="Fun()">注册</button>
        <button type="button" onclick="Fun3()">返回登录</button><br><br>
        <span>${info}</span>
    </form>
</div>
<script type="text/javascript">
    function Fun(){
      
      
        let username = document.getElementById("username").value;
        const password1 = document.getElementById("password1").value;
        let password2 = document.getElementById("password2").value;
        if (username === ''){
      
      
            document.getElementById("error1").innerHTML="用户名不能为空!";
            return;
        }
        if (password1 === ''){
      
      
            document.getElementById("error2").innerHTML="密码不能为空!";
            return;
        }
        if (password1 !== password2){
      
      
            document.getElementById("error3").innerHTML="密码不一致!";
            return;
        }
        document.getElementById("Form").submit();
    }
    function Fun2(Id,Error){
      
      
        let valid = document.getElementById(Id).value;
        if (valid.length===0){
      
      
            document.getElementById(Error).innerHTML="";
        }
    }
    function Fun3(){
      
      
        window.location.href="login.jsp";
    }
    function Valid(){
      
      
        $.ajax({
      
      
            url:"${pageContext.request.contextPath}/UserValid",
            type:"post",
            data:{
      
      "username":$("#username").val()},
            success:function (msg){
      
      
                document.getElementById("error1").innerText=msg;
            },
            dataType:"text",
            async:true
        });
    }
</script>
</body>
</html>


ajax:Asynchronous javascript and XML,异步的JavaScript和XML。ajax不是一种新的编程语言,而是一种现有标准使用的新方法。ajax最大的优点是在不加载整个页面的条件下与服务器交互,进行部分页面的更新。使用jquery封装的使用方法如下:

$.ajax({
	url:"请求路径",
	type:"请求方式(默认'GET')",
	data:{},   //请求参数(键值对)
	success:function (data){},  //响应成功后的回调函数,data表示响应数据
	dataType:"text";  //响应数据类型  text、json
});

这里注册页面,在注册用户名时,当输入框失去焦点后会异步与服务器交互,查看是否已经被注册。

5.3 Bean
package com.example.LoginDem.entity;

/**
 * @author brett
 * @date 2022-01-30 11:33:17
 */
public class User {
    
    

    private String username;
    private String password;

    public User(){
    
    }

    public User(String username, String password){
    
    
        this.username = username;
        this.password = password;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }
}

package com.example.LoginDem.entity;

/**
 * @author brett
 * @date 2022-02-01 21:02:18
 */
public class Book {
    
    

    private String name;
    private Integer price;
    private Integer bookid;
    private String author;
    private String status;  // 图书状态(false:未借出,true:已借)

    public Book() {
    
    }

    public Book(String name, Integer price, Integer bookid, String author, String status) {
    
    
        this.name = name;
        this.price = price;
        this.bookid = bookid;
        this.author = author;
        this.status = status;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public Integer getPrice() {
    
    
        return price;
    }

    public void setPrice(Integer price) {
    
    
        this.price = price;
    }

    public Integer getBookid() {
    
    
        return bookid;
    }

    public void setBookid(Integer bookid) {
    
    
        this.bookid = bookid;
    }

    public String getAuthor() {
    
    
        return author;
    }

    public void setAuthor(String author) {
    
    
        this.author = author;
    }

    public String getStatus() {
    
    
        return status;
    }

    public void setStatus(String status) {
    
    
        this.status = status;
    }
}

5.4 注册登录验证的Servlet
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.UserDao;
import com.example.LoginDem.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-01-30 08:07:27
 */
@WebServlet("/login")
public class loginServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String LoginUser = request.getParameter("v");
        if ("普通用户登录".equals(LoginUser)) {
    
    
            UserDao userDao = new UserDao();
            User user = null;
            try {
    
    
                user = userDao.login(username, password);
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
            if (user != null) {
    
    
                request.getSession().setAttribute("user", user.getUsername());
                request.getRequestDispatcher("/index.jsp").forward(request, response);
            } else {
    
    
                request.setAttribute("error", "用户名/账号密码错误!");
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }
        }else{
    
    
            UserDao userDao = new UserDao();
            User user = null;
            try {
    
    
                user = userDao.rootLogin(username, password);
            } catch (SQLException e) {
    
    
                e.printStackTrace();
            }
            if (user != null) {
    
    
                request.getSession().setAttribute("user", user.getUsername());
                request.getRequestDispatcher("/root.jsp").forward(request, response);
            } else {
    
    
                request.setAttribute("error", "用户名/账号密码错误!");
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }
        }
    }
}

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.UserDao;
import com.example.LoginDem.entity.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

/**
 * @author brett
 * @date 2022-01-30 13:26:05
 */
@WebServlet("/register")
public class registerServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");

        User user = new User(username,password);
        UserDao userDao = new UserDao();
        boolean b = false;
        try {
    
    
            b = userDao.register(user);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        if (b){
    
    
            req.setAttribute("info","注册成功!");
        } else {
    
    
            req.setAttribute("info","注册失败(用户名重复)!");
        }
        req.getRequestDispatcher("/register.jsp").forward(req,resp);
    }
}

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.UserValidDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-01 17:14:59
 *
 * 使用ajax异步验证用户名
 */
@WebServlet("/UserValid")
public class UserValidServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //获取参数
        String username = request.getParameter("username");
        PrintWriter writer = response.getWriter();
        UserValidDao userValidDao = new UserValidDao();

        String data = "";
        try {
    
    
            if(userValidDao.userValid(username)){
    
    
                data = "用户名已被注册,请重新输入";
            }else if (!username.equals("")){
    
    
                data = "用户名可注册";
            }
            writer.write(data);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

5.5 对应的DAO类
package com.example.LoginDem.dao;
import com.example.LoginDem.entity.User;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 * @author brett
 * @date 2022-01-30 12:02:20
 *
 * 与数据库进行交互的类
 * 与数据库进行交互,实现了注册(向数据库中插入新的用户User)功能,
 * 登录(访问数据库与表格中所填数据比较,若一致则登陆成功,否则登录失败)功能
 */
public class UserDao {
    
    

    //此方法用于在数据库中查询信息并与login.jsp表格中所填信息比较,若数据库中存在
    //与表格所填数据一一对应相等,则登陆成功,否则登录失败
    public User login(String username, String password) throws SQLException {
    
    
        User user = new User();
        Connection connect = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
    
    
            connect = JDBCUtils.getConnect();
            String sql = "select * from UserInfo where `name`=? and `password`=?";
            ps = connect.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if (rs.next()){
    
    
                user.setUsername(rs.getString("name"));
                user.setPassword(rs.getString("password"));
            } else {
    
    
                user = null;
            };
        }catch (SQLException e){
    
    
            e.printStackTrace();
        }finally{
    
    
            JDBCUtils.clean(rs,ps,connect);
        }
        return user;
    }

    public User rootLogin(String username, String password) throws SQLException {
    
    
        User user = new User();
        Connection connect = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
    
    
            connect = JDBCUtils.getConnect();
            String sql = "select * from rootuser where `name`=? and `password`=?";
            ps = connect.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if (rs.next()){
    
    
                user.setUsername(rs.getString("name"));
                user.setPassword(rs.getString("password"));
            } else {
    
    
                user = null;
            };
        }catch (SQLException e){
    
    
            e.printStackTrace();
        }finally{
    
    
            JDBCUtils.clean(rs,ps,connect);
        }
        return user;
    }

    //注册用户,向数据库中写入新用户的信息
    public boolean register(User user) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "insert into UserInfo values (?,?)";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setString(1,user.getUsername());
        ps.setString(2,user.getPassword());
        int i = ps.executeUpdate();
        JDBCUtils.clean(null,ps,connect);
        return (i > 0);
    }
    // 查找数据库中所有用户
    public List<User> selectUser() throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "select * from userinfo";
        Statement statement = connect.createStatement();
        ResultSet rs = statement.executeQuery(sql);
        List<User> users = new ArrayList<>();
        while(rs.next()){
    
    
            User user = new User();
            user.setUsername(rs.getString(1));
            user.setPassword(rs.getString(2));
            users.add(user);
        }
        return users;
    }
}

package com.example.LoginDem.dao;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-01 17:19:13
 */
public class UserValidDao {
    
    
    public boolean userValid(String username) throws SQLException {
    
    
        if ("root".equals(username))
            return true;
        Connection connect = JDBCUtils.getConnect();
        String sql = "select * from userinfo where `name`=?";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setString(1,username);
        ResultSet rs = ps.executeQuery();
        boolean isTure = rs.next();
        JDBCUtils.clean(rs,ps,connect);
        return isTure;
    }
}

5.6 拦截未登录用户的请求
package com.example.LoginDem.Filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
 * @author brett
 * @date 2022-01-30 08:24:56
 */
@WebFilter("/*")
public class FilterDemo implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("开始拦截···");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    
    
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //获取请求的uri
        String requestURI = request.getRequestURI();
        if (requestURI.contains("login")||requestURI.contains("register")||requestURI.contains("UserValid")) {
    
    
            //如果请求的路径包含login(登录),register(注册),UserValid异步验证时就放行
            chain.doFilter(request,response);
        } else {
    
         //判断是否登录状态(未登录就拦截)
            HttpSession session = request.getSession();
            if (session == null || session.getAttribute("user") == null) {
    
    
                // 如果不是登陆页面也没有session则跳转到登录页面
                response.sendRedirect("/LoginDemo2/login.jsp");
            } else {
    
    
                chain.doFilter(request,response);
            }
        }
    }

    @Override
    public void destroy() {
    
    
    }
}

其中的注解 @WebFilter("/*") /*表示拦截所有请求。该注解也可以在web.xm文件中配置:

扫描二维码关注公众号,回复: 17361219 查看本文章
<filter>
	<filter-name>拦截器的名字</filter-name>
	<fliter-class>指定拦截器类的全限定名</filter-class>
</filter>
<filter-mapping>  <!-- 拦截器映射 -->
	<filter-name>拦截器的名字</filter-name>
	<url-pattern>要拦截的路径</url-pattern>
<servlet-name>Filter拦截的Servlet名称</servlet-name>
</filter-mapping>
5.7 首页
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
    <style>
        h2{
      
      
           text-align: center;
        }
    </style>
</head>
<body>
    <%@include file="head.jsp"%>
    <%@include file="nav.jsp" %>
    <h2><%= "登录成功!" %></h2><br/>
    <h2>Hello ${user}</h2>
</body>
</html>
5.8 导航栏

head.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/1/31
  Time: 9:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <style>
        #HeadFirst{
      
      
        height: 42px;
        width: 100%;
        background-color: #00000068;
        }
        #abc{
      
      
            font-size: 27px;
            color: whitesmoke;
            margin-left: 3px;
        }
        #b{
      
      
            height: 27px;
            width: 100px;
            color: white;
            margin-top: 2px;
            margin-left: 870px;
        }
        #exit{
      
      
            height: 30px;
            width: 50px;
            float: right;
            color: white;
            margin-top: 6px;
            margin-right: 2px;
            background-color: lightskyblue;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <div id="HeadFirst">
        <span id="abc">图书管理系统</span>
        <span id="b">当前用户 ${user}</span>
        <button id="exit" onclick="jump()">退出</button>
    </div>
    <script>
        function jump(){
      
      
            const e = document.createElement("a");
            e.href = "exit";
            document.body.appendChild(e);
            e.click();
        }
    </script>
</body>
</html>

nav.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/1/31
  Time: 11:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>导航栏</title>
    <script src="jquery-3.6.0.js"></script>
    <style>
        li a, #SelectToggle,#IDManagement{
      
      
            /*将内联元素转换为块级元素,便于padding设定*/
            display: block;
            /*去掉链接默认样式*/
            text-decoration: none;
            font-size: 18px;
            color: #000000;
            padding: 11px 20px;

        }
        li a:hover{
      
      
            background-color: #555;
            color: white;
        }
        ul{
      
      
            /*定位:使导航栏跟随滚动条滚动*/
            position: fixed;
            list-style-type: none;
            padding: 0;
            margin: 0;
            width: 150px;
            height: 100%;
            background-color: #DDDDDD;
        }
        .Select, .ID{
      
      
           background-color: rgba(0,0,0,.1);
            font-size: 14px;
        }
    </style>
</head>
<body>
    <div id="nav">
        <ul>
            <li><a href="index.jsp">首页</a></li>
            <li id="SelectToggle">图书查询</li>
            <li class="Select"><a href="${pageContext.request.contextPath}/SelectBook">图书清单</a></li>
            <li class="Select"><a href="${pageContext.request.contextPath}/SelectByName">按名查询</a></li>
            <li><a href="${pageContext.request.contextPath}/SelectBorrowBook">借阅管理</a></li>
            <li id="IDManagement">账号管理</li>
            <li class="ID"><a href="${pageContext.request.contextPath}/changePassword.jsp">修改密码</a></li>
            <li class="ID"><a id="A" onclick="isSure()">注销账号</a></li>
        </ul>
    </div>
    <script type="text/javascript">
        $(document).ready(function (){
      
      
            $("#SelectToggle").click(function (){
      
      
                $(".Select").slideToggle(500);
            })
            $("#IDManagement").click(function (){
      
      
                $(".ID").slideToggle(500);
            })
        });
        function isSure(){
      
      
            if(confirm("确认注销?")){
      
      
                window.location.href="${pageContext.request.contextPath}/Delete";
            }
        }
    </script>
</body>
</html>

nav2.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/1/31
  Time: 11:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>导航栏</title>
    <script src="jquery-3.6.0.js"></script>
    <style>
        li a{
      
      
            /*将内联元素转换为块级元素,便于padding设定*/
            display: block;
            /*去掉链接默认样式*/
            text-decoration: none;
            font-size: 18px;
            color: #000000;
            padding: 11px 20px;

        }
        li a:hover{
      
      
            background-color: #555;
            color: white;
        }
        ul{
      
      
            /*定位:使导航栏跟随滚动条滚动*/
            position: fixed;
            list-style-type: none;
            padding: 0;
            margin: 0;
            width: 150px;
            height: 100%;
            background-color: #DDDDDD;
        }
    </style>
</head>
<body>
<div id="nav">
    <ul>
        <li><a href="root.jsp">首页</a></li>
        <li><a href="${pageContext.request.contextPath}/BookManager">图书管理</a></li>
        <li><a href="${pageContext.request.contextPath}/SelectUser">用户管理</a></li>
    </ul>
</div>
</body>
</html>

root.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/2
  Time: 19:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>管理员页面</title>
    <style>
        h2{
      
      
            text-align: center;
        }
    </style>
</head>
<body>
    <%@include file="head.jsp" %>
    <%@include file="nav2.jsp" %>
    <h2><%= "登录成功!" %></h2><br/>
    <h2>Hello 管理员 ${user}</h2>
</body>
</html>

5.9 exit的servlet
package com.example.LoginDem.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
 * @author brett
 * @date 2022-01-30 19:40:00
 */
@WebServlet("/exit")
public class exitServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        String username = (String)session.getAttribute("user");
        if (username != null) {
    
    
            session.removeAttribute("user");  // 删除用户对应的Session
        }
        // 请求转发到登录界面
        request.getRequestDispatcher("/login.jsp").forward(request,response);
    }
}

5.9 图书清单(分页查询)

Pageselect.jsp

<%@ page import="com.example.LoginDem.utils.Page" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/2
  Time: 9:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>select</title>
    <style>
        #showbody {
      
      
            position: absolute;
            margin: 5% 30%;
        }
        a {
      
      
            text-decoration: none;
        }
    </style>
</head>
<body>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@include file="head.jsp"%>
    <%@include file="nav.jsp"%>
    <div id="showbody">
        <%
            Page pageObject = (Page) request.getAttribute("page");
            out.print("<h1>当前页面:"+pageObject.getCurrentPageNo()+"</h1>");
            request.setAttribute("booklist1",pageObject.getBookList());
        %>
        <c:if test="${!empty booklist1}">
            <table align="center" width="500" border="2" style="border-collapse:collapse;">
                <thead>
                    <caption>图书列表</caption>
                    <tr>
                        <td>BookId</td>
                        <td>Name</td>
                        <td>Price</td>
                        <td>Author</td>
                        <td>Status</td>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach items="${booklist1}" var="book">
                        <tr>
                            <td>${book.bookid}</td>
                            <td>${book.name}</td>
                            <td>${book.price}</td>
                            <td>${book.author}</td>
                            <td>${book.status}</td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>
        </c:if>
        <br><br><br>
        <%
            for (int i=1;i<=pageObject.getTotalPageCount();i++){
        %>
        <a href="${pageContext.request.contextPath}/SelectBook?pageNo=<%=i%>"><%=i%> &nbsp;</a>
        <%
            }
        %>
    </div>
</body>
</html>

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.SelectBookDaoImpl;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.Page;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/*
 * @author brett
 * @date 2022-02-01 22:48:17
 */
@WebServlet("/SelectBook")
public class SelectBookServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        SelectBookDaoImpl selectBookDao = new SelectBookDaoImpl();

        // 获取要查询的起始页面
        String pageNo = request.getParameter("pageNo") != null?request.getParameter("pageNo"):"1";
        int currentPageNo = Integer.parseInt(pageNo);
        Page page = new Page();
        page.setCurrentPageNo(currentPageNo);
        page.setPageSize(5);
        page.setTotalCount(selectBookDao.getTotalCount());

        // 获取查询的图书列表
        List<Book> list = selectBookDao.getPageBookList(page.getCurrentPageNo(),page.getPageSize());
        page.setBookList(list);

        // 封装数据
        request.setAttribute("page",page);

        // 请求转发
        request.getRequestDispatcher("/Pageselect.jsp").forward(request,response);
    }
}

package com.example.LoginDem.dao.Impl;
import com.example.LoginDem.entity.Book;
import java.util.List;

public interface SelectBookDao {
    
    

    // 查询总条数
    public int getTotalCount();

    //根据起始下标和每页显示数量查询数据
    public List<Book> getPageBookList(int pageNo, int pagesize);

}



package com.example.LoginDem.dao;
import com.example.LoginDem.dao.Impl.SelectBookDao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-01 21:35:44
 *
 * 分页查询数据
 */
public class SelectBookDaoImpl implements SelectBookDao {
    
    

    // 查询总条数
    @Override
    public int getTotalCount() {
    
    
        int count = 0;
        Connection connect;
        try {
    
    
           connect = JDBCUtils.getConnect();
           String sql = "select count(bookid) from book";  // 统计表中的总行数
            PreparedStatement ps = connect.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            rs.next();
            count = rs.getInt(1);
            JDBCUtils.clean(rs,ps,connect);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        return count;
    }

    // 根据要查询的页数和每页展示数据的数量来查询数据
    @Override
    public List<Book> getPageBookList(int pageNo, int pagesize) {
    
    
        PreparedStatement ps;
        ResultSet rs;
        List<Book> list = new ArrayList<>();
        try {
    
    
            Connection connect = JDBCUtils.getConnect();
            String sql = "select * from book limit "+(pageNo - 1)*pagesize+","+pagesize;
            // limit 3,2 表示从第4个开始查询两个记录
            ps = connect.prepareStatement(sql);
            System.out.println(sql);
            rs = ps.executeQuery();

            while (rs.next()){
    
    
                Book book = new Book();
                book.setBookid(rs.getInt(1));
                book.setName(rs.getString(2));
                book.setPrice(rs.getInt(3));
                book.setAuthor(rs.getString(4));
                book.setStatus(rs.getString(5));
                list.add(book);
            }
            JDBCUtils.clean(rs,ps,connect);
        } catch (SQLException e) {
    
    
            e.printStackTrace();
        }
        return list;
    }
}

5.10 按名查询

selectByName.jsp

<%@ page import="com.example.LoginDem.utils.Page" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/2
  Time: 12:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SelectByName</title>
    <style>
        #SelectByName{
      
      
            position: absolute;
            text-align: center;
            margin-left: 400px;
            margin-top: 50px;
        }
        #select{
      
      
            border-radius: 5px;
            background-color:lightskyblue;
            color: white;
        }
        #showBody{
      
      
            position: absolute;
            margin: 15% 28%;
        }
    </style>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@include file="head.jsp" %>
    <%@include file="nav.jsp" %>
    <div id="SelectByName">
        <form method="post" action="${pageContext.request.contextPath}/SelectByName">
            <span>请输入书名关键字查询:</span>
            <input type="text" name="KeyWord" placeholder="关键字" />
            <button id="select" type="submit">查询</button>
        </form>
    </div>
    <%
        Page pageObject = (Page) request.getAttribute("pageObject2");
        if (pageObject != null){
            request.setAttribute("booklist",pageObject.getBookList());
        }
    %>
    <div id="showBody">
        <c:if test="${!empty booklist}">
            <table align="center" width="500" border="2" style="border-collapse:collapse;">
                <thead>
                <caption>图书列表</caption>
                <tr>
                    <td>BookId</td>
                    <td>Name</td>
                    <td>Price</td>
                    <td>Author</td>
                    <td>Status</td>
                    <td>编辑</td>
                </tr>
                <tbody>
                <c:forEach items="${booklist}" var="book">
                    <tr>
                        <td>${book.bookid}</td>
                        <td>${book.name}</td>
                        <td>${book.price}</td>
                        <td>${book.author}</td>
                        <td class="status">${book.status}</td>
    <td><button type="button" class="btn" onclick="window.location.href='${pageContext.request.contextPath}/Borrow?id=${book.bookid}&name=${book.name}&price=${book.price}&author=${book.author}&event.returnValue=false'">借阅</button></td>
<%--  <td><a href="${pageContext.request.contextPath}/Borrow?id=${book.bookid}&name=${book.name}&price=${book.price}&author=${book.author}">借阅</a></td>--%>
                    </tr>
                </c:forEach>
                </tbody>
            </table>
        </c:if>
    </div>
    <div style="color: red;text-align: center;margin-top: 300px">${error2}</div>
</body>
<script>
    $(document).ready(function (){
      
      
       let status = document.getElementsByClassName("status");
       let btn = document.getElementsByClassName("btn");
        for (let i=0;i<status.length;i++){
      
      
            if (status[i].textContent === "true"){
      
      
                btn[i].innerHTML="已借阅";
                $(btn[i]).attr("disabled","disabled");  //jquery禁用按钮
                // $(btn[i]).removeAttr("disabled")     //解除禁用
            }
        }
    });
</script>
</html>

这里有个易错的问题,window.location.href=url? 后只能代一个参数,要加上event.returnValue=false才可以。

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.SelectByNameDao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.Page;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-02 12:28:08
 */
@WebServlet("/SelectByName")
public class SelectByNameServlet extends HttpServlet {
    
    
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    
    
        // 设置编码方式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");

        String Key = request.getParameter("KeyWord");
        if ("".equals(Key)){
    
    
            request.getRequestDispatcher("/selectByName.jsp").forward(request,response);
        }
        SelectByNameDao selectByNameDao = new SelectByNameDao();
        List<Book> books = selectByNameDao.SelectByName(Key);
        if (books.isEmpty()){
    
    
            request.setAttribute("error2","未开始查询或未查询到图书!");
        } else {
    
    
            Page page = new Page();
            page.setBookList(books);
            request.setAttribute("pageObject2",page);
        }
        request.getRequestDispatcher("/selectByName.jsp").forward(request,response);
    }
}
package com.example.LoginDem.dao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-02 15:05:02
 */
public class SelectByNameDao {
    
    
    public List<Book> SelectByName(String key){
    
    
        List<Book> books = new ArrayList<>();
        Book book;
        Connection connect;
        PreparedStatement ps;
        ResultSet rs;
        String sql = "select * from book where bookname like '%"+key+"%'";
        try {
    
    
            connect = JDBCUtils.getConnect();
            ps = connect.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()){
    
    
                book = new Book();
                book.setBookid(rs.getInt(1));
                book.setName(rs.getString(2));
                book.setPrice(rs.getInt(3));
                book.setAuthor(rs.getString(4));
                book.setStatus(rs.getString(5));
                books.add(book);
            }
        }catch(SQLException e){
    
    
            e.printStackTrace();
        }
        return books;
    }
}

5.11 借阅管理
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.UserBookDao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.Page;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-02 10:21:39
 */
@WebServlet("/SelectBorrowBook")
public class SelectBorrowBookServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        UserBookDao userBook = new UserBookDao();
        String  user = (String) request.getSession().getAttribute("user");
        try {
    
    
            List<Book> books = userBook.resultBook(user);
            Page page = new Page();
            page.setBookList(books);
            request.setAttribute("BorrowBook",page);
           request.getRequestDispatcher("/borrow.jsp").forward(request,response);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

borrow.jsp

<%@ page import="com.example.LoginDem.utils.Page" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/1
  Time: 12:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>借阅管理</title>
    <style>
        #showBody{
      
      
            position: absolute;
            margin: 40px 28% 12%;
        }
    </style>
</head>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@include file="head.jsp" %>
<%@include file="nav.jsp" %>
<%
    Page pageObject = (Page) request.getAttribute("BorrowBook");
    if (pageObject != null){
        request.setAttribute("booklist",pageObject.getBookList());
    }
%>
<div id="showBody">
    <c:if test="${!empty booklist}">
        <table align="center" width="500" border="2" style="border-collapse:collapse;">
            <thead>
            <caption>已借阅的书籍</caption>
            <tr>
                <td>id</td>
                <td>Name</td>
                <td>Price</td>
                <td>Author</td>
                <td>操作</td>
            </tr>
            <tbody>
            <c:forEach items="${booklist}" var="book">
                <tr>
                    <td>${book.bookid}</td>
                    <td>${book.name}</td>
                    <td>${book.price}</td>
                    <td>${book.author}</td>
                    <td><button type="button" onclick="window.location.href='${pageContext.request.contextPath}/ReturnBook?id=${book.bookid}&event.returnValue=false'">归还</button></td>
                </tr>
            </c:forEach>
            </tbody>
        </table>
    </c:if>
</div>
</body>
</html>
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.ReturnBookDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-01 11:36:59
 */
@WebServlet("/ReturnBook")
public class ReturnBookServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 获取参数
        int id = Integer.parseInt(request.getParameter("id"));
        String user = (String) request.getSession().getAttribute("user");
        ReturnBookDao returnbook = new ReturnBookDao();
        try {
    
    
            returnbook.returnBook(user,id);
            request.getRequestDispatcher("/SelectBorrowBook").forward(request,response);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

package com.example.LoginDem.dao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-02 12:51:30
 *
 * 每个用户借阅书籍表
 */
public class UserBookDao {
    
    
    public void createTable(String user) throws SQLException {
    
    
        String userbook = user + "book";
        System.out.println(userbook);
        try{
    
    
            boolean flag = JDBCUtils.isExists(user);
            Connection connect = JDBCUtils.getConnect();
            if (!flag) {
    
    
                System.out.println(flag);
                String sql2 = "create table "+userbook+" (bookid int primary key," +
                        "bookname varchar(32) not null," +
                        "price int," +
                        "author varchar(32)" +
                        ")charset=utf8;";
                PreparedStatement ps = connect.prepareStatement(sql2);
                ps.execute();
                JDBCUtils.clean(null,ps,connect);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
    public void addBook(String user, Book book) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String userbook = user + "book";
                try{
    
    
                String sql3 = "insert into "+userbook+" values(?,?,?,?);";
                String sql4 = "update book set status='true' where bookid = ?";
                PreparedStatement ps = connect.prepareStatement(sql3);
                ps.setInt(1,book.getBookid());
                ps.setString(2,book.getName());
                ps.setInt(3,book.getPrice());
                ps.setString(4,book.getAuthor());
                connect.setAutoCommit(false); //开启事务
                ps.executeUpdate();
                PreparedStatement ps2 = connect.prepareStatement(sql4);
                ps2.setInt(1,book.getBookid());
                ps2.executeUpdate();
                connect.commit();  //提交事务
                ps.close();
                ps2.close();
                connect.close();
        }catch(SQLException e){
    
    
            connect.rollback();
            e.printStackTrace();
        }
    }
    public List<Book> resultBook(String user) throws SQLException {
    
    
        String userbook = user + "book";
        if (!JDBCUtils.isExists(user)){
    
    
            createTable(user);
        }
        Connection connect = JDBCUtils.getConnect();
        String sql = "select * from "+userbook;
        PreparedStatement ps = connect.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        List<Book> books = new ArrayList<>();
        while (rs.next()){
    
    
            Book book = new Book();
            book.setBookid(rs.getInt(1));
            book.setName(rs.getString(2));
            book.setPrice(rs.getInt(3));
            book.setAuthor(rs.getString(4));
            books.add(book);
        }
        return books;
    }
}

5.12 账号管理

changePassword.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/1
  Time: 12:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>修改密码</title>
    <style>
        #Form {
      
      
            width: 400px;
            height: 300px;
            margin: 10% 40%;
        }
    </style>
</head>
<body>
<%@include file="head.jsp" %>
<%@include file="nav.jsp" %>
    <div id="Form">
        <form action="${pageContext.request.contextPath}/ChangePwd" id="Submit">
            <span>输入原密码:</span><input id="old" type="password" name="OldPwd" onfocus="Fun2('old','errorOld')"/>
            <span id="errorOld" style="color: red;font-size: 10px">${errorOld}</span><br><br>
            <span>输入新密码:</span><input id="new1" type="password" name="NewPwd" onfocus="Fun2('new1','errorNew')"/>
            <span id="errorNew" style="color: red;font-size: 10px"></span><br><br>
            <span>确认新密码:</span><input id="new2" type="password" onfocus="Fun2('new2','errorNew2')"/>
            <span id="errorNew2" style="color: red;font-size: 10px"></span><br><br>
            <button type="button" id="btn" onclick="Fun()">提交</button>
        </form>
    </div>
</body>
<script>
    function Fun(){
      
      
        if(!confirm("确认修改密码?")){
      
      
            window.location.href="index.jsp";
        } else{
      
      
            let old = document.getElementById("old").value;
            let new1 = document.getElementById("new1").value;
            let new2 = document.getElementById("new2").value;
            if (old===''){
      
      
                document.getElementById("errorOld").innerHTML="密码不能为空!";
                return;
            }
            if (new1===''){
      
      
                document.getElementById("errorNew").innerHTML="密码不能为空!";
                return;
            }
            if (new1!==new2){
      
      
                document.getElementById("errorNew2").innerHTML="密码不一致!";
                return;
            }
            document.getElementById("Submit").submit();
        }
    }
    function Fun2(id,errorId){
      
      
        let Id = document.getElementById(id).value;
        if (Id===''){
      
      
            document.getElementById(errorId).innerHTML="";
        }
    }
</script>
</html>

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.ChangeDelUserDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-02 13:54:58
 *
 * 修改密码
 */
@WebServlet("/ChangePwd")
public class ChangePwdServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 获取参数
        String oldPwd = request.getParameter("OldPwd");
        String newPwd = request.getParameter("NewPwd");
        String user = (String) request.getSession().getAttribute("user");

        ChangeDelUserDao changeUser = new ChangeDelUserDao();
        try {
    
    
            if (!changeUser.change(user,oldPwd,newPwd)){
    
    
                request.setAttribute("errorOld","输入的原密码不正确!");
                request.getRequestDispatcher("/changePassword.jsp").forward(request,response);
            }else {
    
    
                request.getSession().removeAttribute("user");
                //  response.sendRedirect("/login.jsp"); 错误,请求转发和重定向不能同时使用
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            }
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

package com.example.LoginDem.dao;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
/**
 * @author brett
 * @date 2022-02-02 14:03:00
 */
public class ChangeDelUserDao {
    
    
    //修改密码
    public boolean change(String user,String oldPwd,String newPwd) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "select * from userinfo where `name`=? and `password`=?";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setString(1,user);
        ps.setString(2,oldPwd);
        ResultSet rs = ps.executeQuery();
        while(rs.next()){
    
    
            if (rs.getString(2).equals(oldPwd)){
    
     //判断原密码是否正确
                String sql2 = "update userinfo set `password`=? where `name`=?";
                PreparedStatement ps2 = connect.prepareStatement(sql2);
                ps2.setString(1,newPwd);
                ps2.setString(2,user);
                ps2.executeUpdate();
                JDBCUtils.clean(rs,ps2,connect);
                return true;
            }
        }
        ps.close();
        JDBCUtils.clean(rs,ps,connect);
        return false;
    }
   // 注销用户(判断用户借阅表是否归还)
    public void deleteUser(String user) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "delete from userinfo where `name`=?";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setString(1,user);
        ps.executeUpdate();
        JDBCUtils.clean(null,ps,connect);
    }
}

package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.ChangeDelUserDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-02 19:11:33
 * 注销账号
 */
@WebServlet("/Delete")
public class DeleteServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        if (request.getParameter("userName")!=null){
    
      //管理员删除用户
            String username = request.getParameter("userName");
            ChangeDelUserDao userDel = new ChangeDelUserDao();
            try {
    
    
                userDel.deleteUser(username);
                request.getRequestDispatcher("/SelectUser").forward(request,response);
            } catch (SQLException throwables) {
    
    
                throwables.printStackTrace();
            }
        }
        else{
    
       //用户自己注销
            String user = (String) request.getSession().getAttribute("user");
            ChangeDelUserDao changeDelUser = new ChangeDelUserDao();
            try {
    
    
                changeDelUser.deleteUser(user);
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            } catch (SQLException throwables) {
    
    
                throwables.printStackTrace();
            }
        }
    }
}

5.13 root图书管理
package com.example.LoginDem.Servlet;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.Page;
import com.example.LoginDem.dao.SelectBookDaoImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-01 21:02:07
 */
@WebServlet("/BookManager")
public class BookManagerServlet extends HttpServlet{
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String pageNo = request.getParameter("pageNo") != null?request.getParameter("pageNo"):"1";
        SelectBookDaoImpl selectBookDao = new SelectBookDaoImpl();
        int currentPageNo = Integer.parseInt(pageNo);
        Page page = new Page();
        page.setCurrentPageNo(currentPageNo);
        page.setPageSize(5);
        page.setTotalCount(selectBookDao.getTotalCount());
        List<Book> books = selectBookDao.getPageBookList(page.getCurrentPageNo(),page.getPageSize());
        page.setBookList(books);
        request.setAttribute("rootSelect",page);
        request.getRequestDispatcher("/rootManager.jsp").forward(request,response);
    }
}

rootManager.jsp

<%@ page import="com.example.LoginDem.utils.Page" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/2
  Time: 9:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="UTF-8">
  <title>rootManager</title>
  <style>
    #showbody {
      
      
      position: absolute;
      margin: 5% 30%;
    }
    a {
      
      
      text-decoration: none;
    }
  </style>
</head>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@include file="head.jsp"%>
<%@include file="nav2.jsp"%>
<div id="showbody">
  <%
    Page pageObject = (Page) request.getAttribute("rootSelect");
    out.print("<h1>当前页面:"+pageObject.getCurrentPageNo()+"</h1>");
    request.setAttribute("booklist3",pageObject.getBookList());
  %>
  <c:if test="${!empty booklist3}">
    <table align="center" width="500" border="2" style="border-collapse:collapse;">
      <thead>
      <caption>图书列表</caption>
      <tr>
        <td>BookId</td>
        <td>Name</td>
        <td>Price</td>
        <td>Author</td>
        <td>Status</td>
        <td>操作</td>
      </tr>
      </thead>
      <tbody>
      <c:forEach items="${booklist3}" var="book">
        <tr>
          <td>${book.bookid}</td>
          <td>${book.name}</td>
          <td>${book.price}</td>
          <td>${book.author}</td>
          <td>${book.status}</td>
          <td><button type="button" onclick="window.location.href='${pageContext.request.contextPath}/RootDelete?id=${book.bookid}'">删除</button></td>
        </tr>
      </c:forEach>
      </tbody>
    </table>
  </c:if>
  <br><br><br>
  <%
    for (int i=1;i<=pageObject.getTotalPageCount();i++){
  %>
  <a href="${pageContext.request.contextPath}/BookManager?pageNo=<%=i%>"><%=i%>&nbsp;</a>
  <%
    }
  %>
  <br><br>
  <button onclick="window.location.href='${pageContext.request.contextPath}/addBook.jsp'">增加图书</button>
</div>
</body>
</html>
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.BookManagerDaoImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-01 22:17:52
 */
@WebServlet("/RootDelete")
public class RootDeleteServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //设置编码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 获取参数
        String id = request.getParameter("id");
        BookManagerDaoImpl bookManagerDao = new BookManagerDaoImpl();
        try {
    
    
            bookManagerDao.deleteBook(Integer.parseInt(id));
            request.getRequestDispatcher("/BookManager").forward(request,response);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

package com.example.LoginDem.dao.Impl;
import com.example.LoginDem.entity.Book;

import java.sql.SQLException;
import java.util.List;
public interface BookManagerDao {
    
    
    // 查找图书(使用分页查找)

    // 增加书籍
    public void addBook(Book book) throws SQLException;
    // 删除数据
    public void deleteBook(int bookid) throws SQLException;
}



package com.example.LoginDem.dao;
import com.example.LoginDem.dao.Impl.BookManagerDao;
import com.example.LoginDem.entity.Book;
import com.example.LoginDem.utils.JDBCUtils;
import java.sql.*;
/**
 * @author brett
 * @date 2022-02-01 21:22:00
 */
public class BookManagerDaoImpl implements BookManagerDao {
    
    

    @Override
    public void addBook(Book book) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "insert into book values(null,?,?,?,'false')";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setString(1,book.getName());
        ps.setInt(2,book.getPrice());
        ps.setString(3,book.getAuthor());
        ps.executeUpdate();
        JDBCUtils.clean(null,ps,connect);
    }

    @Override
    public void deleteBook(int bookid) throws SQLException {
    
    
        Connection connect = JDBCUtils.getConnect();
        String sql = "delete from book where bookid=?";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setInt(1,bookid);
        ps.executeUpdate();
        JDBCUtils.clean(null,ps,connect);
    }
}

addBook.jsp

<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/1
  Time: 12:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>addBook</title>
    <style>
        #Form {
      
      
            width: 400px;
            height: 300px;
            margin: 10% 40%;
        }
    </style>
</head>
<body>
<%@include file="head.jsp" %>
<%@include file="nav2.jsp" %>
<div id="Form">
    <form action="${pageContext.request.contextPath}/AddBook">
        <span>输入书名: </span><input type="text" name="bookname" />
        <br><br>
        <span>输入价格: </span><input type="text" name="price" />
        <br><br>
        <span>输入作者: </span><input type="text" name="author"/>
        <br><br>
        <button>提交</button>
    </form>
</div>
</body>
</html>
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.BookManagerDaoImpl;
import com.example.LoginDem.entity.Book;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
/**
 * @author brett
 * @date 2022-02-01 22:47:46
 *
 * 增加书籍
 */
@WebServlet("/AddBook")
public class addBookServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String bookName = request.getParameter("bookname");
        int price = Integer.parseInt(request.getParameter("price"));
        String author = request.getParameter("author");
        Book book = new Book();
        book.setName(bookName);
        book.setPrice(price);
        book.setAuthor(author);
        BookManagerDaoImpl bookManagerDao = new BookManagerDaoImpl();
        try {
    
    
            bookManagerDao.addBook(book);
            request.getRequestDispatcher("/BookManager").forward(request,response);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

5.14 root用户管理
package com.example.LoginDem.Servlet;
import com.example.LoginDem.dao.UserDao;
import com.example.LoginDem.entity.User;
import com.example.LoginDem.utils.UserObject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
/**
 * @author brett
 * @date 2022-02-01 23:29:04
 */
@WebServlet("/SelectUser")
public class SelectUserServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        // 设置编码方式
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        UserDao userDao = new UserDao();
        try {
    
    
            List<User> users = userDao.selectUser();
            UserObject userObject = new UserObject(users);
            request.setAttribute("userObject",userObject);
            request.getRequestDispatcher("/userManager.jsp").forward(request,response);
        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }
    }
}

userManager.jsp

<%@ page import="com.example.LoginDem.utils.UserObject" %>
<%--
  Created by IntelliJ IDEA.
  User: brett
  Date: 2022/2/2
  Time: 12:14
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>userManager</title>
  <style>
    #showBody{
      
      
      position: absolute;
      margin: 40px 28% 12%;
    }
  </style>
</head>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@include file="head.jsp" %>
<%@include file="nav2.jsp" %>
<%
  UserObject userObject = (UserObject) request.getAttribute("userObject");
  if (userObject != null){
    request.setAttribute("userlist",userObject.getUserList());
  }
%>
<div id="showBody">
  <c:if test="${!empty userlist}">
    <table align="center" width="500" border="2" style="border-collapse:collapse;">
      <thead>
      <caption>用户信息</caption>
      <tr>
        <td>Name</td>
        <td>Password</td>
        <td>操作</td>
      </tr>
      <tbody>
      <c:forEach items="${userlist}" var="user">
        <tr>
          <td>${user.username}</td>
          <td>${user.password}</td>
          <td><button type="button" onclick="window.location.href='${pageContext.request.contextPath}/Delete?userName=${user.username}'">删除</button></td>
        </tr>
      </c:forEach>
      </tbody>
    </table>
  </c:if>
</div>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_49472679/article/details/122788497