成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

圖書管理系統(tǒng)【JavaWeb:部署開發(fā)環(huán)境、解決分類、圖書、前臺頁面模塊】

djfml / 3235人閱讀

摘要:前言鞏固開發(fā)模式,做一個比較完整的小項目成果圖該項目包含了兩個部分,前臺和后臺。前臺用于顯示后臺用于管理該項目可分為個模塊來組成分類模塊,用戶模塊,圖書模塊,購買模塊,訂單模塊。

前言

鞏固Servlet+JSP開發(fā)模式,做一個比較完整的小項目.

成果圖

該項目包含了兩個部分,前臺和后臺。

前臺用于顯示

后臺用于管理

該項目可分為5個模塊來組成:分類模塊,用戶模塊,圖書模塊,購買模塊,訂單模塊。

搭建環(huán)境 建立包結(jié)構(gòu)

導(dǎo)入開發(fā)包

前臺分幀頁面

index.jsp【沒有body標(biāo)簽的】

  
    
    
  

head.jsp


歡迎來到購物中心

body是空白的jsp頁面

效果:

后臺分幀頁面

manager.jsp【嵌套了framset標(biāo)簽,也是沒有body標(biāo)簽的】


    

    
        
        
    

head.jsp


后臺管理

left.jsp


分類管理



圖書管理

訂單管理

body.jsp是空白的

效果:

分幀的文件夾目錄結(jié)構(gòu)

值得注意的是:

文件夾的名字不能使用“manager”,不然會出現(xiàn):403 Access Denied錯誤

frameset標(biāo)簽是可以嵌套的,分列用“cols”,分行用“rows”

導(dǎo)入工具類和方法的代碼

過濾中文亂碼數(shù)據(jù)

HTML轉(zhuǎn)義

DAOFactory

JDBC連接池

UUID工具類

c3p0.xml配置文件

這些代碼都可以在我的博客分類:代碼庫中找到!

分類模塊

首先,我們來做分類模塊吧

創(chuàng)建實體Category
    private String id;
    private String name;
    private String description;

    //各種setter、getter
在數(shù)據(jù)庫創(chuàng)建表
CREATE TABLE category (

  id          VARCHAR(40) PRIMARY KEY,
  name        VARCHAR(10) NOT NULL UNIQUE ,
  description VARCHAR(255)


);
編寫CategoryDAO
/**
 * 分類模塊
 *  1:添加分類
 *  2:查找分類
 *  3:修改分類
 *
 *
 * */
public class CategoryImpl {

    public void addCategory(Category category) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Category findCategory(String id) {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category WHERE id=?";

        try {
            Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));

            return category;

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
 
    }

    public List getAllCategory() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
        String sql = "SELECT * FROM category";

        try {
            List categories = (List) queryRunner.query(sql, new BeanListHandler(Category.class));

             return categories;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
     
    }
}
測試DAO
public class demo {

    @Test
    public void add() {

        Category category = new Category();
        category.setId("2");
        category.setName("數(shù)據(jù)庫系列");
        category.setDescription("這是數(shù)據(jù)庫系列");

        CategoryImpl category1 = new CategoryImpl();
        category1.addCategory(category);

    }

    @Test
    public void find() {

        String id = "1";
        CategoryImpl category1 = new CategoryImpl();
        Category category = category1.findCategory(id);

        System.out.println(category.getName());
    }
    @Test
    public void getAll() {


        CategoryImpl category1 = new CategoryImpl();
        List categories = category1.getAllCategory();

        for (Category category : categories) {
            System.out.println(category.getName());
        }
    }

}
抽取成DAO接口
public interface CategoryDao {
    void addCategory(Category category);

    Category findCategory(String id);

    List getAllCategory();
}
后臺頁面的添加分類

在超鏈接上,綁定顯示添加分類的頁面

添加分類

顯示添加分類的JSP頁面


分類名稱:
分類描述:

處理添加分類的Servlet

        if (method.equals("add")) {

            try {
                //把瀏覽器帶過來的數(shù)據(jù)封裝到bean中
                Category category = WebUtils.request2Bean(request, Category.class);
                category.setId(WebUtils.makeId());

                service.addCategory(category);
                request.setAttribute("message", "添加分類成功!");

            } catch (Exception e) {
                request.setAttribute("message","添加分類失敗");
                e.printStackTrace();
            }
            request.getRequestDispatcher("/message.jsp").forward(request, response);

        }

效果:

后臺頁面的查看分類

在超鏈接上,綁定處理請求的Servlet

        else if (method.equals("look")) {

            List list = service.getAllCategory();
            request.setAttribute("list", list);
            request.getRequestDispatcher("/background/lookCategory.jsp").forward(request, response);

        } 

顯示分類頁面的JSP



    暫時還沒有分類數(shù)據(jù)哦,請你添加把



    

        
分類名字 分類描述 操作
${category.name} ${category.description} 刪除 修改

效果:

圖書模塊 分析

在設(shè)計圖書管理的時候,我們應(yīng)該想到:圖書和分類是有關(guān)系的。一個分類可以對應(yīng)多本圖書。

為什么要這樣設(shè)計?這樣更加人性化,用戶在購買書籍的時候,用戶能夠查看相關(guān)分類后的圖書,而不是全部圖書都顯示給用戶,讓用戶一個一個去找。

設(shè)計實體
    private String id;
    private String name;
    private String author;
    private String description;
    private double price;

    //記住圖片的名稱
    private String image;

    //記住分類的id
    private String category_id;

    //各種setter和getter
設(shè)計數(shù)據(jù)庫表
CREATE TABLE book (
  id          VARCHAR(40) PRIMARY KEY,
  name        VARCHAR(10) NOT NULL UNIQUE,
  description VARCHAR(255),
  author      VARCHAR(10),
  price       FLOAT,
  image       VARCHAR(100),
  category_id VARCHAR(40),
  CONSTRAINT category_id_FK FOREIGN KEY (category_id) REFERENCES category (id)

);
編寫DAO

/**
 * 圖書模塊
 * 1:添加圖書
 * 2:查看圖書
 * 3:查找圖書的分頁數(shù)據(jù)【圖書一般來說有很多,所以要分頁】
 */
public class BookDaoImpl {

    public void addBook(Book book) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "INSERT INTO book (id,name,description,author,price,image,category_id) VALUES(?,?,?,?,?,?,?)";
        try {
            queryRunner.update(sql, new Object[]{book.getId(), book.getName(), book.getDescription(), book.getAuthor(), book.getPrice(),book.getImage(), book.getCategory_id()});

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public Book findBook(String id) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "SELECT * FROM book WHERE id=?";

        try {
            return (Book) queryRunner.query(sql, id, new BeanHandler(Book.class));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**得到圖書的分頁數(shù)據(jù)*/
    public List getPageData(int start, int end) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "SELECT * FROM book limit ?,?";

        try {
            return (List) queryRunner.query(sql, new BeanListHandler(Book.class), new Object[]{start, end});
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**得到按照分類圖書的分頁數(shù)據(jù)*/
    public List getPageData(int start, int end,String category_id) {

        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        //WHERE字句在limit字句的前邊,注意Object[]的參數(shù)位置!
        String sql = "SELECT * FROM book WHERE category_id=? limit ?,?";

        try {
            return (List) queryRunner.query(sql, new BeanListHandler(Book.class), new Object[]{ category_id,start, end});
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 得到圖書的總記錄數(shù)
     */
    public int getTotalRecord() {
        QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

        String sql = "SELECT COUNT(*) FROM book";

        try {
            return (int) queryRunner.query(sql, new ScalarHandler());
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 得到分類后圖書的總記錄數(shù)
     * getCategoryTotalRecord
     */
    public long getCategoryTotalRecord(String category_id) {

        try {
            QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());

            String sql = "SELECT COUNT(*) FROM book WHERE category_id=?";
            return (long) queryRunner.query(sql, category_id, new ScalarHandler());

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

}
測試DAO
public class BookDemo {

    BookDaoImpl bookDao = new BookDaoImpl();


    @Test

    public void add() {
        Book book = new Book();
        book.setId("5");
        book.setName("SQLServer");
        book.setAuthor("我也不知道");
        book.setImage("33333332432");
        book.setPrice(33.22);
        book.setDescription("這是一本好書");
        book.setCategory_id("2");

        bookDao.addBook(book);
    }

    @Test
    public void look() {

        List bookList = bookDao.getPageData(3, 3);

        for (Book book : bookList) {
            System.out.println(book.getName());
        }

        List books = bookDao.getPageData(0,2,"2");

        for (Book book : books) {
            System.out.println(book.getName());

        }
    }

    @Test
    public void find() {
        String id = "2";
        Book book = bookDao.findBook(id);

        System.out.println(book.getName());
    }


}
抽取成DAO接口
public interface BookDao {
    void addBook(Book book);

    Book findBook(String id);

    List getPageData(int start, int end);

    List getPageData(int start, int end, String category_id);

    long getTotalRecord();

       long getCategoryTotalRecord(String category_id);
}
編寫Service層
    /*添加圖書*/
    public void addBook(Book book) {
        bookDao.addBook(book);

    }

    /*查找圖書*/
    public Book findBook(String id) {
        return bookDao.findBook(id);
    }

    /*查找圖書*/
    public Book findBook(String id) {
        return bookDao.findBook(id);
    }

    /*獲取圖書的分頁數(shù)據(jù)*/
    public Page getPageData(String pageNum) {
        
        Page page=null;
        if (pageNum == null) {
            page = new Page(1, bookDao.getTotalRecord());
        } else {
            page = new Page(Integer.valueOf(pageNum), bookDao.getTotalRecord());
        }

        List books = bookDao.getPageData(page.getStartIndex(), page.getLinesize());
        page.setList(books);
        
        return page;

    }

    /*獲取圖書分類后的分頁數(shù)據(jù)*/
    public Page getPageData(String currentPageCount,String category_id) {

        Page page=null;
        if (currentPageCount == null) {
            page = new Page(1, bookDao.getCategoryTotalRecord(category_id));
        } else {
            page = new Page(Integer.valueOf(currentPageCount), bookDao.getCategoryTotalRecord(category_id));
        }

        List books = bookDao.getPageData(page.getStartIndex(), page.getLinesize(), category_id);
        page.setList(books);
        return page;

    }

后臺添加圖書

后臺要添加圖書的時候,應(yīng)該說明圖書的類型是什么。

要想在顯示添加圖書的頁面上知道全部類型的id,就要經(jīng)過Servlet把類型的集合傳送過去

綁定鏈接
添加圖書
傳送類型集合的Servlet
        String method = request.getParameter("method");
        BussinessServiceImpl service = new BussinessServiceImpl();

        if (method.equals("addUI")) {

            List list = service.getAllCategory();
            request.setAttribute("list", list);
            request.getRequestDispatcher("/background/addBook.jsp").forward(request, response);

        } 
顯示JSP頁面
圖書名稱:
作者:
圖書價錢:
類型:
上傳圖片
詳細(xì)描述
處理表單數(shù)據(jù)Servlet
else if (method.equals("add")) {

            //上傳文件和普通數(shù)據(jù)分割開,封裝到Book對象上
            Book book = uploadData(request);

            book.setId(WebUtils.makeId());
            service.addBook(book);
            request.setAttribute("message", "添加圖書成功");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }

uploadData()方法代碼

    private Book uploadData(HttpServletRequest request) {

        Book book = new Book();
        try{

            //1.得到解析器工廠
            DiskFileItemFactory factory = new DiskFileItemFactory();

            //2.得到解析器
            ServletFileUpload upload = new ServletFileUpload(factory);

            //設(shè)置編碼
            upload.setHeaderEncoding("UTF-8");


            //為上傳表單,則調(diào)用解析器解析上傳數(shù)據(jù)
            List list = upload.parseRequest(request);  //FileItem

            //遍歷list,得到用于封裝第一個上傳輸入項數(shù)據(jù)fileItem對象
            for(FileItem item : list){

                if(item.isFormField()){

                    //得到的是普通輸入項
                    String name = item.getFieldName();  //得到輸入項的名稱
                    String value = item.getString("UTF-8");

                    //使用BeanUtils封裝數(shù)據(jù)
                    BeanUtils.setProperty(book, name, value);
                }else{

                    //得到上傳輸入項

                    //得到上傳文件名全路徑
                    String filename = item.getName();

                    //截取文件名
                    filename = filename.substring(filename.lastIndexOf("")+1);

                    InputStream in = item.getInputStream();   //得到上傳數(shù)據(jù)

                    int len = 0;
                    byte buffer[]= new byte[1024];

                    //如果沒有這個目錄,就創(chuàng)建它
                    String savepath = this.getServletContext().getRealPath("/image");
                    File file = new File(savepath);
                    if (!file.exists()) {
                        file.mkdir();
                    }

                    FileOutputStream out = new FileOutputStream(savepath + "" + filename);
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }
                    //設(shè)置圖片的名字
                    book.setImage(filename);

                    in.close();
                    out.close();

                    //關(guān)閉臨時文件
                    item.delete();
                }
            }

        }catch (Exception e) {
            e.printStackTrace();
        }
        return book;
    }

效果:

后臺顯示圖書模塊

由于我們用的是分頁技術(shù),所以我們導(dǎo)入之前寫過的Page類和jsp吧.....這些代碼可以在我分類的代碼庫中找到

綁定超鏈接

查看圖書
Servlet處理請求
        else if (method.equals("look")) {

            String currentPageCount = request.getParameter("currentPageCount");
            Page page = service.getPageData(currentPageCount);

            request.setAttribute("page",page);
            request.getRequestDispatcher("/background/listBook.jsp").forward(request, response);
        }
顯示圖書JSP頁面

Servlet端傳過來的是Page對象,而不是list集合

可以根據(jù)記載在Book對象的圖片名稱,弄一個超鏈接,超鏈接指向服務(wù)端的圖片,這樣就可以查看圖片了!




    暫時還沒有任何圖書哦





   
           
書名 作者 價錢 描述 圖片 操作
${book.name} ${book.author} ${book.price} ${book.description} 查看圖片 刪除 修改

效果:

前臺頁面

看回我們前臺頁面的成果圖,我們可以把整個body頁面看成是三個div

body占整個div

導(dǎo)航條是一個div

顯示圖書的地方是一個div

設(shè)計好大概的布局

html代碼引入css

    

HTML三個div

這是導(dǎo)航條
這是書籍的地方
這是頁碼

CSS代碼:

#body {
    position: relative;
}


#category {
    border: 1px solid #000;
    position: absolute;
    width: 300px;
    height: 400px;
    float: left;
    left: 200px;
    top: 70px;;
}

#bookandpages {
    border: 1px solid #000000;
    position: absolute;
    width: 600px;
    height: 600px;;
    float: left;
    left: 500px;
    margin-left: 50px;
}

#books {
    border: 1px solid #000;
    width: 600px;
    height: 550px;;
}

#page {
    border: 1px solid #000;
    position: absolute;
    height: 48px;
    width: 600px;
}

大概的布局

IndexServlet

在顯示首頁的下部分的時候,應(yīng)該先去尋找一個Servlet來把數(shù)據(jù)交給對應(yīng)的JSP

因為我們的JSP一般都是放在WEB-INF下,是不能直接訪問的。還有就是JSP往往是需要我們后臺的數(shù)據(jù)的,因此我們使用Servlet來獲取得到數(shù)據(jù),再交由JSP來展示就最好不過了。

    

Servlet代碼:

        //得到所有的分類數(shù)據(jù),給body頁面
        BussinessServiceImpl service = new BussinessServiceImpl();
        List categories = service.getAllCategory();
        request.setAttribute("categories", categories);
        String currentPageCount = request.getParameter("currentPageCount");

        //得到所有分類的圖書,給body頁面
        Page page = service.getPageData(currentPageCount);
        request.setAttribute("page", page);

        request.getRequestDispatcher("/client/body.jsp").forward(request,response);
JSP顯示數(shù)據(jù)
書籍分類 :
  • ${categories.name}
  • CSS代碼:

    重要的是:如果div浮動都黏貼在一起了,那么在后邊多加個div,用于清除浮動效果

    #body {
        position: relative;
    }
    
    #category {
        border: 1px solid #000;
        position: absolute;
        width: 300px;
        height: 400px;
        float: left;
        left: 200px;
        top: 70px;;
    }
    
    #bookandpages {
        border: 1px solid #000000;
        position: absolute;
        width: 780px;
        height: 538px;;
        float: left;
        left: 500px;
        margin-left: 50px;
    }
    
    #books{
        margin-left: 50px;
        margin-top: 30px;
    }
    #image{
        float: left;
    }
    #bookinfo{
        float: left;
    }
    #page {
        height: 62px;
        width: 780px;
        position: fixed;
        margin-left: 549px;
        margin-top: 477px;
        text-align: center;
        line-height: 50px;
    }

    效果:

    按照分類顯示圖書

    我們可以根據(jù)左邊的導(dǎo)航條來顯示相對應(yīng)的分類圖書。

    Servlet代碼:

            BussinessServiceImpl service = new BussinessServiceImpl();
            String currentPageCount = request.getParameter("currentPageCount");
            String category_id = request.getParameter("category_id");
    
            Page page = service.getPageData(currentPageCount, category_id);
            List  categories = service.getAllCategory();
    
            request.setAttribute("page", page);
            request.setAttribute("categories", categories);
            request.getRequestDispatcher("/client/body.jsp").forward(request,response);
    效果:

    如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號:Java3y
    

    文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68592.html

    相關(guān)文章

    • Java3y文章目錄導(dǎo)航

      摘要:前言由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號:Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...

      KevinYan 評論0 收藏0
    • JavaWeb圖書管理系統(tǒng)【總結(jié)】

      摘要:存在則購物項的數(shù)量提供購買功能,參數(shù)是和。用戶想要購買商品時,判斷用戶是否登陸了,還要判斷購物車是否存在購物車使用來保存,不存在則創(chuàng)建。得到未發(fā)貨的全部訂單和已發(fā)貨的全部訂單,其實就是檢索出不同狀態(tài)的全部訂單。 感想 該項目是目前為止,我寫過代碼量最多的項目了.....雖然清楚是沒有含金量的【跟著視頻來寫的】,但感覺自己也在進(jìn)步中...... 寫的過程中,出了不少的問題.....非常多...

      張率功 評論0 收藏0
    • 基于SSM實現(xiàn)的圖書管理系統(tǒng)

      摘要:功能相對完整,界面美觀大方下面展示一下系統(tǒng)的部分功能系統(tǒng)登陸圖書分類管理圖書信息管理圖書借閱管理讀者信息管理系統(tǒng)管理以上是基于實現(xiàn)的圖書館管理系統(tǒng)的部分功能實現(xiàn),系統(tǒng)功能完整,運行無誤,比較適合做畢業(yè)設(shè)計或課程設(shè)計使用。 項目類別: BS-XX-075 運行環(huán)境: 開發(fā)工具:IDEA / E...

      不知名網(wǎng)友 評論0 收藏0
    • JavaWEB開發(fā)21——綜合項目(圖書商城)

      數(shù)據(jù)庫 create database productstore character set utf8 collate utf8_bin; USE productstore; -- 用戶表 CREATE TABLE `user` ( `id` INT(11) AUTO_INCREMENT, `userName` VARCHAR(20) , `password` VARCHAR(20)...

      raledong 評論0 收藏0
    • Vue-book 2.0 一個移動端簡單的全棧 web APP

      摘要:本項目是一個簡單的全棧項目,前端新手可以拿來練練手。項目實現(xiàn)了一些簡單的功能,后臺可以對圖書進(jìn)行錄入錄出掃碼或手動,前臺顯示錄入的圖書,并且前臺注冊登錄后可以將書的訂單發(fā)給服務(wù)器,并存到服務(wù)器。 Vue-book 2.0 Github 地址:https://github.com/percy507/v... 【覺得不錯就來個 star 吧 ^_^】 說明(菜鳥請進(jìn),大神繞道 ~) 前端...

      wh469012917 評論0 收藏0

    發(fā)表評論

    0條評論

    最新活動
    閱讀需要支付1元查看
    <