天天看點

layui實作增删改查——圖書管理

(一)頁面展示

頁面的效果如圖:

layui實作增删改查——圖書管理

這裡就不進行頁面的功能示範,下面将詳細的介紹下頁面。

(二)功能描述

頁面主要實作了有以下功能:

(1)查詢所有

即将資料庫中資料表的資訊查詢出來,顯示在頁面中。

(2)添加書籍

點選頁面的添加按鈕,彈出層出現添加書籍的表單

(3)修改書籍

點選修改按鈕,彈出層出現修改書籍的表單

(4)删除書籍

點選删除按鈕,删除書籍

(5)書籍的上下架

(6)模糊搜尋

(三)功能實作的流程

(一)查找所有書籍資訊:

① 現在book.jsp将layui的table表格屬性加載上,使用table.render({}),在table.render

中進行設定:elem屬性,設定表格id,url:設定跳轉路徑

layui實作增删改查——圖書管理
layui實作增删改查——圖書管理

② 通過url的路徑跳轉到相應的BookController中,通過路徑找到對應的查詢所有書籍的方法。

layui實作增删改查——圖書管理

③ 在查找所有書籍的方法getAllBook中,

* ①設定編碼

* ②擷取map對象資料,通過BeanUtils.populate()進行存儲

* ③調用實作類中的getAllBook()方法,擷取所有書籍資訊

* ④調用實作類中getAllTypeCount()方法得到所有書籍的數量

* ⑤将上面拿到的書籍資訊和書籍數量通過LayTab工具類轉換成Layui需要的資料格式

* ⑥在轉化成Json格式,傳回前端jsp頁面。

layui實作增删改查——圖書管理

④ 因為在Conntroller層中的BookController中需要調用實作類中的getAllBook方法,是以需要寫getAllBook方法。

首先需要在BookDao中寫getAllBook方法,然後在BookDaoImpl中具體實作。

實作類的具體流程:

* ①寫sql語句

* ②調用工具類中的List

* ③得到需要的值,并傳回

(二)模糊搜尋及下拉搜尋的實作

①前端頁面的書寫

layui實作增删改查——圖書管理

②前端綁定搜尋:

layui實作增删改查——圖書管理

③綁定下拉框:使用ajax進行綁定,讓頁面加載後立即填充下拉框

layui實作增删改查——圖書管理

⑤ 下拉框的實作,需要将書籍類型與書籍類型的id進行操作,每個typeid對應一個tyepname,是以需要在建一個TypeDao和TypeDaoImpl實作類來進行操作,在實作類種要查找到所有的Typeid和Typename;

layui實作增删改查——圖書管理
layui實作增删改查——圖書管理

以及對應的typeController來将其擷取到的值傳到前端jsp頁面。

layui實作增删改查——圖書管理

(三)添加和修改的實作:

添加書籍資訊:

① 給添加按鈕綁定(通過按鈕的id)點選事件,點添加後,彈出一個表單,

layui實作增删改查——圖書管理

② 也需要給表單綁定,在點選送出後,跳轉到BookController中,找到對應的方法。方法中主要是對前台資料的擷取。

layui實作增删改查——圖書管理

③ 調用dao層的實作類來進行具體的資料操作

④ 在dao層會有添加sql語句的實作

layui實作增删改查——圖書管理

⑤ Dao層的資料在傳回給Controller,controller将資料在傳回給前台頁面,

⑥ 前台的頁面主要是用ajax來發送和接收的。

修改書籍資訊,跟添加資訊是一樣的

① 添加修改按鈕,點選打開彈出框,内容跟新增的彈出框一樣,添加一個輸入框id。

② 點選表單送出按鈕—》背景!

③ 将參數傳遞到背景controller

④ controller接收參數使用實體對象接參

layui實作增删改查——圖書管理

⑤ 調用dao做資料操作

layui實作增删改查——圖書管理

根據book對象中有沒有bookid判斷進行的是新增還是修改

如果bookid>0就是修改,否則,新增,最後傳回result的提示

layui實作增删改查——圖書管理

(四)删除書籍資訊的實作

①先綁定按鈕

layui實作增删改查——圖書管理

通過ajax來進行資料的發送來接收背景發過來的資料。

layui實作增删改查——圖書管理

②請求發送到背景後,在controller層接收資料,即前台傳來的id,并調用到層的方法最後經資料傳回。

layui實作增删改查——圖書管理

③dao層實作sql

layui實作增删改查——圖書管理

(五)上下架狀态

首先要對狀态這個字段資訊設定,讓資料庫裡的的0和1,對應相應的下架和上架。設定這個templt屬性,

layui實作增删改查——圖書管理
layui實作增删改查——圖書管理

然後在判斷,顯示上架狀态就,在後面就操作就顯示下架。下架狀态就顯示上架。

layui實作增删改查——圖書管理

同樣,利用ajax來進行資料的發送和接收。

layui實作增删改查——圖書管理

資料發送到controller層

layui實作增删改查——圖書管理

在調用dao層的方法

layui實作增删改查——圖書管理

(四)項目建立

首先是項目的建立:使用的是IDEA建立的web項目,資料庫利用的mysql資料庫。

項目的目錄結構如下:

layui實作增删改查——圖書管理

(1)主要分為以下幾個包:

  • utils層,(存放工具類)主要建立了三個工具類:DButil類、LayTab類、Result類。
  • dao層,用來存在項目中實作的方法,在此包下還有一個impl,來實作到中的方法。
  • entity層,存放實體類。
  • controller層,用來做控制層,實作前端與後端的資料互動。

    (2)web中主要放的有layui用到的css和js檔案以及連個jsp頁面。

    (3)大概的流程

    從前端頁面送出請求,到背景的controller層進行接收,在controller層會去調用bookDaoImpl接口中的實作方法,來進行功能的實作,在完成相應的功能之後在将資料傳回到前台頁面。

具體功能的實作

頁面主要是對所有的資訊進行查詢,并将其顯示出來。很顯然頁面在點選書籍資訊時,會将資料庫的所有資料資訊進行顯示。利用layui的資料表格來講資料顯示在前端的頁面上。

首先你需要去layui的官網上将你需要的資料表格頁面給複制到你自己的jsp頁面上。主要對核心代碼進行說明:

`<table class="layui-hide" id="test" lay-filter="test"></table>`
           

這是layui的表格,在js中對對資料進行綁定,在代碼中會有各屬性的介紹。

table.render({
            id:'table1',//此處名字友善後面的表格重載
            elem: '#test'//此處的名字與table中的id一緻
            ,url:'${pageContext.request.contextPath}/book/getAllBook'
            //此處是發送到背景controller的位址
            ,toolbar: '#toolbarDemo' //開啟頭部工具欄,并為其綁定左側模闆
            ,title: '圖書表'
            // 注意此處的field屬性應與資料庫中字段名保持一緻,title屬性是在表格中顯示的名字          
             ,cols: [[
                {type: 'checkbox', fixed: 'left'}
                ,{field:'bookid', title:'圖書編号', fixed: 'left', unresize: true, sort: true}
                ,{field:'bookname', title:'圖書名稱'}
                ,{field:'author', title:'作者'}
                ,{field:'count', title:'數量'}
                ,{field:'remark', title:'描述'}
                ,{field:'typeid', title:'類型id',hide:true}
                ,{field:'publisher', title:'出版社'}
                ,{field:'price', title:'價格'}
                ,{field:'status', title:'圖書狀态', templet:'#titleTpl'}
                ,{field:'typename', title:'圖書類型'}
                ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:200}
            ]]
            ,page: true,//此處是開啟分頁
            limit:10,//每頁顯示具體的條數
            limits:[5,10,15,20]
        });
           

前台實作的代碼就是上面,具體的前端頁面就不在介紹,都是在layui沾過來的,根據自己的需要進行修改

(五)具體代碼的實作:

項目需要用到幾個jar包:

jar包下載下傳:https://download.csdn.net/download/weixin_42381196/19734223

下面說一下在背景的代碼實作。

首先要建立utils,在裡面存放用到的工具類。

首先是DBUti類在這裡封裝了資料庫的連接配接類,以及一些通用的增删改的方法。

配置檔案:db.properties

#驅動加載
driverClassName=com.mysql.jdbc.Driver
#注冊驅動
url=jdbc:mysql://localhost/fuxi?characterEncoding=utf-8&useSSL=false
#連接配接資料庫的使用者名
username=root
#連接配接資料庫的密碼
password=password
#屬性類型的字元串,通過别名的方式配置擴充插件, 監控統計用的stat 日志用log4j 防禦sql注入:wall
filters=stat
#初始化時池中建立的實體連接配接個數。
initialSize=5
#最大的可活躍的連接配接池數量
maxActive=300
#擷取連接配接時最大等待時間,機關毫秒,超過連接配接就會失效。配置了maxWait之後,預設啟用公平鎖,并發效率會有所下降, 如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
maxWait=60000
#連接配接回收器的運作周期時間,時間到了清理池中空閑的連接配接,testWhileIdle根據這個判斷
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000

#建議配置為true,不影響性能,并且保證安全性。 申請連接配接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis, 執行validationQuery檢測連接配接是否有效。
testWhileIdle=true
#申請連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能。設定為false
testOnBorrow=false
#歸還連接配接時執行validationQuery檢測連接配接是否有效,做了這個配置會降低性能,設定為flase
testOnReturn=false
#是否緩存preparedStatement,也就是PSCache。
poolPreparedStatements=false
#池中能夠緩沖的preparedStatements語句數量
maxPoolPreparedStatementPerConnectionSize=200
           

DBUtil類:

package com.qy137.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

/**
 * 資料庫的連接配接類
 */
public class DBUtil {
    private  static DataSource dataSource;
    static {
        try {
            InputStream asStream = DBUtil.class.getResourceAsStream("/db.properties");
            Properties p = new Properties();
            p.load(asStream);
            dataSource = DruidDataSourceFactory.createDataSource(p);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 建立資料庫的連接配接
     * @return
     */
    public static Connection getConn(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 實作修改的方法,在實作增删改的時候調用
     * @param sql
     * @param objects
     * @return
     */
    public static int update(String sql, Object... objects){
        Connection conn = getConn();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            setParamter(ps,objects);
            return ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(conn,ps,null);
        }
        return -1;
    }

    /**
     * 實作設定參數的方法
     * @param ps
     * @param objects
     */

    public static void setParamter(PreparedStatement ps,Object... objects){
        try {
            if(objects.length > 0){
                for (int i = 0; i < objects.length; i++) {
                    ps.setObject(i+1,objects[i]);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 實作查詢所有的方法,List<List>
     * @param sql
     * @param objects
     * @return
     */
    public static List<List> queryList(String sql, Object... objects){
        Connection conn = getConn();
        PreparedStatement ps=null;
        ResultSet resultSet = null;
        try {
            ps = conn.prepareStatement(sql);
            setParamter(ps,objects);
            resultSet = ps.executeQuery();
            ArrayList<List> bigList = new ArrayList<>();
            while (resultSet.next()){
                ArrayList<Object> smList = new ArrayList<>();
                for (int i = 1; i <= resultSet.getMetaData().getColumnCount() ; i++) {
                    smList.add(resultSet.getObject(i));
                }
                bigList.add(smList);
            }
            return bigList;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(conn,ps,resultSet);
        }
        return null;
    }

    /**
     * 實作查詢所有的方法List<Map>
     * @param sql
     * @param objects
     * @return
     */
    public static List<Map> queryListMap(String sql, Object... objects){
        Connection conn = getConn();
        PreparedStatement ps = null;
        ResultSet set = null;
        try {
            ps = conn.prepareStatement(sql);
            setParamter(ps,objects);
            set = ps.executeQuery();
            ArrayList<Map> bigList = new ArrayList<>();
            while (set.next()){
                HashMap<Object, Object> map = new HashMap<>();
                for (int i = 1; i <= set.getMetaData().getColumnCount(); i++) {
                    map.put(set.getMetaData().getColumnName(i),set.getObject(i));
                }
                bigList.add(map);
            }
            return bigList;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(conn,ps,set);
        }
        return null;
    }

    /**
     * 關閉連接配接
     * @param conn
     * @param ps
     * @param set
     */
    public static void closeAll(Connection conn,PreparedStatement ps,ResultSet set){
        try {
            if(set!=null){
                set.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        try {
            if(ps!=null){
                ps.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        try {
            if(conn!=null){
                conn.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
           

LayTab類:主要是對資料進行轉換成layui需要的資料形式

package com.qy137.utils;

import lombok.Data;

import java.util.List;
@Data
public class LayTab {
    private Integer code=0;
    private String msg="";
    private Integer count;
    private List<?> data;

    public LayTab(Integer count, List<?> data) {
        this.count = count;
        this.data = data;
    }
}
           

Result類:主要是傳回結果的工具類

package com.qy137.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 這是一個工具類
 * 用來實作操作成功後的提示資訊
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result implements Serializable {
    private Integer code;
    private String msg;
    private Object data;

    public static Result success(){
        return new Result(1,"操作成功",null);
    }
    public static Result success(Object data,String msg){
        return new Result(1,msg,data);
    }
    public static Result fail(){
        return new Result(2,"操作失敗",null);
    }
    public static Result fail(String msg){
        return new Result(2,msg,null);
    }

}
           

entity包,在這裡放的是實體類,即Book類

package com.qy137.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book implements Serializable {
    private Integer bookid;
    private String bookname;
    private String author;
    private Integer count;
    private String remark;
    private String publisher;
    private String price;
    private String status;
    private Integer typeid;
    private String typename;

    private Integer page;
    private Integer limit;
}
           

dao層:

BookDao:

package com.qy137.dao;

import com.qy137.entity.Book;

import java.util.List;
import java.util.Map;

public interface BookDao  {
    //查詢所有書籍
  //  List<Map> getAllBook();
    List<Book> getAllBook(Book book);
    //修改上架狀态
    int updateStatus(Integer bookid,Integer status);
    //删除書籍資訊
    int delBook(Integer bookid);
    //查詢分頁搜尋符合條件的總條數
    int getAllBookCount(Book book);
    //添加書籍資訊
    int addBook(Book book);
    //根據id修改圖書資訊
    int updateIdBook(Book book);
}
           

BookDaoImpl:

package com.qy137.dao.impl;

import com.qy137.dao.BookDao;
import com.qy137.entity.Book;
import com.qy137.utils.DBUtil;
import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@SuppressWarnings("all")
public class BookDaoImpl implements BookDao {
   /* @Override
    public List<Map> getAllBook() {
       // String sql="select tb.bookid,tb.bookname,tb.author,tb.count,tb.remark,tb.pulisher,tb.price,tb.status,tp.typeid,tp.typename from t_book tb  inner join t_type tp on tb.typeid=tp.typeid ";
       String sql="select tb.*,tp.typename from t_book tb  inner join t_type tp on tb.typeid=tp.typeid";
        List<Map> map = DBUtil.queryListMap(sql);
        if (map.size()>0){
            return map;
        }
        return null;
    }*/

    /**
     * 查詢所有書籍資訊
     * 此方法結合了搜尋、下拉搜搜和分頁查詢
     * ①定義sql,首先查出所有的資訊
     * ②當在搜尋欄輸入查詢内容時,或使用下拉框是,對sql語句進行拼接
     * ③調用方法,查詢所有
     *
     * @param book
     * @return
     */
    @Override
    public List<Book> getAllBook(Book book) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT tb.*,tt.typename from t_book tb INNER JOIN t_type tt on tb.typeid = tt.typeid ");
        if (book.getBookname()!=null && !"".equals(book.getBookname())){
            sql.append(" and tb.bookname like '%"+book.getBookname()+"%' ");
        }
        if (book.getAuthor()!=null && !"".equals(book.getAuthor())){
            sql.append(" and tb.author like '%"+book.getAuthor()+"%' ");
        }
        if (book.getTypeid()!=null && book.getTypeid()>0){
            sql.append(" and tb.typeid=" +book.getTypeid());
        }
        //直接進行分頁
        sql.append(" limit "+(book.getPage()-1)*book.getLimit()+","+book.getLimit());
      //  System.out.println(sql);
        /*
        将定義的StringBuilder類型的sql,裝換成字元串類型
        對map進行周遊,得到每一條資料,在放入到books集合清單中
         */
        List<Map> map = DBUtil.queryListMap(sql.toString());
        ArrayList<Book> books = new ArrayList<>();
        if (map.size()>0){
            for (int i = 0; i <map.size() ; i++) {
                Map map1 = map.get(i);
                Book book1 = new Book();
                try {
                    BeanUtils.populate(book1,map1);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
                books.add(book1);

            }
            return books;
        }
        return null;
    }

    /**
     * 查詢所有的書籍數量,用來實作分頁的功能
     * ①寫sql語句,得到各種條件下查詢的書籍數量
     * @param book
     * @return
     */
    @Override
    public int getAllBookCount(Book book) {
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT count(*) from t_book tb INNER JOIN t_type tt on tb.typeid = tt.typeid ");
        if (book.getBookname()!=null && !"".equals(book.getBookname())){
            sql.append(" and tb.bookname like '%"+book.getBookname()+"%' ");
        }
        if (book.getAuthor()!=null && !"".equals(book.getAuthor())){
            sql.append(" and tb.author like '%"+book.getAuthor()+"%' ");
        }
        if (book.getTypeid()!=null && book.getTypeid()>0){
            sql.append(" and tb.typeid=" +book.getTypeid());
        }
        List<List> lists = DBUtil.queryList(sql.toString());
        if (lists.size()>0){
            Object o = lists.get(0).get(0);
            return Integer.parseInt(o+"");
        }
        return 0;

    }

    /**
     * 根據bookid來修改書籍的上下架狀态
     * 此時需要有bookid和status連個參數
     * @param bookid
     * @param status
     * @return
     */
    @Override
    public int updateStatus(Integer bookid, Integer status) {
        String sql="update t_book set status=? where bookid=?";
        int i=0;
        if (status==0){
            i=DBUtil.update(sql,1,bookid);
        }else {
            i=DBUtil.update(sql,0,bookid);
        }
        return i;
    }

    /**
     * 根據bookid來删除書籍資訊
     * @param bookid
     * @return
     */
    @Override
    public int delBook(Integer bookid) {
        String sql="delete from t_book where bookid=?";
        return DBUtil.update(sql, bookid);
    }



    /**
     * 添加書籍資訊
     * @param book
     * @return
     */
    @Override
    public int addBook(Book book) {
        String sql="insert into t_book values(null,?,?,?,?,?,?,?,?)";
        int i = DBUtil.update(sql, book.getBookname(), book.getAuthor(), book.getCount(), book.getRemark(), book.getTypeid(), book.getPublisher(), book.getPrice(), book.getStatus());
        return i;
    }

    @Override
    public int updateIdBook(Book book) {
        String sql="update t_book set bookname=?,author=?,remark=?,typeid=?,publisher=?,price=?,status=? where bookid=?";
        int i = DBUtil.update(sql, book.getBookname(), book.getAuthor(), book.getRemark(), book.getTypeid(), book.getPublisher(), book.getPrice(), book.getStatus(), book.getBookid());
        return i;
    }
}
           

TypeDao類:

package com.qy137.dao;
import java.util.List;
import java.util.Map;

public interface TypeDao {
    List<Map> getAllType();

}
           

TypeDaoImpl類:

package com.qy137.dao.impl;

import com.qy137.dao.TypeDao;
import com.qy137.utils.DBUtil;

import java.util.List;
import java.util.Map;

public class TypeDaoImpl implements TypeDao {
    @Override
    public List<Map> getAllType() {
        String sql="select * from t_type";
        List<Map> map = DBUtil.queryListMap(sql);
        if (map.size()>0){
            return map;
        }
        return null;
    }
}
           

controller:

BookControllerL類:

package com.qy137.controller;
import com.alibaba.fastjson.JSON;
import com.qy137.dao.BookDao;
import com.qy137.dao.impl.BookDaoImpl;
import com.qy137.entity.Book;
import com.qy137.utils.DBUtil;
import com.qy137.utils.LayTab;
import com.qy137.utils.Result;
import org.apache.commons.beanutils.BeanUtils;

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.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

@WebServlet("/book/*")
@SuppressWarnings("all")
public class BookController extends HttpServlet {
    private BookDao bookDao=new BookDaoImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();
        int i = uri.lastIndexOf("/");
        String s = uri.substring(i + 1);
        //前台對傳過來的資料進行判斷,分别跳轉到不同的方法
        switch (s){
            case "getAllBook":
                getAllBook(req,resp);
                break;
            case "updateStatus":
                updateStatus(req,resp);
                break;
            case "delBook":
                delBook(req,resp);
                break;
            case "addOrUpdateBook":
                addOrUpdateBook(req,resp);
                break;
        }
    }
    //舊的擷取所有書籍資訊
    /*protected void getAllBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        List<Map> allBook = bookDao.getAllBook();
        LayTab layTab = new LayTab(allBook.size(),allBook);
        String s = JSON.toJSONString(layTab);
        PrintWriter writer = resp.getWriter();
        writer.write(s);
    }*/
     /**
     * 查詢所有的書籍信新
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void getAllBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        Map<String, String[]> parameterMap = req.getParameterMap();
        Book book = new Book();
        try {
            BeanUtils.populate(book,parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        List<Book> allBook = bookDao.getAllBook(book);

       // LayTab layTab = new LayTab(allBook.size(),allBook);
        int count = bookDao.getAllBookCount(book);
        LayTab layTab = new LayTab(count,allBook);
        String s = JSON.toJSONString(layTab);
        resp.getWriter().write(s);
    }
     /**
     * 修改圖書的上下架狀态
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void updateStatus(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        String bookid = req.getParameter("bookid");
        String status = req.getParameter("status");
        int i = bookDao.updateStatus(Integer.parseInt(bookid), Integer.parseInt(status));
        PrintWriter writer = resp.getWriter();
        Result result =null;
        if (i>0){
            result=Result.success(null,"上架/下架成功!");
        }else {
            result=result.fail();
        }
        //将result轉化為json格式
        String s = JSON.toJSONString(result);
        writer.write(s);


        //使用工具類前
       /* if (i>0){
            writer.write("上架/下架成功!");
        }else {
            writer.write("上架/下架失敗!");
        }*/

    }
     /**
     * 根據id删除書籍資訊
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void delBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        String bookid = req.getParameter("bookid");
        int i = bookDao.delBook(Integer.parseInt(bookid));
        if (i>0){
            resp.getWriter().write("删除成功");
        }else {
            resp.getWriter().write("删除成功");
        }

    }
 /**
     * 添加和修改圖書資訊
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void addOrUpdateBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=UTF-8");
        Map<String, String[]> map = req.getParameterMap();
        Book book = new Book();
        try {
            BeanUtils.populate(book,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        int i=0;
        if (book.getBookid()>0){
            i=bookDao.updateIdBook(book);
        }else {
            i = bookDao.addBook(book);
        }
        Result result;
        if (i>0){
            result = Result.success();
        }else {
           result = Result.fail();
        }
        String s = JSON.toJSONString(result);
        resp.getWriter().write(s);


    }

}
           

TypeController:

package com.qy137.controller;

import com.alibaba.fastjson.JSON;
import com.qy137.dao.TypeDao;
import com.qy137.dao.impl.TypeDaoImpl;

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

@WebServlet("/type/*")
public class TypeController extends HttpServlet {
    private TypeDao typeDao =new TypeDaoImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uri = req.getRequestURI();
        System.out.println(uri);
        int i = uri.lastIndexOf("/")+1;
        String s = uri.substring(i);
        switch (s){
            case "getAllType":
                getAllType(req,resp);
                break;
    }}

    /**
     * 查詢所有的書籍類型資訊
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
        protected void getAllType(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=UTF-8");
            List<Map> types = typeDao.getAllType();
            String s = JSON.toJSONString(types);
            resp.getWriter().write(s);
        }
}
           

book.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <link rel="stylesheet" href="${pageContext.request.contextPath}/layui/css/layui.css">
</head>
<form style="display: none" id="bookForm" lay-filter="bookForm"class="layui-form" >

    <input type="text" name="bookid" id="bookid" style="display: none"/>
    <div class="layui-form-item">
        <label class="layui-form-label">圖書名稱</label>
        <div class="layui-input-inline">
            <input type="text" id="bookname" name="bookname" placeholder="請輸入圖書名字" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">作者</label>
        <div class="layui-input-inline">
            <input type="text" id="author" name="author" placeholder="請輸入作者" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item layui-form-text">
        <label class="layui-form-label">描述</label>
        <div class="layui-input-inline">
            <input type="text" id="remark" name="remark" placeholder="請輸入資訊" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">出版社</label>
        <div class="layui-input-inline">
            <input type="text" id="publisher" name="publisher" placeholder="請輸入出版社" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">價格</label>
        <div class="layui-input-inline">
            <input type="text" id="price" name="price" placeholder="請輸入價格" class="layui-input">
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">上下架</label>
        <div class="layui-input-inline">
            <select name="status" >
                <option value="">--上下架狀态--</option>
                <option value="0">上架</option>
                <option value="1">下架</option>
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">書籍類型</label>
        <div class="layui-input-inline">
            <select name="typeid" id="typeIdSelect" >
                <option value="">--書籍類型--</option>
            </select>
        </div>
    </div>
    <div class="layui-form-item">
        <div class="layui-input-block">
            <button class="layui-btn" lay-submit lay-filter="*">立即送出</button>
            <button type="reset" class="layui-btn layui-btn-primary">重置</button>
        </div>
    </div>
</form>
<body>

<div class="demoTable layui-form">
    <div class="layui-inline">
        <input class="layui-input" name="bookname" id="bk" autocomplete="off" placeholder="搜尋書名">
    </div>
    <div class="layui-inline">
        <input class="layui-input" name="author" id="au" autocomplete="off" placeholder="搜尋作者">
    </div>

    <div class="layui-inline" >
        <select name="typeid" id="typeSelect" lay-filter="aihao">
            <option value=""></option>
        </select>
    </div>
    <button class="layui-btn" data-type="reload" id="reloadTabBtn">搜尋</button>

</div>
<table class="layui-hide" id="test" lay-filter="test"></table>

<script type="text/html" id="toolbarDemo">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" lay-event="getCheckData">擷取選中行資料</button>
        <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">擷取選中數目</button>
        <button class="layui-btn layui-btn-sm" lay-event="isAll">驗證是否全選</button>
        <button class="layui-btn layui-btn-sm" lay-event="addBtn">新增</button>
    </div>
</script>

<script type="text/html" id="barDemo">
    <a class="layui-btn layui-btn-xs" lay-event="edit">編輯</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
    {{#  if(d.status == 0){ }}
    <button class="layui-btn layui-btn-sm" lay-event="updateStatus">上架</button>
    {{#  } else { }}
    <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="updateStatus">下架</button>
    {{#  } }}
</script>

<script type="text/html" id="titleTpl">
    {{#  if(d.status == 0){ }}
    <button class="layui-btn layui-btn-sm layui-btn-danger"  >下架狀态</button>
    {{#  } else { }}
    <button class="layui-btn layui-btn-sm" >上架狀态</button>
    {{#  } }}
</script>
<script src="${pageContext.request.contextPath}/layui/layui.js"></script>

<script>
    layui.use(['jquery','form','layer','table'], function(){
        var $ =layui.jquery;
        var form =layui.form;
        var layer =layui.layer;
        var table=layui.table;
        //綁定搜尋事件,更新表格
        $("#reloadTabBtn").click(function () {
            console.log($("#bk").val())
            table.reload('table1',{
                where:{
                    bookname:$("#bk").val(),
                    author:$("#au").val(),
                    typeid:$("#typeSelect").val()
                },
                page: {
                    curr:1//重新從第一頁開始
                }

            });
        })

        //頁面加載完成就立即填充書籍類型的下拉框中
       $.ajax({
            type:'get',
            url:"${pageContext.request.contextPath}/type/getAllType",
            dataType:'json',//預設接收到的類型為json
            success:function (types) {
              // console.log(types);
                //查出類型資訊後,将類型資訊填充到下拉框中
                $.each(types,function (i,obj) {
                   // console.log(obj.typeid+"=="+obj.typename)
                    /*
                    dom操作,給下拉框添加option
                    并給option添加值
                     */
                    $("#typeSelect").append(
                        $("<option></option>").attr("value",obj.typeid).text(obj.typename)
                    )

                    $("#typeIdSelect").append(
                        $("<option></option>").attr("value",obj.typeid).text(obj.typename)
                    )
                })
               // 渲染下拉框
                form.render('select');
            }

        })

        table.render({
            id:'table1',
            elem: '#test'
            ,url:'${pageContext.request.contextPath}/book/getAllBook'
            ,toolbar: '#toolbarDemo' //開啟頭部工具欄,并為其綁定左側模闆
            ,title: '圖書表'
            ,cols: [[
                {type: 'checkbox', fixed: 'left'}
                ,{field:'bookid', title:'圖書編号', fixed: 'left', unresize: true, sort: true}
                ,{field:'bookname', title:'圖書名稱'}
                ,{field:'author', title:'作者'}
                ,{field:'count', title:'數量'}
                ,{field:'remark', title:'描述'}
                ,{field:'typeid', title:'類型id',hide:true}
                ,{field:'publisher', title:'出版社'}
                ,{field:'price', title:'價格'}
                ,{field:'status', title:'圖書狀态', templet:'#titleTpl'}
                ,{field:'typename', title:'圖書類型'}
                ,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:200}
            ]]
            ,page: true,
            limit:10,
            limits:[5,10,15,20]
        });

        //頭工具欄事件
        //此處的test是上面table中的lay-filter中的值
        table.on('toolbar(test)', function(obj){
            var checkStatus = table.checkStatus(obj.config.id);
            switch(obj.event){
                case 'getCheckData':
                    var data = checkStatus.data;
                    layer.alert(JSON.stringify(data));
                    break;
                case 'getCheckLength':
                    var data = checkStatus.data;
                    layer.msg('選中了:'+ data.length + ' 個');
                    break;
                case 'isAll':
                    layer.msg(checkStatus.isAll ? '全選': '未全選');
                    break;
                //自定義頭工具欄右側圖示 - 提示
                case 'LAYTABLE_TIPS':
                    layer.alert('這是工具欄右側自定義的一個圖示按鈕');
                    break;
                case 'addBtn':
                    //打開彈出框之前先清空表單
                    $("#bookForm")[0].reset();
                    layer.open({
                        type: 1,//頁面層
                        title:'新增圖書資訊',
                        area: ['400px', '500px'],
                        offset:'100px',
                        content: $("#bookForm")
                    });
                    break;
            };
        });
        form.on('submit(*)', function(data){
            console.log(data.field) //目前容器的全部表單字段,名值對形式:{name: value}
            $.ajax({
                type:'post',
                url:'${pageContext.request.contextPath}/book/addOrUpdateBook',
                data:data.field,
                dataType:'json',
                success: function (result) {
                    layer.closeAll();
                    if (result.code==1){
                        layer.msg(result.msg,{icon:1});
                        table.reload("table1")
                    }else {
                        layer.msg(result.msg,{icon:5});
                    }
                }
            })
            return false; //阻止表單跳轉。如果需要表單跳轉,去掉這段即可。
        });

        //監聽行工具事件
        table.on('tool(test)', function(obj){
            var data = obj.data;
            //console.log(obj)
            if(obj.event === 'del'){
                layer.confirm('真的删除行麼', function(index){
                    $.ajax({
                        type:'get',
                        url:'${pageContext.request.contextPath}/book/delBook',
                        data:{"bookid": data.bookid},
                        success:function (msg) {
                            layer.msg(msg);
                            obj.del();
                            layer.close(index);
                        }
                    })

                });
            } else if(obj.event === 'edit'){
                //打開彈出框之前先清空表單
                $("#bookForm")[0].reset();
                layer.open({
                    type: 1,//頁面層
                    title:'修改圖書資訊',
                    area: ['400px', '550px'],
                    offset:'100px',
                    content: $("#bookForm")
                })
                //将目前點選行的資料填充到表單中去
                form.val('bookForm', data);
            }else if (obj.event==='updateStatus'){
                layer.confirm('确定要上架/下架嗎?',function (index) {
                    $.ajax({
                        type:'get',
                        url:'${pageContext.request.contextPath}/book/updateStatus',
                        data:{"bookid": data.bookid,"status":data.status},
                        dataType: 'json',//預期的伺服器傳回的資料類型
                        success:function (result) {//result是前面傳回過來的
                            if (result.code==1){
                                layer.msg(result.msg);
                                //成功後重新整理表格
                                table.reload("table1");
                            }else {
                                layer.msg(result.msg);
                            }
                        }
                    })
                    layer.close(index);
                });

            }
        });
    });
</script>
</body>
</html>
           

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: ttt
  Date: 2021/6/17
  Time: 19:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>圖書管理系統</title>
  <link rel="stylesheet" href="${pageContext.request.contextPath}/layui/css/layui.css">
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
  <div class="layui-header">
    <div class="layui-logo">圖書管理系統</div>

    <ul class="layui-nav layui-layout-right">
      <li class="layui-nav-item">
        <a href="javascript:;">
          <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
          root
        </a>
        <dl class="layui-nav-child">
          <dd><a href="">基本資料</a></dd>
          <dd><a href="">安全設定</a></dd>
        </dl>
      </li>
      <li class="layui-nav-item"><a href="">退了</a></li>
    </ul>
  </div>

  <div class="layui-side layui-bg-black">
    <div class="layui-side-scroll">
      <!-- 左側導航區域(可配合layui已有的垂直導航) -->
      <ul class="layui-nav layui-nav-tree"  lay-filter="test">
        <li class="layui-nav-item layui-nav-itemed">
          <a class="" href="javascript:;">書籍管理</a>
          <dl class="layui-nav-child">
            <dd>
              <a href="${pageContext.request.contextPath}/book.jsp" target="main">書籍資訊</a>
            </dd>
          </dl>
        </li>
      </ul>
    </div>
  </div>

  <div class="layui-body">

    <iframe frameborder="0" border="0" height="100%" width="100%" name="main"></iframe>
  </div>

  <div class="layui-footer">
    <!-- 底部固定區域 -->
    © layui.com - 底部固定區域
  </div>
</div>
<script src="${pageContext.request.contextPath}/layui/layui.js"></script>
<script>
  //JavaScript代碼區域
  layui.use('element', function(){
    var $ = layui.jquery,
            element = layui.element;

  });

</script>
  </body>
</html>