项目学习 —— 图书商城后台管理

查询、修改、删除数据库中数据。

一. 创建数据库和表 

 在数据库studyproject下创建一个book表

CREATE TABLE `studyproject`.`book` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `bookname` VARCHAR(45),
  `price` DECIMAL(11,2),
  `author` VARCHAR(45),
  `sale` INT,
  `stock` INT,
  `img` VARCHAR(45),
  PRIMARY KEY (`id`));

insert into book(id, bookname, author, price, sale, stock, img)
values(null , '数据结构与算法' , '严敏君' , 58.5 , 6 , 13 , 'static/img/default.jpg');

insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'Java从入门到精通' , '清华' , 78.9 , 80 , 20 , 'static/img/default.jpg');

insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'C++编程思想' , 'Bruce' , 45.5 , 14 , 95 , 'static/img/default.jpg');

insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'JavaScript高级程序设计' , '李松峰' , 98.8, 12 , 53 , 'static/img/default.jpg');

insert into book(id, bookname, author, price, sale, stock, img)
values(null , 'python编程' , '袁国忠' , 69.8, 73 , 135 , 'static/img/default.jpg');

二. 编写book表对应的JavaBean对象

        在pojo包下创建Book类

package server.pojo;

import java.math.BigDecimal;

public class Book {
    private Integer id;
    private String bookname;
    private BigDecimal price;
    private String author;
    private Integer sale;
    private Integer stock;
    private String img = "static/img/default.jpg";

    public Book() {
    }

    public Book(Integer id, String bookname, BigDecimal price, String author, Integer sale, Integer stock, String img) {
        this.id = id;
        this.bookname = bookname;
        this.price = price;
        this.author = author;
        this.sale = sale;
        this.stock = stock;
        //要求给定的图书封面图片路径不能为空
        if(img != null && !"".equals(img)){
            this.img = img;
        }
    }

    public Integer getId() {
        return id;
    }

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

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

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

    public Integer getSale() {
        return sale;
    }

    public void setSale(Integer sale) {
        this.sale = sale;
    }

    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }

    public String getImg() {
        return img;
    }

    public void setImg(String img) {
        if(img != null && !"".equals(img)){
            this.img = img;
        }
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookname='" + bookname + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                ", sale=" + sale +
                ", stock=" + stock +
                ", img='" + img + '\'' +
                '}';
    }
}

三. Dao —— 操作数据库

1. 在dao包下编写BookDao接口

package server.dao;

import server.pojo.Book;

import java.util.List;

public interface BookDao {
    public int addBook(Book book);

    public int deleteBookById(Integer id);

    public int updateBook(Book book);

    public Book queryBookById(Integer id);

    public List<Book> queryBooks();
}

2. 在dao.impl包下编写一个BookDaoImpl类,继承BaseDao类并实现BookDao接口

package server.dao.impl;

import server.dao.BookDao;
import server.pojo.Book;

import java.util.List;

public class BookDaoImpl extends BaseDao implements BookDao {
    @Override
    public int addBook(Book book) {
        String sql = "insert into book(bookname, price, author, sale, stock, img) values(?,?,?,?,?,?)";
        return updateData(sql,book.getBookname(),book.getPrice(),book.getAuthor(),book.getSale(),book.getStock(),book.getImg());
    }

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

    @Override
    public int updateBook(Book book) {
        String sql = "update book set bookname=?, price=?, author=?, sale=?, stock=?, img=? where id=?";
        return updateData(sql,book.getBookname(),book.getPrice(),book.getAuthor(),book.getSale(),book.getStock(),book.getImg(),book.getId());
    }

    @Override
    public Book queryBookById(Integer id) {
        String sql = "select * from book where id = ?";
        return queryOneData(Book.class, sql, id);
    }

    @Override
    public List<Book> queryBooks() {
        String sql = "select * from book";
        return queryList(Book.class, sql);
    }
}

四. Service层

1. 在Service包下编写BookService接口

package server.service;

import server.pojo.Book;

import java.util.List;

public interface BookService {
    public void addBook(Book book);

    public void deleteBookById(Integer id);

    public void updateBook(Book book);

    public Book queryBookById(Integer id);

    public List<Book> queryBooks();
}

2. 在service.impl包下编写BookServiceImpl类来实现BookService接口。

package server.service.impl;

import server.dao.BookDao;
import server.dao.impl.BookDaoImpl;
import server.pojo.Book;
import server.service.BookService;

import java.util.List;

public class BookServiceImpl implements BookService {
    private 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();
    }
}

五. Web层 —— 实现Servlet程序

实现的功能:①运行web工程,首先进入index.jsp页面,该页面具有进入登录(login.jsp)、注册(regist.jsp)、后台管理(manager.jsp)页面的功能;

②点击后台管理,进入manager.jsp页面,该页面具有进入图书管理页面(book_manager.jsp)的功能;

③点击图书管理准备进入图书管理页面时,首先调用BookServlet程序的list方法,将数据库中的所有图书信息显示在book_manager.jsp页面;

④book_manager.jsp页面会显示所有图书信息,还具有删除、添加、修改图书的功能;

⑤点击book_manager.jsp页面的删除时,会调用BookServlet程序的delete方法删除对应的图书,删除后会显示book_manager.jsp页面,发现已经没有被删除的图书信息了;

⑥点击book_manager.jsp页面的添加和修改图书操作会跳转到book_edit.jsp页面来执行,因此需要在a标签里带有一个method值来告诉book_edit.jsp的隐藏域要执行的是添加还是修改操作;

⑦当点击book_manager.jsp页面的添加操作时,跳转到book_edit.jsp页面,然后在该页面上输入信息,会调用BookServlet程序的add方法添加图书,添加完之后会显示book_manager.jsp页面,发现已经有了添加的图书信息;

⑧当点击book_manager.jsp页面的修改操作时,跳转到book_edit.jsp页面,当进入该页面时,会调用BookServlet程序的getBook()方法将要修改的图书的原始信息显示在该页面,以用于修改;然后在该页面上修改要修改的信息,会调用BookServlet程序的update方法添加图书,添加完之后会显示book_manager.jsp页面,发现已经有了修改后的图书信息;

1. 编写BookServlet程序来实现上述功能

package server.web;

import server.pojo.Book;
import server.service.BookService;
import server.service.impl.BookServiceImpl;
import server.utils.WebUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

@WebServlet("/manager/bookServlet")
public class BookServlet extends BaseServlet{
    private BookService bookService = new BookServiceImpl();

    protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过BookService查询全部书
        List<Book> books = bookService.queryBooks();
        //把全部图书保存到Request域中
        req.setAttribute("books",books);
        //请求转发到/pages/manager/book_manager.jsp页面
        req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
    }

    protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的id
        String id = req.getParameter("id");
        //调用BookService类的deleteBookById()方法删除对应的图书
        bookService.deleteBookById(Integer.parseInt(id));
        //重定向到图书列表页面
        resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
    }
    
    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的参数
        Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
        //调用BookService类的addBook()方法保存图书
        bookService.addBook(book);
        //重定向到图书列表页面
        resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
    }
    
    protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的参数(图书id)
        String id = req.getParameter("id");
        //调用BookService类的queryBookById()方法查询图书
        Book book = bookService.queryBookById(Integer.parseInt(id));
        //保存图书到Request作用域中
        req.setAttribute("book",book);
        //请求转发到/pages/manager/book_edit.jsp页面
        req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
    }

    protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求的参数
        Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
        //调用BookService类的updateBook()方法修改图书信息
        bookService.updateBook(book);
        //重定向到图书列表页面
        resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
    }
}

2. 编写前端页面

①index.jsp页面:有登录、注册、进入到后台管理页面的功能 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core_1_1" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
    <%    //获取当前工程的路径
        String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
    %>
    <base href="<%=basePath%>">
</head>
<body>
    <%-- 如果用户还没有登录,显示登录和注册菜单--%>
    <c:if test="${empty sessionScope.user}">
        <a href="pages/user/login.jsp"><input type = "button" value = "登录"/></a>
        <a href="pages/user/regist.jsp"><input type = "button" value = "注册"/></a>
    </c:if>
    <%-- 如果用户已经登录,显示欢迎用户和注销--%>
    <c:if test="${not empty sessionScope.user}">
        欢迎${sessionScope.user.username}
        <a href="userServlet?action=logout"><input type = "button" value = "注销"/></a>
        <a href="pages/manager/manager.jsp"><input type = "button" value = "后台管理"/></a>
    </c:if>
</body>
</html>

②manager.jsp页面:进入到图书管理节面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
	<title>后台管理</title>
	<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div>
	<h1>欢迎管理员进入后台管理系统</h1>
	<a href="manager/bookServlet?action=list">图书管理</a>
	<a href="index.jsp">返回首页</a>
</div>
</body>
</html>

③book_manager.jsp页面:将list方法中获取的数据库中的图书信息显示在表格中,并且具有删除功能,能够进入到book_edit.jsp页面来对图书信息进行添加和修改

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
	<title>图书管理</title>
	<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>

<div align="center">图书管理系统</div>

<table border = "1" width = "600" height = "300" cellspacing = "0" cellpadding = "10" align="center">
	<tr align = "center" >
		<td>名称</td>
		<td>价格</td>
		<td>作者</td>
		<td>销量</td>
		<td>库存</td>
		<td colspan="2">操作</td>
	</tr>

	<c:forEach items="${requestScope.books}" var="book">
		<tr align = "center">
			<td>${book.bookname}</td>
			<td>${book.price}</td>
			<td>${book.author}</td>
			<td>${book.sale}</td>
			<td>${book.stock}</td>
			<td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update">修改</a></td>
			<td><a href="manager/bookServlet?action=delete&id=${book.id}" onclick="return (confirm('确定删除吗?'));">删除</a></td>
		</tr>
	</c:forEach>

	<tr align = "right">
		<td colspan="7"><a href="pages/manager/book_edit.jsp?method=add">添加图书</a></td>
	</tr>
</table>
</body>
</html>

④book_edit.jsp页面:用来修改图书信息和添加新的图书

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
	<title>编辑图书</title>
	<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
		<div align="center">编辑图书</div>
		
		<div align="center">
			<form action="manager/bookServlet" method="post">
				<input type="hidden" name="action" value="${param.method}">
				<input type="hidden" name="id" value="${requestScope.book.id}">
				<table>
					<tr>
						<td>名称</td>
						<td>价格</td>
						<td>作者</td>
						<td>销量</td>
						<td>库存</td>
						<td colspan="2">操作</td>
					</tr>		
					<tr>
						<td><input type="text" name="bookname" value="${requestScope.book.bookname}"/></td>
						<td><input type="text" name="price" value="${requestScope.book.price}"/></td>
						<td><input type="text" name="author" value="${requestScope.book.author}"/></td>
						<td><input type="text" name="sale" value="${requestScope.book.sale}"/></td>
						<td><input type="text" name="stock" value="${requestScope.book.stock}"/></td>
						<td><input type="submit" value="提交"/></td>
					</tr>	
				</table>
			</form>
		</div>
</body>
</html>
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值