JavaWeb 简单的图书管理系统(jsp+servlet)

news2024/11/17 11:37:04

关于与需要的文件下载

字体颜色分类:

黑色 表示正文

蓝色 表示一个超链接,点击可以跳转页面

橙色 表示一级标题或项目的包名

绿色 表示子级内容中含有代码或解释的标题

紫色 表示一个代码块的标题

红色 表示()外的文件是()内文件的子类,实现类或依赖

浅灰 表示解释或其类型

高亮显示 表示重点或者需要注意未被解决的Bug

纯小白,有什么做得不好的地方请各位大佬指正,谢谢!

项目/数据库/Jar文件下载

Java-Project文件夹中存放项目,需要的同学可以下载看一下,也欢迎进行修改!

Java-Jar文件夹中存放.java或其他类型需要引入的外部文件

Java-数据库 文件夹中存放建库建表的sql文件

jar文件里面有不需要的可以不下载 本文档只用到了mysql connector

sqlserver与oracle数据库请下载sqljdbc4/ojdbc14并修改数据库连接语句

(连接类:src - Jdbc - Tool - BookManageOper 修改时仅需修改常量值)

一.所有页面与项目介绍

  1. 首页面

  1. 添加页面

包含四个主要模块:查询 - 增加 - 删除 - 分页

可以通过当前项目对Jsp+Servlet的基础进行检验

注意!我没有对页面进行任何的美化

所有代码只是为了做出来作业而写的

如果想要美化可以自己修改Script下的内容

二.所用软件与文件

软件

  1. Idea

  1. SQLyog(mysql) 可使用其他数据库代替

JAR文件

  1. mySql-Connector-java

注意!jar文件需要在File-Project Structure-Artifacts中引入到WEB-INF/lib中

三.数据库的建立

在进行代码的编写之前,我们首先把数据库与表建立好

我的数据库仅适用于MySql,其他数据库请自行建库建表!

项目/数据库/Jar文件下载中 Java - 数据库 - BookManage.sql 进入SQLyog执行即可

Book表(table)

id

int

主键 自增

编号

name

varchar(50)

非空

书名

author

varchar(50)

非空

作者名

time

date

非空

购入时间

type

int

非空 外键(type-id)

类型

Book表.png

Type表(table)

id

int

主键 自增

编号

name

varchar(50)

非空

类型名

Type表.png

四.导入Jar文件

在idea2018中 导入jar文件 其他版本或软件请自行寻找教程

  1. 菜单栏-File-Project Structure中选择Modules

  1. 选择Dependencies

  1. 在Dependencies-Scope旁边选择绿色的加号中选择jars or .....

  1. 选择需要加入的Jar文件并点击Apply 退出当前弹框

  1. 再次进入 菜单栏-File-Project Structure 但是选择Artifacts

  1. 在Artifacts中选择Output Layout

  1. 在右方Available Elements选择需要加入的jar

  1. 选择后在下方点击Fix 并选择Add 'xx.jar' to Artifacts 或者 Add All...

五.代码编写

    • src - Jdbc

(1)src-jdbc包含的文件与其详解

src - Jdbc包含Dao(数据访问接口) , Impl(Dao实现类) , Entity(实体类) , Tool(工具类)

Dao(数据访问接口):包含BookDao与TypeDao 主要用来进行方法的定义

Impl(Dao实现类):包含BookDaoImpl与TypeDaoImpl,他们都继承自Dao中的接口,主要进行抽象方法的具体实现

Entity(实体类):包含Book与Type,也就是数据库中的表,其中的字段就是数据库的字段

Tool(工具类):包含BookManageOper与Page,用于数据库的连接开启与关闭和分页的操作

(2)src - jdbc - Tool

(2.1)src - jdbc - Tool - BookManageOper[数据库连接][工具类]

首先就是进行数据库的连接 需要用到Jar文件连接数据库

代码的解释已经在注释里了,如果有什么问题欢迎提出!谢谢!

package Jdbc.Tool;
import java.io.Console;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class BookManageOper {
    //创建数据与数据库的连接的字符常量 修改数据库仅需修改url中的bookmanage即可
    //connector8.x中已经进行修改classname与url,详细请前往其他教程寻找
    private static final String classname="com.mysql.jdbc.Driver";
    //mysql5.x不需要?后面的内容 但我是8.x并且用的时connector5 所以需要加?后的内容
    private static final String url="jdbc:mysql://localhost:3306/bookmanage?useUnicode=true&characterEncoding=utf8";
    private static final String user="root";
    private static final String pwd="123456";
    //创建与数据库的连接 返回Connection连接对象
    public static Connection create(){
        //首先创建一个Connection对象 并赋值为null
        Connection connection=null;
        try{
            //为Connection对象赋值(获取连接)
            Class.forName(classname);
            connection=DriverManager.getConnection(url,user,pwd);
        }catch (Exception ex){
            //当发生错误时在控制台(Console)中输出错误信息 
            //并显示Tool - BookManageOper - create() Error
            ex.printStackTrace();
            System.out.println("Tool - BookManageOper - create() Error");
        }
        //返回connection对象
        return  connection;
    }
    //通过三个对象关闭数据库的连接
    public static void close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){
        try{
            //如果不为空则进行关闭 为空则跳过
            if(connection!=null){
                connection.close();
            }else if(preparedStatement!=null){
                preparedStatement.close();
            }else if(resultSet!=null){
                resultSet.close();
            }
        }catch (Exception ex){
            ex.printStackTrace();
            System.out.println("Tool - BookManageOper - close(C,P,R) Error");
        }
    }
}

(2.2)src - jdbc - Tool - Page[翻页][工具类]

package Jdbc.Tool;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Page {
    //当前页数 默认为1
    private int thisPage=1;
    //总页数
    private int sumPage;
    //每页显示行数{固定为5 修改的时候修改5为x即可}
    private int showPage=5;
    //所有记录数 可以使用这个来进行代替sumpage? 【未实现】
    private int sumRecord;
    
    //单例模式
    private Page(){

    }

    private static Page page=null;

    public static Page getPage(){
        if(page==null)
            page=new Page();
        return page;
    }

    //私有的字段 用于数据库连接与操作
    private Connection connection=null;
    private PreparedStatement preparedStatement=null;
    private ResultSet resultSet=null;

    //在这里我没有给sumRecord创建get/set方法 因为没有外部类使用到他
    //如果有使用的需求可以加上 没有需求可以把sumRecord直接删除 在下方sum定义局部变量

    public int getThisPage() {
        return thisPage;
    }
    
    //当设置当前页数时,进行判断
    public void setThisPage(int thisPage) {
        //如果大于0且小于等于总页数,正常运行
        if(thisPage>0&&thisPage<=sumPage){
            this.thisPage=thisPage;
        }
        //如果当前页数大于总页数,那么跳转到最后一页(设置为总页数)
        else if(thisPage>sumPage){
            this.thisPage=getSumPage();
        }
        //如果都不满足(小于0) 那么设为默认值1
        else{
            this.thisPage=1;
        }
    }

    public int getSumPage() {
        return sumPage;
    }
    
    //当设置总页数时,进行判断
    public void setSumPage(int sumPage) {
        //当总页数大于0时 进行赋值 否则将sumPage设为1(可以不设else 那么出现<0时SumPage不变)
        if(sumPage>0){
            this.sumPage = sumPage;
            //当总页数设置完之后,需要将当前页数设为当前页数
            //因为当删除数据之后 4页变成了3页 那么当前页数不能继续为4 而是为最大页数3
            this.setThisPage(this.getThisPage());
        }else{
            this.sumPage = 1;
        }
    }

    public int getShowPage() {
        return showPage;
    }

    public void setShowPage(int showPage) {
        //这里可以不进行判断,因为没在外面设置ShowPage
        //但是有些页面需要进行每页显示的修改 如论坛
        //需要进行每页显示的修改时需要进行判断
        if(showPage>=1&&showPage<=99){
            this.showPage = showPage;
        }
    }

    //获取总记录数 初始化或每次添加、删除结束后执行
    public void loadSumRecord(){
        System.out.println("Tool - Page - getSumPage()");
        try{
            //创建Connection连接
            connection=BookManageOper.create();
            //查询Book表的所有记录
            String sql="select count(1) from book";
            preparedStatement=connection.prepareStatement(sql);
            resultSet=preparedStatement.executeQuery();
            //因为是返回count(1)[只返回一个数据] 所以使用if
            if(resultSet.next()){
                sumRecord=resultSet.getInt(1);
                //三目运算符 if?true:false 当总记录除总页数余0时 返回结果,不为0返回结果+1
                this.setSumPage(sumRecord%showPage==0?sumRecord/showPage:sumRecord/showPage+1);
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }finally {
            BookManageOper.close(connection,preparedStatement,resultSet);
        }
    }
}

(3)src - jdbc - Entity

Entity进行表与其中字段的定义,这就没必要解释了

(3.1)src - jdbc - Entity - Book[图书][实体类]

package Jdbc.Entity;

public class Book {
    //图书 mysql - BookManage . Book
    //图书编号
    private int id;
    //图书名
    private String name;
    //作者名
    private String author;
    //购入时间
    private String time;
    //图书类型 - Type类 包含id(类型编号)与name(类型名)
    private Type type;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

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

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public Type getType() {
        return type;
    }

    public void setType(Type type) {
        this.type = type;
    }
}

(3.2)src - jdbc - Entity - Type[类型][实体类]

package Jdbc.Entity;

public class Type {
    //图书类型 mysql - BookManage . Type
    //图书类型编号
    private int id;
    //图书类型名
    private String name;
    //无参构造方法
    public Type(){

    }
    //有参构造方法 方便赋值 不用再进行type.setId()...
    public Type(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

(4)src - jdbc - Dao

Dao中包含了方法的定义,需要什么方法就写什么方法

接口中的方法默认使用abstract修饰,不可以有方法体

但可以使用default把abstract覆盖掉

(4.1)src - jdbc - Dao - BookDao[图书][Dao接口]

package Jdbc.Dao;

import Jdbc.Entity.Book;

import java.util.List;

public interface BookDao {
    //获取所有书籍数据 Book - index.jsp/selectServlet -
    List<Book> getAllBook();
    //增加一条数据 Book - insert.jsp/insertServlet -
    boolean insertBook(String name,String author,String time,int type);
    //删除一条数据 Book - index.jsp/deleteServlet -
    boolean deleteBook(int id);
}

(4.2)src - jdbc - Dao - TypeDao[类型][Dao接口]

package Jdbc.Dao;

import Jdbc.Entity.Type;

import java.util.List;

public interface TypeDao {
    //获取所有类型信息 Type - insert.jsp/Servlet -
    List<Type> getAllType();
}

(5)src - jdbc - Impl

Impl通过implements Dao 来实现Dao中的抽象方法

impl一般来说都是默认类 不会是接口或抽象类 因为没有意义

(5.1)src - jdbc - Impl - BookDaoImpl(BookDao)[图书][Dao接口实现类]

package Jdbc.Impl;

import Jdbc.Dao.BookDao;
import Jdbc.Entity.Book;
import Jdbc.Entity.Type;
import Jdbc.Tool.BookManageOper;
import Jdbc.Tool.Page;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class BookDaoImpl implements BookDao {
    //连接数据库与处理sql
    Connection connection=null;
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    @Override
    public List<Book> getAllBook() {//获取所有书籍数据
        //当获取书籍时 首先重新加载一下记录
        Page page=Page.getPage();
        page.loadSumRecord();
        //先创建一个List 之后直接Return List
        List<Book> bookList=new ArrayList<>() ;
        try{
            connection=BookManageOper.create();
            //查询图书表中的x-x行数据 并查询它对应的类型名
            String sql="select b.*,t.* from book b,type t where b.type=t.id limit ?,?";
            preparedStatement=connection.prepareStatement(sql);
            // row * ( page - 1 )     5 * (2-1) = 5 不在前五行
            int Limit1=page.getShowPage()*(page.getThisPage()-1);
            preparedStatement.setInt(1, Limit1);
            preparedStatement.setInt(2, page.getShowPage());
            resultSet=preparedStatement.executeQuery();
            //返回不确定行或多行的查询sql语句 使用while
            while (resultSet.next()){
                 //创建一个book对象 并将数据库中的值赋给这个对象
                 Book book=new Book();
                 book.setId(resultSet.getInt("b.id"));
                 book.setName(resultSet.getString("b.name"));
                 book.setAuthor(resultSet.getString("b.author"));
                 book.setTime(resultSet.getString("b.time"));
                 book.setType(new Type(resultSet.getInt("t.id"),resultSet.getString("t.name")));
                 //将当前对象加入到list中
                 bookList.add(book);
            }
            System.out.println("Impl - BookDaoImpl - getAllBook() ReturnListCount : "+bookList.size());
        }catch (Exception ex){
            ex.printStackTrace();
            System.out.println("Impl - BookDaoImpl - getAllBook() Error");
        }finally {
            BookManageOper.close(connection,preparedStatement,resultSet);
        }
        return bookList;
    }

    @Override
    public boolean insertBook(String name,String author,String time,int type) {//添加一条数据
        boolean Return=false;
        try{
            connection=BookManageOper.create();
            //增加一条数据 因为id为自增 所以会自动赋值
            String sql="insert into book(name,author,time,type) values (?,?,?,?)";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setString(2,author);
            preparedStatement.setString(3,time);
            preparedStatement.setInt(4,type);
            //执行返回影响行数的sql使用Update
            int ReturnInt=preparedStatement.executeUpdate();
            //返回行数大于0则成功
            if(ReturnInt>0)
                Return=true;
            System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i) Return : "+Return);
        }catch (Exception ex){
            ex.printStackTrace();
            System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i)");
        }finally {
            BookManageOper.close(connection,preparedStatement,resultSet);
        }
        return Return;
    }

    @Override
    public boolean deleteBook(int id) {//删除一条数据
        boolean Return=false;
        try{
            connection=BookManageOper.create();
            //根据id删除一条数据 因为id是唯一的
            String sql="delete from book where id=?";
            preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setInt(1,id);
            int ReturnInt=preparedStatement.executeUpdate();
            if(ReturnInt>0)
                Return=true;
            System.out.println("Impl - BookDaoImpl - insertBook(s,s,s,i) Return : "+Return);
        }catch (Exception ex){
            ex.printStackTrace();
            System.out.println("Impl - BookDaoImpl - deleteBook(s) Error");
        }finally {
            BookManageOper.close(connection,preparedStatement,resultSet);
        }
        return Return;
    }
}

(5.2)src - jdbc - Impl - TypeDaoImpl(TypeDao)[类型][Dao接口实现类]

package Jdbc.Impl;

import Jdbc.Dao.TypeDao;
import Jdbc.Entity.Type;
import Jdbc.Tool.BookManageOper;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class TypeDaoImpl implements TypeDao {
    Connection connection=null;
    PreparedStatement preparedStatement=null;
    ResultSet resultSet=null;
    @Override
    public List<Type> getAllType() {//获取所有的图书类型
        List<Type> typeList = new ArrayList<>();
        try{
            connection=BookManageOper.create();
            String sql="select * from type";
            preparedStatement=connection.prepareStatement(sql);
            resultSet=preparedStatement.executeQuery();
            while (resultSet.next()){
                Type type=new Type();
                type.setId(resultSet.getInt("id"));
                type.setName(resultSet.getString("name"));
                typeList.add(type);
            }
            System.out.println("Impl - TypeDaoImpl - getAllType() - ReturnListCount : "+typeList.size());
        }catch (Exception ex){
            ex.printStackTrace();
            System.out.println("Impl - TypeDaoImpl - getAllType() Error");
        }finally {
            BookManageOper.close(connection,preparedStatement,resultSet);
        }
        System.out.println("Impl - TypeDaoImpl - getAllType() 完成");
        System.out.println();
        return typeList;
    }
}
    • web && src - Servlet

(1)web - web_inf

(1.1)web - web_inf - web.xml[Web配置文件]

web.xml是web程序的配置文件,它很重要!!!没有配置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">
    <!--启动时的欢迎页面 修改只需要修改welcome-file-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!--Servlet的映射 Servlet如果不进行映射则不会被外部所访问-->
    <servlet>
        <servlet-name>SelectServlet</servlet-name>
        <servlet-class>Servlet.SelectServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SelectServlet</servlet-name>
        <url-pattern>/SelectServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>InsertServlet</servlet-name>
        <servlet-class>Servlet.InsertServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>InsertServlet</servlet-name>
        <url-pattern>/InsertServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>deleteServlet</servlet-name>
        <servlet-class>Servlet.deleteServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>deleteServlet</servlet-name>
        <url-pattern>/deleteServlet</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>PageServlet</servlet-name>
        <servlet-class>Servlet.PageServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>PageServlet</servlet-name>
        <url-pattern>/PageServlet</url-pattern>
    </servlet-mapping>
</web-app>

(2)web - *.jsp 与其相对应的Servlet

(2.1)web - index页面

(2.1.1)web - index.jsp[首页][Jsp页面]
<%@ page import="java.util.List" %>
<%@ page import="Jdbc.Entity.Book" %>
<%@ page import="Jdbc.Tool.Page" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
  Created by IntelliJ IDEA.
  User: 30974
  Date: 2023/1/9
  Time: 20:33
  To change this template use File | Settings | File Templates.
--%>
<link rel="shortcut icon" href="#">
<html>
    <head>
        <title>个人图书管理</title>
        <%--<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"/>--%>
        <%--<link rel="stylesheet" type="text/css" href="css/bootstrap.css"/>--%>
    </head>
    <body>
    <%
        Page page1=Page.getPage();
        List<Book> bookList=(List<Book>) session.getAttribute("bookList");
        if(bookList==null){
            request.getRequestDispatcher("SelectServlet").forward(request,response);
        }
        //else如果删掉 session一直有值 就不会再次进入获取bookList 会造成页面数据不刷新
        else{
            session.setAttribute("bookList",null);
        }
    %>
        <h1>图书信息</h1>
        <table border="1">
            <tr>
                <td>图书名称</td>
                <td>图书作者</td>
                <td>购买时间</td>
                <td>图书分类</td>
                <td>操作</td>
            </tr>
            <%
                for (Book b : bookList) {
                    out.print(
                            "<tr id=trid"+b.getId()+">" +
                                    "<td>"+b.getName()+"</td>" +
                                    "<td>"+b.getAuthor()+"</td>" +
                                    "<td>"+b.getTime()+"</td>" +
                                    "<td>"+b.getType().getName()+"</td>" +
                                    "<td><span class=delete bookid="+b.getId()+">删除</span></td>" +
                            "</tr>"
                    );
                }
            %>
        </table>
        <p>
            <%--设置toPageType 使pageServlet能够识别进行哪种操作--%>
            <a href="PageServlet?toPageType=First">首页</a>
            <a href="PageServlet?toPageType=Prev">上一页</a>
            <span>
                <%=page1.getThisPage()%>/<%=page1.getSumPage()%>
            </span>
            <a href="PageServlet?toPageType=Next">下一页</a>
            <a href="PageServlet?toPageType=Last">尾页</a>
        </p>
        <a href="Insert.jsp">新增图书信息</a>

        <script src="JS/jquery-1.12.4.js"></script>
        <script src="JS/bootstrap.js"></script>
        <script>
            $(function(){
                setOddBack()
            })

            function setOddBack(){
                $("tr:odd").css("background","gray");
                $("tr:even").css("background","none");
            }

            $(".delete").click(
                function () {
                    var bookid=$(this).attr("bookid");
                    //confirm 根据点击的按钮返回true false
                    var deleteIs=confirm("确定要删除编号"+bookid+"的书籍吗?");
                    //如果点击确定 那么进入deleteServlet
                    if(deleteIs==true){
                        location.href="deleteServlet?bookid="+bookid;
                    }
                }
            )

            <%
                //删除操作进行后根据return值进行弹框
                String delIs=request.getParameter("delIs");
                if (delIs!=null){
                    if(delIs.equals("delTrue")){
                    %>
                        alert("删除成功");
                    <%
                    }else{
                    %>
                    alert("删除失败");
                    <%
                    }
                }
            %>
        </script>
    </body>
</html>
(2.1.2)web - SelectServlet (index.jsp)[查询][Servlet]
package Servlet;

import Jdbc.Dao.BookDao;
import Jdbc.Impl.BookDaoImpl;
import Jdbc.Entity.Book;
import javafx.application.Application;

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;
import java.util.List;

@WebServlet(name = "SelectServlet")
public class SelectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当前doPost()暂无作用
        System.out.println();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当前doGet()用于页面中Session - bookList的初始化
        //创建Jdbc - Impl - BookDaoImpl实例
        BookDao bookDao=new BookDaoImpl();
        //获取book中所有数据
        List<Book> bookList=bookDao.getAllBook();
        //将book表中的数据存入Session - bookList中
        HttpSession session=request.getSession();
        session.setAttribute("bookList",bookList);
        //跳转到jsp页面
        request.getRequestDispatcher("index.jsp").forward(request,response);
        System.out.println();
    }
}
(2.1.3)web - deleteServlet(index.jsp)[删除][Servlet]
package Servlet;

import Jdbc.Dao.BookDao;
import Jdbc.Impl.BookDaoImpl;
import Jdbc.Tool.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.io.PrintWriter;

@WebServlet(name = "deleteServlet")
public class deleteServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String idString=request.getParameter("bookid");
        int id=Integer.parseInt(idString);
        BookDao bookDao=new BookDaoImpl();
        //根据id删除一条数据 返回true成功/false失败
        boolean ReturnIs=bookDao.deleteBook(id);
        //如果成功将index.jsp中的delIs设为delTrue 否则设为delFalse
        if(ReturnIs==true){
            request.getRequestDispatcher("index.jsp?delIs=delTrue").forward(request,response);
        }else{
            request.getRequestDispatcher("index.jsp?delIs=delFalse").forward(request,response);
        }
    }
}
(2.1.4)web - PageServlet(index.jsp)[分页][Servlet]
package Servlet;

import Jdbc.Tool.Page;
import com.mysql.cj.Session;

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;

@WebServlet(name = "PageServlet")
public class PageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String toPageType=request.getParameter("toPageType");
        Page page=Page.getPage();
        //switch判断是什么操作 执行对应的代码
        switch (toPageType){
            case "First":
                page.setThisPage(1);
                break;
            case "Prev":
                page.setThisPage(page.getThisPage()-1);
                break;
            case "Next":
                page.setThisPage(page.getThisPage()+1);
                break;
            case "Last":
                page.setThisPage(page.getSumPage());
                break;
        }

        HttpSession session=request.getSession();
        session.setAttribute("bookList",null);
        //这里不能使用转发 使用转发会出现thisPage多次++的问题
        response.sendRedirect("index.jsp");
    }
}

(2.1)web - insert页面

(2.2)web - insert.jsp[添加][Jsp页面]
<%@ page import="java.util.List" %>
<%@ page import="Jdbc.Entity.Type" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
  Created by IntelliJ IDEA.
  User: 30974
  Date: 2023/1/10
  Time: 11:30
  To change this template use File | Settings | File Templates.
--%>
<html>
<head>
    <title>添加图书</title>
</head>
<body>
<%
    if(session.getAttribute("typeList")==null) {
        request.getRequestDispatcher("InsertServlet").forward(request, response);
    }
    //获取一个本日时间,年-月-日 格式
    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
    String thisDay=simpleDateFormat.format(new Date());
    request.setAttribute("thisDay",thisDay);
%>
    <form method="post" action="InsertServlet">
        <p>
            图书名称
            <input type="text" name="insertName" required>
        </p>
        <p>
            图书作者
            <input type="text" name="insertAuthor" required>
        </p>
        <p>
            //购入时间默认为本日 并且最大为本日
            购入时间
            <input type="date" name="insertTime" value="${thisDay}" max="${thisDay}" min="2000-01-01" required>
         </p>
        <p>
            图书类别
            <select name="insertType" required>
                <c:forEach items="${sessionScope.typeList}" var="t" varStatus="status">
                    <option value="${t.getId()}">${t.getName()}</option>
                </c:forEach>
            </select>
        </p>
        <p>
            <input type="submit" id="insertSub" value="增加图书">
        </p>
    </form>
    <script src="JS/jquery-1.12.4.js"></script>
    <script>
        function goIndex() {
            location.href="index.jsp"
        }
        <%
            String insIs=request.getParameter("insIs");
            if (insIs!=null){
                if(insIs.equals("insTrue")){
                    %>
                    var conIs=confirm("添加成功(确定继续添加,取消返回首页)");
                    if(conIs==false){
                        goIndex();
                    }else{
                        ;
                    }
                    <%
                }else{
                    %>
                    alert("添加失败");
                    <%
                }
            }
        %>
    </script>
</body>
</html>
(2.2.1)web - InsertServlet(Insert.jsp)[添加][Servlet]
package Servlet;

import Jdbc.Dao.BookDao;
import Jdbc.Dao.TypeDao;
import Jdbc.Entity.Type;
import Jdbc.Impl.BookDaoImpl;
import Jdbc.Impl.TypeDaoImpl;
import com.mysql.cj.Session;

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;
import java.util.List;

@WebServlet(name = "InsertServlet")
public class InsertServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当前doPost()方法用于向BookManage - Book表中添加一条数据
        //设置获取的字符编码格式为utf-8
        request.setCharacterEncoding("utf-8");
        //获取所有需要添加的字段
        String name=request.getParameter("insertName");
        String author=request.getParameter("insertAuthor");
        String time=request.getParameter("insertTime");
        String typeString=request.getParameter("insertType");
        int type=Integer.parseInt(typeString);
        //创建Jdbc - Impl - BookDaoImpl实例
        BookDao bookDao=new BookDaoImpl();
        //进行添加 并返回是否添加成功(t/f)
        boolean insertIs=bookDao.insertBook(name,author,time,type);
        //跳转到jsp页面
        if(insertIs==true){
            request.getRequestDispatcher("Insert.jsp?insIs=insTrue").forward(request,response);
        }else{
            request.getRequestDispatcher("Insert.jsp?insIs=insFalse").forward(request,response);
        }
        System.out.println();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //当前doGet()用于页面中Session - typeList的初始化
        //创建Jdbc - Impl - TypeDaoImpl实例
        TypeDao typeDao=new TypeDaoImpl();
        //获取Type表中的所有数据
        List<Type> typeList=typeDao.getAllType();
        //将Type表中的数据添加到Session - typeList中,以便jsp页面进行使用
        HttpSession session=request.getSession();
        if(typeList!=null)
            session.setAttribute("typeList",typeList);
        //跳转到jsp页面
        request.getRequestDispatcher("Insert.jsp").forward(request,response);
        System.out.println();
    }
}

六.结尾

图书管理系统还是能够做为检测自己JavaWeb基础语法与逻辑的一个项目

第一次写文章 逻辑有点乱 不过总算也是写完了

有什么更好的想法欢迎大佬们指正留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue封装Axios实现全局的loading自动显示效果

在 vue 项目中&#xff0c;我们通常会使用 Axios 库来与后台进行数据交互。而当我们发起 ajax 请求时&#xff0c;常常需要在页面上显示一个加载框&#xff08;Loading 效果&#xff09;&#xff0c;然后等数据返回后自动将其隐藏。要实现这个功能&#xff0c;我们可以在每次请…

尚品汇前台项目总结

这是我的第一篇个人博客&#xff0c;主要是对我学习前端过程中的一些主记录。由于我在江苏&#xff0c;从2022年过完年&#xff0c;一直到年中&#xff0c;疫情反反复复&#xff0c;又正是大三&#xff0c;马上面临就业难题&#xff0c;我选择了前端。 从html,css,js基础,webAP…

15个awk的经典实战案例

目录 一、插入几个新字段 二、格式化个空白 三、筛选IPV4地址 命令及结果 第一种查询方式 第二种查询方式 第三种查询方式 四、读取.ini配置文件中的某段 命令及结果 第一种查询方式 第二种查询方式 五、根据某字段去重 命令及结果 第一种方式 第二种方式 六、…

你是这样的 CSS,19个唯美的边框

作者&#xff1a;niemvuilaptrin 译者&#xff1a;前端小智 来源&#xff1a;medium 有梦想&#xff0c;有干货&#xff0c;微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整…

Vue之插槽

1. 插槽是什么 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。简单理解就是子组件中留下个“坑”&#xff0c;父组件可以使…

STM32入门教程课程简介(B站江科大自化协学习记录)

课程简介 STM32最小系统板面包板硬件平台 硬件设备 STM32面包板入门套件 Windows电脑 万用表、示波器、镊子、剪刀等 软件介绍 Keil MDK 5.24.1 是一款嵌入式软件开发工具&#xff0c;它提供了一个完整的开发环境&#xff0c;包括编译器、调试器和仿真器。它支持各种微控制…

微信小程序富文本解析器rich-text、web-view、wxParse、mp-html、towxml对比

微信小程序解析富文本html大概有几种方式&#xff0c;我用过的有这三种rich-text、web-view、wxParse、mp-html&#xff0c;各有各的优缺点&#xff0c;接下来聊一聊。 一、rich-text 二、web-view 三、wxParse 四、mp-html 五、towxml 一、rich-text rich-text富文本组件…

XSS漏洞攻防

目录XSS攻击简介XSS攻击的危害XSS攻击分类XSS产生原因实战靶场搭建构造xss攻击脚本弹窗警告页面嵌套页面重定向弹窗警告并重定向图片标签利用绕开过滤的脚本存储型xss基本演示访问恶意代码&#xff08;网站种马&#xff09;XSS获取键盘记录XSS盲打htmlspecialchars()函数自动xs…

SpringBoot - ZooKeeper

SpringBoot - ZooKeeper1、Curator框架的集成2、构建zookeeper客户端3、Master选举3.1、LeaderSelector3.2、LeaderLatch4、成员组注册5、节点监听1、Curator框架的集成 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-recip…

博客系统前端实现

目录 1.预期效果 2.实现博客列表页 3.实现博客正文页 4.实现博客登录页 5.实现博客编辑页面 1.预期效果 对前端html,css,js有大致的了解后,现在我们实现了一个博客系统的前端页面.一共分为四个页面没分别是:登陆页面,博客列表页,博客正文页,博客编辑页 我们看下四个界面…

功能:vue:浏览器打印小票、打印参数配置

一、需求说明 1、要实现点击打印小票按钮&#xff0c;弹出预览弹框&#xff0c;点击弹框里面的打印&#xff0c;则实现浏览器打印预览&#xff0c;以及浏览器打印。 2、根据对应需求可以做步骤的加减&#xff0c;本例多了一个本地预览。 3、环境&#xff1a;pc端打印、chrome浏…

在 TypeScript 中导入 JavaScript 包,解决声明文件报错问题

前言 如果你在 TypeScript 中引入了一个纯 JavaScript 包&#xff0c;那很有可能会看到这样的报错&#xff1a; Could not find a declaration file for module ‘koumoul/vjsf/lib/VJsf’. ‘c:/*/node_modules/koumoul/vjsf/lib/VJsf.js’ implicitly has an ‘any’ type. …

uniapp拍照+上传后台 + pc端上传后台

uniapp 一、拍照&#xff0c;拿到本地路径 首先调用uniapp的api实现拍照 uni.chooseImage({sourceType: [camera,album],//拍照或是打开系统相册选择照片count: 3, //最多三张success(res) {if (Array.isArray(res.tempFilePaths)) {//最多选择三张&#xff0c;如果多选删掉…

新安webpack插件后编译报错compiler.plugin is not a function

安装使用generate-asset-webpack-plugin时报错TypeError&#xff1a;compiler.plugin is not a function&#xff0c;网上搜索了一下大概就是webpack5与这些插件不匹配。推荐的方法几乎都是换一个适配的插件版本&#xff0c;但我所需要的这个插件在npm上最近更新时间是7年前&am…

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理

Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 目录 Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理 一、简单介绍 二、安装 vue-awesome-swiper 三、引入&#xff08;全局或局部引入&#xff09; 四、简单使用 一、简单介绍 Vue 开发的一些知识整理…

八个步骤实现一个Web项目(在线聊天室)

实现一个在线网页的聊天室 Hello&#xff0c;今天给大家带来的是我的一个Web项目的开发过程的相关步骤&#xff0c;这个项目实现的功能是一个Web在线聊天室&#xff0c;简单的来说就是实现在网页版的聊天框&#xff0c;能够实现对于用户信息进行注册&#xff0c;登录&#xff…

vue3、ts如何封装 axios,使用mock.js

今天我们一起来看一看 vue3ts如何优雅的封装axios&#xff0c;并结合 mock.js 实现敏捷开发&#xff1b; 但是我们要注意区分 Axios 和 Ajax &#xff1a; Ajax 是一种技术统称&#xff0c;技术内容包括&#xff1a;HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要…

Vue首次加载太慢之性能优化

Vue首次加载太慢之性能优化前言一、防止编译文件中出现map文件二、vue-router 路由懒加载三、使用gzip压缩四、使用CDN加载第三方库第一步&#xff1a;引入资源第二步&#xff1a;添加配置第三步&#xff1a;去掉原有的引用五、去掉代码中的console.log前言 首页加载很慢的问题…

Vite4 + Vue3 + vue-router4 动态路由

动态路由&#xff0c;基本上每一个项目都能接触到这个东西&#xff0c;通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理&#xff0c;其实内部就是对router的一个数据处理。当然你只对菜单做处理也是可以的&#xff0c;但是没有任…

js中的内存泄漏

简版 内存泄漏一般是指变量的内存没有及时的回收&#xff0c;导致内存资源浪费。一般有三种情况出现内存泄露比较多。&#xff08;1&#xff09;常见的声明了一个全局变量&#xff0c;但是又没有用上&#xff0c;那么就有点浪费内存了&#xff0c;&#xff08;2&#xff09;定…