资讯专栏INFORMATION COLUMN

图书管理系统【JavaWeb:部署开发环境、解决分类、图书、前台页面模块】

djfml / 3342人阅读

摘要:前言巩固开发模式,做一个比较完整的小项目成果图该项目包含了两个部分,前台和后台。前台用于显示后台用于管理该项目可分为个模块来组成分类模块,用户模块,图书模块,购买模块,订单模块。

前言

巩固Servlet+JSP开发模式,做一个比较完整的小项目.

成果图

该项目包含了两个部分,前台和后台。

前台用于显示

后台用于管理

该项目可分为5个模块来组成:分类模块,用户模块,图书模块,购买模块,订单模块

搭建环境 建立包结构

导入开发包

前台分帧页面

index.jsp【没有body标签的】

</>复制代码

head.jsp

</>复制代码

  1. 欢迎来到购物中心

body是空白的jsp页面

效果:

后台分帧页面

manager.jsp【嵌套了framset标签,也是没有body标签的】

</>复制代码

head.jsp

</>复制代码

  1. 后台管理

left.jsp

</>复制代码

  1. 分类管理


  2. 图书管理


  3. 订单管理


body.jsp是空白的

效果:

分帧的文件夹目录结构

值得注意的是:

文件夹的名字不能使用“manager”,不然会出现:403 Access Denied错误

frameset标签是可以嵌套的,分列用“cols”,分行用“rows”

导入工具类和方法的代码

过滤中文乱码数据

HTML转义

DAOFactory

JDBC连接池

UUID工具类

c3p0.xml配置文件

这些代码都可以在我的博客分类:代码库中找到!

分类模块

首先,我们来做分类模块吧

创建实体Category

</>复制代码

  1. private String id;
  2. private String name;
  3. private String description;
  4. //各种setter、getter
在数据库创建表

</>复制代码

  1. CREATE TABLE category (
  2. id VARCHAR(40) PRIMARY KEY,
  3. name VARCHAR(10) NOT NULL UNIQUE ,
  4. description VARCHAR(255)
  5. );
编写CategoryDAO

</>复制代码

  1. /**
  2. * 分类模块
  3. * 1:添加分类
  4. * 2:查找分类
  5. * 3:修改分类
  6. *
  7. *
  8. * */
  9. public class CategoryImpl {
  10. public void addCategory(Category category) {
  11. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  12. String sql = "INSERT INTO category (id, name, description) VALUES(?,?,?)";
  13. try {
  14. queryRunner.update(sql, new Object[]{category.getId(), category.getName(), category.getDescription()});
  15. } catch (SQLException e) {
  16. throw new RuntimeException(e);
  17. }
  18. }
  19. public Category findCategory(String id) {
  20. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  21. String sql = "SELECT * FROM category WHERE id=?";
  22. try {
  23. Category category = (Category) queryRunner.query(sql, id, new BeanHandler(Category.class));
  24. return category;
  25. } catch (SQLException e) {
  26. throw new RuntimeException(e);
  27. }
  28. }
  29. public List getAllCategory() {
  30. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  31. String sql = "SELECT * FROM category";
  32. try {
  33. List categories = (List) queryRunner.query(sql, new BeanListHandler(Category.class));
  34. return categories;
  35. } catch (SQLException e) {
  36. throw new RuntimeException(e);
  37. }
  38. }
  39. }
测试DAO

</>复制代码

  1. public class demo {
  2. @Test
  3. public void add() {
  4. Category category = new Category();
  5. category.setId("2");
  6. category.setName("数据库系列");
  7. category.setDescription("这是数据库系列");
  8. CategoryImpl category1 = new CategoryImpl();
  9. category1.addCategory(category);
  10. }
  11. @Test
  12. public void find() {
  13. String id = "1";
  14. CategoryImpl category1 = new CategoryImpl();
  15. Category category = category1.findCategory(id);
  16. System.out.println(category.getName());
  17. }
  18. @Test
  19. public void getAll() {
  20. CategoryImpl category1 = new CategoryImpl();
  21. List categories = category1.getAllCategory();
  22. for (Category category : categories) {
  23. System.out.println(category.getName());
  24. }
  25. }
  26. }
抽取成DAO接口

</>复制代码

  1. public interface CategoryDao {
  2. void addCategory(Category category);
  3. Category findCategory(String id);
  4. List getAllCategory();
  5. }
后台页面的添加分类

在超链接上,绑定显示添加分类的页面

</>复制代码

  1. 添加分类

显示添加分类的JSP页面

</>复制代码

  1. 分类名称:
  2. 分类描述:

处理添加分类的Servlet

</>复制代码

  1. if (method.equals("add")) {
  2. try {
  3. //把浏览器带过来的数据封装到bean中
  4. Category category = WebUtils.request2Bean(request, Category.class);
  5. category.setId(WebUtils.makeId());
  6. service.addCategory(category);
  7. request.setAttribute("message", "添加分类成功!");
  8. } catch (Exception e) {
  9. request.setAttribute("message","添加分类失败");
  10. e.printStackTrace();
  11. }
  12. request.getRequestDispatcher("/message.jsp").forward(request, response);
  13. }

效果:

后台页面的查看分类

在超链接上,绑定处理请求的Servlet

</>复制代码

  1. else if (method.equals("look")) {
  2. List list = service.getAllCategory();
  3. request.setAttribute("list", list);
  4. request.getRequestDispatcher("/background/lookCategory.jsp").forward(request, response);
  5. }

显示分类页面的JSP

</>复制代码

  1. 暂时还没有分类数据哦,请你添加把
  2. 分类名字分类描述操作
    ${category.name}${category.description}
  3. 删除
  4. 修改

效果:

图书模块 分析

在设计图书管理的时候,我们应该想到:图书和分类是有关系的。一个分类可以对应多本图书。

为什么要这样设计?这样更加人性化,用户在购买书籍的时候,用户能够查看相关分类后的图书,而不是全部图书都显示给用户,让用户一个一个去找。

设计实体

</>复制代码

  1. private String id;
  2. private String name;
  3. private String author;
  4. private String description;
  5. private double price;
  6. //记住图片的名称
  7. private String image;
  8. //记住分类的id
  9. private String category_id;
  10. //各种setter和getter
设计数据库表

</>复制代码

  1. CREATE TABLE book (
  2. id VARCHAR(40) PRIMARY KEY,
  3. name VARCHAR(10) NOT NULL UNIQUE,
  4. description VARCHAR(255),
  5. author VARCHAR(10),
  6. price FLOAT,
  7. image VARCHAR(100),
  8. category_id VARCHAR(40),
  9. CONSTRAINT category_id_FK FOREIGN KEY (category_id) REFERENCES category (id)
  10. );
编写DAO

</>复制代码

  1. /**
  2. * 图书模块
  3. * 1:添加图书
  4. * 2:查看图书
  5. * 3:查找图书的分页数据【图书一般来说有很多,所以要分页】
  6. */
  7. public class BookDaoImpl {
  8. public void addBook(Book book) {
  9. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  10. String sql = "INSERT INTO book (id,name,description,author,price,image,category_id) VALUES(?,?,?,?,?,?,?)";
  11. try {
  12. queryRunner.update(sql, new Object[]{book.getId(), book.getName(), book.getDescription(), book.getAuthor(), book.getPrice(),book.getImage(), book.getCategory_id()});
  13. } catch (SQLException e) {
  14. throw new RuntimeException(e);
  15. }
  16. }
  17. public Book findBook(String id) {
  18. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  19. String sql = "SELECT * FROM book WHERE id=?";
  20. try {
  21. return (Book) queryRunner.query(sql, id, new BeanHandler(Book.class));
  22. } catch (SQLException e) {
  23. throw new RuntimeException(e);
  24. }
  25. }
  26. /**得到图书的分页数据*/
  27. public List getPageData(int start, int end) {
  28. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  29. String sql = "SELECT * FROM book limit ?,?";
  30. try {
  31. return (List) queryRunner.query(sql, new BeanListHandler(Book.class), new Object[]{start, end});
  32. } catch (SQLException e) {
  33. throw new RuntimeException(e);
  34. }
  35. }
  36. /**得到按照分类图书的分页数据*/
  37. public List getPageData(int start, int end,String category_id) {
  38. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  39. //WHERE字句在limit字句的前边,注意Object[]的参数位置!
  40. String sql = "SELECT * FROM book WHERE category_id=? limit ?,?";
  41. try {
  42. return (List) queryRunner.query(sql, new BeanListHandler(Book.class), new Object[]{ category_id,start, end});
  43. } catch (SQLException e) {
  44. throw new RuntimeException(e);
  45. }
  46. }
  47. /**
  48. * 得到图书的总记录数
  49. */
  50. public int getTotalRecord() {
  51. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  52. String sql = "SELECT COUNT(*) FROM book";
  53. try {
  54. return (int) queryRunner.query(sql, new ScalarHandler());
  55. } catch (SQLException e) {
  56. throw new RuntimeException(e);
  57. }
  58. }
  59. /**
  60. * 得到分类后图书的总记录数
  61. * getCategoryTotalRecord
  62. */
  63. public long getCategoryTotalRecord(String category_id) {
  64. try {
  65. QueryRunner queryRunner = new QueryRunner(Utils2DB.getDataSource());
  66. String sql = "SELECT COUNT(*) FROM book WHERE category_id=?";
  67. return (long) queryRunner.query(sql, category_id, new ScalarHandler());
  68. } catch (SQLException e) {
  69. throw new RuntimeException(e);
  70. }
  71. }
  72. }
测试DAO

</>复制代码

  1. public class BookDemo {
  2. BookDaoImpl bookDao = new BookDaoImpl();
  3. @Test
  4. public void add() {
  5. Book book = new Book();
  6. book.setId("5");
  7. book.setName("SQLServer");
  8. book.setAuthor("我也不知道");
  9. book.setImage("33333332432");
  10. book.setPrice(33.22);
  11. book.setDescription("这是一本好书");
  12. book.setCategory_id("2");
  13. bookDao.addBook(book);
  14. }
  15. @Test
  16. public void look() {
  17. List bookList = bookDao.getPageData(3, 3);
  18. for (Book book : bookList) {
  19. System.out.println(book.getName());
  20. }
  21. List books = bookDao.getPageData(0,2,"2");
  22. for (Book book : books) {
  23. System.out.println(book.getName());
  24. }
  25. }
  26. @Test
  27. public void find() {
  28. String id = "2";
  29. Book book = bookDao.findBook(id);
  30. System.out.println(book.getName());
  31. }
  32. }
抽取成DAO接口

</>复制代码

  1. public interface BookDao {
  2. void addBook(Book book);
  3. Book findBook(String id);
  4. List getPageData(int start, int end);
  5. List getPageData(int start, int end, String category_id);
  6. long getTotalRecord();
  7. long getCategoryTotalRecord(String category_id);
  8. }
编写Service层

</>复制代码

  1. /*添加图书*/
  2. public void addBook(Book book) {
  3. bookDao.addBook(book);
  4. }
  5. /*查找图书*/
  6. public Book findBook(String id) {
  7. return bookDao.findBook(id);
  8. }
  9. /*查找图书*/
  10. public Book findBook(String id) {
  11. return bookDao.findBook(id);
  12. }
  13. /*获取图书的分页数据*/
  14. public Page getPageData(String pageNum) {
  15. Page page=null;
  16. if (pageNum == null) {
  17. page = new Page(1, bookDao.getTotalRecord());
  18. } else {
  19. page = new Page(Integer.valueOf(pageNum), bookDao.getTotalRecord());
  20. }
  21. List books = bookDao.getPageData(page.getStartIndex(), page.getLinesize());
  22. page.setList(books);
  23. return page;
  24. }
  25. /*获取图书分类后的分页数据*/
  26. public Page getPageData(String currentPageCount,String category_id) {
  27. Page page=null;
  28. if (currentPageCount == null) {
  29. page = new Page(1, bookDao.getCategoryTotalRecord(category_id));
  30. } else {
  31. page = new Page(Integer.valueOf(currentPageCount), bookDao.getCategoryTotalRecord(category_id));
  32. }
  33. List books = bookDao.getPageData(page.getStartIndex(), page.getLinesize(), category_id);
  34. page.setList(books);
  35. return page;
  36. }
后台添加图书

后台要添加图书的时候,应该说明图书的类型是什么。

要想在显示添加图书的页面上知道全部类型的id,就要经过Servlet把类型的集合传送过去

绑定链接

</>复制代码

  1. 添加图书
传送类型集合的Servlet

</>复制代码

  1. String method = request.getParameter("method");
  2. BussinessServiceImpl service = new BussinessServiceImpl();
  3. if (method.equals("addUI")) {
  4. List list = service.getAllCategory();
  5. request.setAttribute("list", list);
  6. request.getRequestDispatcher("/background/addBook.jsp").forward(request, response);
  7. }
显示JSP页面

</>复制代码

  1. 图书名称:
    作者:
    图书价钱:
    类型:
  2. 上传图片
    详细描述
处理表单数据Servlet

</>复制代码

  1. else if (method.equals("add")) {
  2. //上传文件和普通数据分割开,封装到Book对象上
  3. Book book = uploadData(request);
  4. book.setId(WebUtils.makeId());
  5. service.addBook(book);
  6. request.setAttribute("message", "添加图书成功");
  7. request.getRequestDispatcher("/message.jsp").forward(request, response);
  8. }

uploadData()方法代码

</>复制代码

  1. private Book uploadData(HttpServletRequest request) {
  2. Book book = new Book();
  3. try{
  4. //1.得到解析器工厂
  5. DiskFileItemFactory factory = new DiskFileItemFactory();
  6. //2.得到解析器
  7. ServletFileUpload upload = new ServletFileUpload(factory);
  8. //设置编码
  9. upload.setHeaderEncoding("UTF-8");
  10. //为上传表单,则调用解析器解析上传数据
  11. List list = upload.parseRequest(request); //FileItem
  12. //遍历list,得到用于封装第一个上传输入项数据fileItem对象
  13. for(FileItem item : list){
  14. if(item.isFormField()){
  15. //得到的是普通输入项
  16. String name = item.getFieldName(); //得到输入项的名称
  17. String value = item.getString("UTF-8");
  18. //使用BeanUtils封装数据
  19. BeanUtils.setProperty(book, name, value);
  20. }else{
  21. //得到上传输入项
  22. //得到上传文件名全路径
  23. String filename = item.getName();
  24. //截取文件名
  25. filename = filename.substring(filename.lastIndexOf("")+1);
  26. InputStream in = item.getInputStream(); //得到上传数据
  27. int len = 0;
  28. byte buffer[]= new byte[1024];
  29. //如果没有这个目录,就创建它
  30. String savepath = this.getServletContext().getRealPath("/image");
  31. File file = new File(savepath);
  32. if (!file.exists()) {
  33. file.mkdir();
  34. }
  35. FileOutputStream out = new FileOutputStream(savepath + "" + filename);
  36. while((len=in.read(buffer))>0){
  37. out.write(buffer, 0, len);
  38. }
  39. //设置图片的名字
  40. book.setImage(filename);
  41. in.close();
  42. out.close();
  43. //关闭临时文件
  44. item.delete();
  45. }
  46. }
  47. }catch (Exception e) {
  48. e.printStackTrace();
  49. }
  50. return book;
  51. }

效果:

后台显示图书模块

由于我们用的是分页技术,所以我们导入之前写过的Page类和jsp吧.....这些代码可以在我分类的代码库中找到

绑定超链接

</>复制代码

  1. 查看图书
Servlet处理请求

</>复制代码

  1. else if (method.equals("look")) {
  2. String currentPageCount = request.getParameter("currentPageCount");
  3. Page page = service.getPageData(currentPageCount);
  4. request.setAttribute("page",page);
  5. request.getRequestDispatcher("/background/listBook.jsp").forward(request, response);
  6. }
显示图书JSP页面

Servlet端传过来的是Page对象,而不是list集合

可以根据记载在Book对象的图片名称,弄一个超链接,超链接指向服务端的图片,这样就可以查看图片了!

</>复制代码

  1. 暂时还没有任何图书哦
  2. 书名作者价钱描述图片操作
    ${book.name}${book.author}${book.price}${book.description}查看图片
  3. 删除
  4. 修改

效果:

前台页面

看回我们前台页面的成果图,我们可以把整个body页面看成是三个div

body占整个div

导航条是一个div

显示图书的地方是一个div

设计好大概的布局

html代码引入css

</>复制代码

HTML三个div

</>复制代码

  1. 这是导航条
  2. 这是书籍的地方
  3. 这是页码

CSS代码:

</>复制代码

  1. #body {
  2. position: relative;
  3. }
  4. #category {
  5. border: 1px solid #000;
  6. position: absolute;
  7. width: 300px;
  8. height: 400px;
  9. float: left;
  10. left: 200px;
  11. top: 70px;;
  12. }
  13. #bookandpages {
  14. border: 1px solid #000000;
  15. position: absolute;
  16. width: 600px;
  17. height: 600px;;
  18. float: left;
  19. left: 500px;
  20. margin-left: 50px;
  21. }
  22. #books {
  23. border: 1px solid #000;
  24. width: 600px;
  25. height: 550px;;
  26. }
  27. #page {
  28. border: 1px solid #000;
  29. position: absolute;
  30. height: 48px;
  31. width: 600px;
  32. }

大概的布局

IndexServlet

在显示首页的下部分的时候,应该先去寻找一个Servlet来把数据交给对应的JSP

因为我们的JSP一般都是放在WEB-INF下,是不能直接访问的。还有就是JSP往往是需要我们后台的数据的,因此我们使用Servlet来获取得到数据,再交由JSP来展示就最好不过了。

</>复制代码

Servlet代码:

</>复制代码

  1. //得到所有的分类数据,给body页面
  2. BussinessServiceImpl service = new BussinessServiceImpl();
  3. List categories = service.getAllCategory();
  4. request.setAttribute("categories", categories);
  5. String currentPageCount = request.getParameter("currentPageCount");
  6. //得到所有分类的图书,给body页面
  7. Page page = service.getPageData(currentPageCount);
  8. request.setAttribute("page", page);
  9. request.getRequestDispatcher("/client/body.jsp").forward(request,response);
JSP显示数据

</>复制代码

  1. 书籍分类 :

  2. ${categories.name}
CSS代码:

重要的是:如果div浮动都黏贴在一起了,那么在后边多加个div,用于清除浮动效果

</>复制代码

  1. #body {
  2. position: relative;
  3. }
  4. #category {
  5. border: 1px solid #000;
  6. position: absolute;
  7. width: 300px;
  8. height: 400px;
  9. float: left;
  10. left: 200px;
  11. top: 70px;;
  12. }
  13. #bookandpages {
  14. border: 1px solid #000000;
  15. position: absolute;
  16. width: 780px;
  17. height: 538px;;
  18. float: left;
  19. left: 500px;
  20. margin-left: 50px;
  21. }
  22. #books{
  23. margin-left: 50px;
  24. margin-top: 30px;
  25. }
  26. #image{
  27. float: left;
  28. }
  29. #bookinfo{
  30. float: left;
  31. }
  32. #page {
  33. height: 62px;
  34. width: 780px;
  35. position: fixed;
  36. margin-left: 549px;
  37. margin-top: 477px;
  38. text-align: center;
  39. line-height: 50px;
  40. }

效果:

按照分类显示图书

我们可以根据左边的导航条来显示相对应的分类图书。

Servlet代码:

</>复制代码

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

</>复制代码

  1. 如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:Java3y

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68592.html

相关文章

  • Java3y文章目录导航

    摘要:前言由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 前言 由于写的文章已经是有点多了,为了自己和大家的检索方便,于是我就做了这么一个博客导航。 由于更新比较频繁,因此隔一段时间才会更新目录导航哦~想要获取最新原创的技术文章欢迎关注我的公众号:Java3y Java3y文章目录导航 Java基础 泛型就这么简单 注解就这么简单 Druid数据库连接池...

    KevinYan 评论0 收藏0
  • JavaWeb图书管理系统【总结】

    摘要:存在则购物项的数量提供购买功能,参数是和。用户想要购买商品时,判断用户是否登陆了,还要判断购物车是否存在购物车使用来保存,不存在则创建。得到未发货的全部订单和已发货的全部订单,其实就是检索出不同状态的全部订单。 感想 该项目是目前为止,我写过代码量最多的项目了.....虽然清楚是没有含金量的【跟着视频来写的】,但感觉自己也在进步中...... 写的过程中,出了不少的问题.....非常多...

    张率功 评论0 收藏0
  • 基于SSM实现的图书管理系统

    摘要:功能相对完整,界面美观大方下面展示一下系统的部分功能系统登陆图书分类管理图书信息管理图书借阅管理读者信息管理系统管理以上是基于实现的图书馆管理系统的部分功能实现,系统功能完整,运行无误,比较适合做毕业设计或课程设计使用。 项目类别: BS-XX-075 运行环境: 开发工具:IDEA / E...

    不知名网友 评论0 收藏0
  • JavaWEB开发21——综合项目(图书商城)

    数据库 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

    摘要:本项目是一个简单的全栈项目,前端新手可以拿来练练手。项目实现了一些简单的功能,后台可以对图书进行录入录出扫码或手动,前台显示录入的图书,并且前台注册登录后可以将书的订单发给服务器,并存到服务器。 Vue-book 2.0 Github 地址:https://github.com/percy507/v... 【觉得不错就来个 star 吧 ^_^】 说明(菜鸟请进,大神绕道 ~) 前端...

    wh469012917 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<