2021-05-15书城项目第五阶段-图书模块

书城项目第五阶段-图书模块

1.编写图书模块的数据库表

#1.创建表
CREATE TABLE t_book(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(100),
`price` DECIMAL(11,2),
`author` VARCHAR(100),
`sales` INT,
`stock` INT,
`img_path` VARCHAR(200)
);

#2.插入初始化数据
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'java 从入门到放弃' , '国哥' , 80 , 9999 , 9 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '数据结构与算法' , '严敏君' , 78.5 , 6 , 13 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '怎样拐跑别人的媳妇' , '龙伍' , 68, 99999 , 52 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '木虚肉盖饭' , '小胖' , 16, 1000 , 50 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'C++编程思想' , '刚哥' , 45.5 , 14 , 95 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '蛋炒饭' , '周星星' , 9.9, 12 , 53 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '赌神' , '龙伍' , 66.5, 125 , 535 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'Java 编程思想' , '阳哥' , 99.5 , 47 , 36 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'JavaScript 从入门到精通' , '婷姐' , 9.9 , 85 , 95 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'cocos2d-x 游戏编程入门' , '国哥' , 49, 52 , 62 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'C 语言程序设计' , '谭浩强' , 28 , 52 , 74 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'Lua 语言程序设计' , '雷丰阳' , 51.5 , 48 , 82 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '西游记' , '罗贯中' , 12, 19 , 9999 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '水浒传' , '华仔' , 33.05 , 22 , 88 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '操作系统原理' , '刘优' , 133.05 , 122 , 188 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '数据结构 java 版' , '封大神' , 173.15 , 21 , 81 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'UNIX 高级环境编程' , '乐天' , 99.15 , 210 , 810 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , 'javaScript 高级编程' , '国哥' , 69.15 , 210 , 810 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '大话设计模式' , '国哥' , 89.15 , 20 , 10 , 'static/img/default.jpg');
INSERT INTO t_book(`id` , `name` , `author` , `price` , `sales` , `stock` , `img_path`)
VALUES(NULL , '人月神话' , '刚哥' , 88.15 , 20 , 80 , 'static/img/default.jpg');

#3.查询数据
SELECT * FROM t_book ;

2.编写图书模块的javaBean对象

在这里插入图片描述

3.编写图书模块的DAO和对其进行测试

3.1编写接口

public interface BookDao {
    /**
     * 添加书
     * @param book
     * @return
     */
    int addBook(Book book);

    /**
     * 根据id编号删除书
     * @param id
     * @return
     */
    int deleteBookById(Integer id);

    /**
     * 修改图书
     * @param book
     * @return
     */
    int updateBook(Book book);

    /**
     * 根据id查询书籍
     * @param id
     * @return
     */
    Book queryBookById(Integer id);

    /**
     * 查询数据库中的所有书籍
     * @return
     */
    List<Book> queryBooks();
}

3.2编写实现类

public class BookDaoImpl extends BaseDao implements BookDao {
    @Override
    public int addBook(Book book) {
        String sql = "insert into t_book(`id`,`name`,`author`,`price`,`sales`,`stock`,`img_path`) values(?,?,?,?,?,?,?)";
       return  update(sql,book.getId(),book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath());
    }

    @Override
    public int deleteBookById(Integer id) {
        String sql  = "delete from t_book where `id`=?";
        return update(sql,id);
    }

    @Override
    public int updateBook(Book book) {
       String sql = "update t_book set name=?,author=?,price=?,sales=?,stock=?,img_path=? where id=?";
       return update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getSales(),book.getStock(),book.getImgPath(),book.getId());
    }

    @Override
    public Book queryBookById(Integer id) {
        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` from t_book where id=?";
        return queryforOne(sql,Book.class,id);
    }

    @Override
    public List<Book> queryBooks() {

        String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` from t_book";
        return queryforList(sql,Book.class);
    }
}

3.3进行测试

public class BookDaoTest {

    BookDao bookDao = new BookDaoImpl();
    @Test
    public void addBook() {
        bookDao.addBook(new Book(null,"时间简史","霍金",new BigDecimal(29.4),100,200,null));

    }

    @Test
    public void deleteBookById() {
        bookDao.deleteBookById(21);
    }

    @Test
    public void updateBook() {
        bookDao.updateBook(new Book(20,"时间简史","霍金",new BigDecimal(29.4),100,200,null));
    }

    @Test
    public void queryBookById() {
        Book book = bookDao.queryBookById(1);
        System.out.println(book);
    }

    @Test
    public void queryBooks() {
        List<Book> books = bookDao.queryBooks();
        for (Book book : books) {
            System.out.println(book);
        }
    }
}

4.编写图书模块的service并进行测试

4.1编写接口

public interface BookService {
    /**
     * 实现添加图书的服务操作
     * @param book
     */

     void addBook(Book book);

    /**
     * 实现删除图书的操作
     * @param id
     */
    void deleteBookById(Integer id);

    /**
     * 修改图书的操作
     * @param book
     */
    void updateBook(Book book);

    /**
     * 根据id查询图书的操作
     * @param id
     * @return
     */
    Book queryBookById(Integer id);

    /**
     * 查询所有书籍
     */
    List<Book> queryBooks();


}

4.2编写接口实现类

public class BookServiceImpl implements BookService {
    BookDao bookDao = new BookDaoImpl();
    @Override
    public void addBook(Book book) {
        bookDao.addBook(book);

    }

    @Override
    public void deleteBookById(Integer id) {
        bookDao.deleteBookById(id);
    }

    @Override
    public void updateBook(Book book) {
        bookDao.updateBook(book);
    }

    @Override
    public Book queryBookById(Integer id) {
      return bookDao.queryBookById(id);
    }

    @Override
    public List<Book> queryBooks() {
        return bookDao.queryBooks();
    }
}

4.3进行测试

public class BookServiceTest {
    BookService bookService = new BookServiceImpl();

    @Test
    public void addBook() {
        bookService.addBook(new Book(null,"时间简史2","霍金",new BigDecimal(29.4),100,200,null));
    }

    @Test
    public void deleteBookById() {
        bookService.deleteBookById(22);
    }

    @Test
    public void updateBook() {
        bookService.updateBook(new Book(20,"时间简史2","霍金",new BigDecimal(29.4),100,200,null));
    }

    @Test
    public void queryBookById() {
        System.out.println(bookService.queryBookById(2));
    }

    @Test
    public void queryBooks() {
        System.out.println(bookService.queryBooks());
    }
}

5.编写图书模块的web层,和页面联调测试

5.1 图书列表功能的实现

5.1.1 首先展示图书列表的流程图

在这里插入图片描述

5.1.2 然后根据图书列表流程图在BookServlet程序中编写程序,同时注意配置web.xml文件
  protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.首先调用bookservice查询全部书籍
        List<Book> books = bookService.queryBooks();

        //2.将查询得到的List集合整体放入request域中
        req.setAttribute("books",books);

        //3.请求转发到book manager页面,注意这是一次请求。
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);

    }
5.1.3 修改图书管理的请求地址
<a href="manager/bookServlet?action=list">图书管理</a>
5.1.4 修改pages/manager/book_manager.jsp 页面的数据遍历输出
<c:forEach items="${requestScope.books}" var="book">


			<tr>
				<td>${book.name}</td>
				<td>${book.price}</td>
				<td>${book.author}</td>
				<td>${book.sales}</td>
				<td>${book.stock}</td>
				<td><a href="book_edit.jsp">修改</a></td>
				<td><a href="#">删除</a></td>
			</tr>

			</c:forEach>

5.2 添加图书功能的实现

5.2.1 画出添加功能的流程图

在这里插入图片描述

5.2.2 然后根据添加流程图在BookServlet程序中编写程序,同时注意配置web.xml文件

注意问题:重定向的使用。

当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次请求。

首先在表单提交中增加提交方法和隐藏域。

<form action="manager/bookServlet" method="get">
				<input type="hidden" name="action" value="add">

编写bookServlet中的add方法对应的程序。

protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //根据提交的表单获取信息
        String book_name = req.getParameter("book_name");
        String book_price = req.getParameter("book_price");
        String book_author = req.getParameter("book_author");
        String book_sales = req.getParameter("book_sales");
        String book_stock = req.getParameter("book_stock");
        //生成新的对象
        Book book = new Book(null, book_name, book_author, new BigDecimal(book_price), Integer.parseInt(book_sales), Integer.parseInt(book_stock), null);
        //调用bookservice.addBook方法,将其添加到数据库

         bookService.addBook(book);
        //重定向到表单显示
//        转发中“/”表示”localhost:8080/projectname(项目名称)/“,但是在重定向中使用“/”,这个表示的是
//        localhost:8080/,也就是到达webapp。
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
    }

关于表单提交中method = "post"提交出现中文乱码问题的解决方法:
摘要:中文乱码主要是根据 get,post请求的不同,处理方式没选对引起的,当然也有小可能是tomcat的版本不同引起的

form表单提交中文乱码问题:
首先 get,和 post 的区别:
1> get 请求的请求参数附在地址栏的url之后,post请求是通过http post 机制将表单各个字段及其内容放在Html header 里面发送到所请求的action中
2>get 请求的数据量小,要小于2kb,
3>因为get 请求会将请求参数以及内容附在地址栏后面,所以不安全性会更高。

针对get 请求和post请求乱码分析:
如果是get请求,服务器是由tomcat默认的编码格式,或者你设定的编码格式去重新编码,也就是说,这个编码是由tomcat容器完成的。至于tomcat 是用那种编码,分情况
1>.如果是tomcat7 以及以下版本,默认的编码格式是ISO- 8859-1,如果想改变默认的编码格式,在tomcat/conf/server.xml里面,修改为,如果你不想改这里,或者项目不允许动配置,那么你只能在代码中每次都要对请求参数自己进行重新编码了

2>.如果是tomcat8,那么默认的编码格式是urf-8,你如果页面也是使用的utf-8(这个格式 是取决于你浏览器怎样提交)提交,那么你完全什么都不用干

如果是post请求,你的请求参数是由request.setCharacterEncoding(“UTF-8”)来设置重新编码格式的。也就是我们需要用代码去解决。你可以在你的每个servlet中或者每个action中将这段代码加进去。为了方便,你可以写个过滤器,让每个请求都走一下过滤器。当然,如果你用的是springMvc,或者struct2等框架,他们都有自带的过滤器,直接在web.xml中进行配置就好了。
————————————————
版权声明:本文为CSDN博主「Kind丶King」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jixinhuluwa/article/details/51496183

5.3 删除图书功能的实现

5.3.1 画出删除功能的流程图

在这里插入图片描述

5.3.2 然后根据删除流程图在BookServlet程序中编写程序

首先配置删除地址

<td><a class="deletebook" href="manager/bookServlet?action=delete&id=${book.id}">删除</a></td>

绑定单击事件,提示用户是否删除

<script type="text/javascript">
		$(function () {
			$("a.deletebook").click(function () {

				return confirm("你确定要删除["+$(this).parent().parent().find("td:first").text()+"]吗?");
			})
		})
	</script>

该方法用于将字符串转化为数字

public class WebUtils {
    public  static int parseInt(String strInt,int defaultValue){
        try {
            return Integer.parseInt(strInt);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return defaultValue;

    }
}

删除功能的演示:

  protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        bookService.deleteBookById(WebUtils.parseInt(id,0));
        //重定向到表单显示
//        转发中“/”表示”localhost:8080/projectname(项目名称)/“,但是在重定向中使用“/”,这个表示的是
//        localhost:8080/,也就是到达webapp。
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
    }

5.4 修改图书功能的实现

5.4.1 画出修改功能的流程图

在这里插入图片描述

5.4.2 然后根据修改流程图在BookServlet程序中编写程序

1.编写地址并加入要修改的书的id:

<td><a href="manager/bookServlet?action=getBook&id=${book.id}">修改</a></td>

2.编写servlet程序,得到书的对应信息

protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        //查询完成之后保存到request域中
        Book book = bookService.queryBookById(WebUtils.parseInt(id, 0));

        req.setAttribute("book",book);

        //请求转发到book_edit页面
        req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
    }

3.根据getbook程序,实现edit中的表单回显

<form action="manager/bookServlet" method="post">
				<%-- value值--%>
				<input type="hidden" name="action" value="${empty param.id? "add":"update"}">
					<input type="hidden" name="bookId" value="${requestScope.book.id}">
				<table>
					<tr>
						<td>名称</td>
						<td>价格</td>
						<td>作者</td>
						<td>销量</td>
						<td>库存</td>
						<td colspan="2">操作</td>
					</tr>		
					<tr>
						<td><input name="book_name" type="text" value="${requestScope.book.name}"/></td>
						<td><input name="book_price" type="text" value="${requestScope.book.price}"/></td>
						<td><input name="book_author" type="text" value="${requestScope.book.author}"/></td>
						<td><input name="book_sales" type="text" value="${requestScope.book.sales}"/></td>
						<td><input name="book_stock" type="text" value="${requestScope.book.stock}"/></td>
						<td><input type="submit" value="提交"/></td>
					</tr>	
				</table>
			</form>

注意点1:在信息回显过程中,还需要传递id信息,供bookservice中的update使用

<input type="hidden" name="bookId" value="${requestScope.book.id}">

注意点2:为了区别add和 update,进行如下操作
注意这个传递的id值指的是一开始传递过来的id。如果id存在,那么就是update,反之是add。因为添加图书是不会传递id值的。

<input type="hidden" name="action" value="${empty param.id? "add":"update"}">

4.编写update程序,完成操作:

protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String bookId = req.getParameter("bookId");

        int numberId = WebUtils.parseInt(bookId, 0);

        //进行修改操作操作
        //根据提交的表单获取信息
        String book_name = req.getParameter("book_name");
        String book_price = req.getParameter("book_price");
        String book_author = req.getParameter("book_author");
        String book_sales = req.getParameter("book_sales");
        String book_stock = req.getParameter("book_stock");
        //生成新的对象
        Book book = new Book(numberId, book_name, book_author, new BigDecimal(book_price), Integer.parseInt(book_sales), Integer.parseInt(book_stock), null);
        //调用bookservice.update修改
        bookService.updateBook(book);


        //重定向操作:
        resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 概述 本文主要介绍的是专为齐齐哈尔大学学校使用而开发的图书馆信息管理系统的设计。整个系统的开发过程严格遵循软件工程的要求,做到模块化分析、模块化设计和代码编写的模块化。 项目背景 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对图书信息进行管理,有着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率,也是图书馆的科学化、正规化管理,是与世界接轨的重要条件。 编写目的 齐齐哈尔大学是一所拥有两万余师生的高等学校,每天有大量的老师和同学到图书馆借阅书籍。记录图书借阅情况是非常繁琐工作。使用计算机可以高速,快捷地完成工作。有鉴于此,开发一套图书馆信息管理系统,是十分必要的。 采用数据库技术开发的图书馆信息管理系统可以用来实现对图书的信息管理,可以提高管理的效率。现在,大多数学校的图书馆都是封闭式管理,要求藏书全部公开开放,师生共享,开架阅览。这种阅览方式是适合当前我国国情、发挥图书馆应用作用的最佳方式,也是素质教育的最好体现。它充分发挥了图书馆的功效,最大限度地为师生服务,这也是图书馆自动化管理的最终目标。实现这一目标,必须有现代化的管理手段和管理体制。各地教育主管部门也都逐步提出学校要采用图书馆管理系统,从而实现人工管理做不到的一些功能并发挥图书馆的最大效益。越来越多的学校采用了现代化的管理软件进行管理,进一步提升了学校管理的现代化水平。 第二章 需求分析 图书馆信息管理系统是一个教育单位不可缺少的部分,它对于学校图书馆的管理十分重要,所以,图书馆信息管理系统不但要为图书管理者提供充足的信息和快捷的查询手段,也要为学生查询提供必要和快捷的查询手段,但一直以来人们仍使用传统人工的方式管理图书系统,这种管理方式存在着许多缺点,如:效率低、工作量大等,而且,随着图书数量的增长,对于图书信息的查找、更新和维护都带来了不少的困难。此外,计算机技术的不断成熟与发展使得对信息管理的应用成为可能。正是这样,图书馆信息管理系统在图书馆管理中发挥了重要的作用。 用户需求分析 1. 能够存储一定数量的图书信息,并方便有效的进行相应的书籍数据操作和管理。 2. 能够对一定数量的读者进行相应的信息存储与管理。 3. 能够提供一定的安全机制,提供数据信息授权访问,防止随意删改,同时提供信息备份的服务。 4.正常使用时不应出错,对于用户的输入错误应给出适当的改正提示。若运行时遇到不可恢复的系统错误,也必须保证数据库完好无损。 5.满足运行环境在允许操作系统之间的安全转换和与其它应用软件的独立运行要求。 软件主要功能及功能描述 软件包括两大系统: 一、学生图书借阅系统 图书借阅,归还,续借系统,修改登陆密码系统。 二、管理员系统 包括: 1. 管理员管理系统:添加、删除管理员,系统设有一个最高管理员拥有最高管理权限,修改管理员密码、登陆名。 2. 图书管理 (1)图书管理系统:查询、添加、删除、修改图书资料,可选择是否显示图书。 (2)图书分类管理系统:图书分类添加、修改、删除管理。 3. 教务管理 (1)学生班级管理系统:学生班级添加、修改、删除管理。 (2)学生信息管理系统:查询、添加、删除、修改学生资料。 4. 超时管理 图书借阅超时管理系统:列出学生超时借阅图书资料,锁定选定的学生,禁止锁定的学生再借阅,列出已锁定的学生名,可解除选定的学生,允许学生再借阅。 5. 系统配置 (1)图书馆基本配置设置系统:是否开放图书借阅,可设置可借出数量、借阅时间、续借次数、公告刷新时间,可重置为默认数据,修改配置方案。 (2)公告管理系统:公告列表,添加、修改、删除公告。 6. 数据管理 (1)管理员数据管理系统:浏览管理员详细资料(包括登陆次数,最后登陆时间,是否最高管理员)。 (2)学生数据管理系统:查询浏览学生详细资料(包括借阅次数,登陆次数,最后登陆时间)。 (3)图书借阅管理系统:可按书名、借阅学生查询借阅数据,显示已、没归还图书借阅数据信息,可清除已归还借阅信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值