-
5.2.2 思路
-
5.2.3 代码实现
-
5.3 添加图书功能的实现
-
- 5.3.1 需求
-
5.3.2 思路
-
5.3.3 请求转发与重定向
-
5.3.4 代码实现
-
5.4 删除图书功能的实现
-
- 5.4.1 需求
-
5.4.2 思路
-
5.4.3 代码实现
-
5.5 修改图书功能的实现
-
- 5.5.1 需求
-
5.5.2 思路
-
5.5.3 代码实现
-
6 演示
=======================================================================
这一阶段的内容是第二阶段用户登录模块的拓展,进一步学习了项目中最常用的遍历、增、删、改、查。
需要的界面如下图所示,通过点击页面上的修改、删除或者添加图书,可以实现我们功能。
========================================================================
#下面就是为了创建图书模块的数据库
create table 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)
);
插入初始化测试数据
insert into book(id
, name
, author
, price
, sales
, stock
, img_path
)
values(null , ‘java从入门到放弃’ , ‘sharm’ , 80 , 9999 , 9 , ‘static/img/default.jpg’);
insert into book(id
, name
, author
, price
, sales
, stock
, img_path
)
values(null , ‘数据结构与算法’ , ‘sharm’ , 78.5 , 6 , 13 , ‘static/img/default.jpg’);
insert into book(id
, name
, author
, price
, sales
, stock
, img_path
)
values(null , ‘Java编程思想’ , ‘sharm’ , 99.5 , 47 , 36 , ‘static/img/default.jpg’);
insert into book(id
, name
, author
, price
, sales
, stock
, img_path
)
values(null , ‘操作系统原理’ , ‘sharm’ , 133.05 , 122 , 188 , ‘static/img/default.jpg’);
insert into book(id
, name
, author
, price
, sales
, stock
, img_path
)
values(null , ‘大话设计模式’ , ‘sharm’ , 89.15 , 20 , 10 , ‘static/img/default.jpg’);
查看表内容
select id,name,author,price,sales,stock,img_path from book;
在pojo包
下新建Book.java
作为上表所对应的JavaBean
对象。
import java.math.BigDecimal;
public class Book {
//1 首先是定义变量
//Integer可以为null,而int不能为null
private Integer id;
private String name;
private String author;
private BigDecimal price;
private Integer sales;
private Integer stock;
private String imgPath = “static/img/default.jpg”;
//2 接下来是无参构造函数
public Book(){
}
//3 接下来是有参构造函数
public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String imgPath) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
this.sales = sales;
this.stock = stock;
// 要求给定的图书封面图书路径不能为空
if (imgPath != null && !“”.equals(imgPath)) {
this.imgPath = imgPath;
}
}
//4 然后是getter与setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getSales() {
return sales;
}
public void setSales(Integer sales) {
this.sales = sales;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
// 要求给定的图书封面图书路径不能为空
if (imgPath != null && !“”.equals(imgPath)) {
this.imgPath = imgPath;
}
}
//5 最后是重写同toString方法
@Override
public String toString() {
return “Book{” +
“id=” + id +
“, name='” + name + ‘’’ +
“, author='” + author + ‘’’ +
“, price=” + price +
“, sales=” + sales +
“, stock=” + stock +
“, imgPath='” + imgPath + ‘’’ +
‘}’;
}
}
=============================================================================
在BaseDao
这一父类的基础上通过实现BookDao接口
所约束的方法来进行BookDaoImp类
的编写。
import sharm.pojo.Book;
import java.util.List;
/**
- 这个接口约束了图书管理中的遍历、增、删、改功能
*/
public interface BookDao {
public List queryBooks();
public int addBook(Book book);
public int deleteBookById(Integer id);
public int updateBook(Book book);
public Book queryBookById(Integer id);
}
import sharm.dao.BookDao;
import sharm.pojo.Book;
import java.util.List;
public class BookDaoImp extends BaseDao implements BookDao {
@Override
public List queryBooks() {
String sql = “select id
, name
, author
, price
, sales
, stock
, img_path
imgPath from book”;
return queryForList(Book.class, sql);
}
@Override
public int addBook(Book book) {
String sql = “insert into book(name
,author
,price
,sales
,stock
,img_path
) values(?,?,?,?,?,?)”;
return update(sql, book.getName(), book.getAuthor(), book.getPrice(), book.getSales(), book.getStock(), book.getImgPath());
}
@Override
public int deleteBookById(Integer id) {
String sql = “delete from book where id = ?”;
return update(sql, id);
}
@Override
public int updateBook(Book book) {
String sql = “update 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
imgPath from book where id = ?”;
return queryForOne(Book.class, sql, id);
}
}
在IDEA
中,在对应的接口上点击ctrl+shift+t
,可以直接生成测试类。
import sharm.dao.BookDao;
import sharm.dao.impl.BookDaoImp;
import sharm.pojo.Book;
import java.math.BigDecimal;
import static org.junit.Assert.*;
public class BookDaoTest {
//多态 左边是接口,右边是实现类
private BookDao bookDao = new BookDaoImp();
@Test
public void queryBooks() {
for (Book queryBook : bookDao.queryBooks()) {
System.out.println(queryBook);
}
}
@Test
public void addBook() {
bookDao.addBook(new Book(null,“坚持”, “sharm”, new BigDecimal(13),13,0,null));
}
@Test
public void deleteBookById() {
bookDao.deleteBookById(3);
}
@Test
public void updateBook() {
bookDao.updateBook(new Book(4,“人生”, “sharm”, new BigDecimal(9999),1100000,0,null));
}
@Test
public void queryBookById() {
System.out.println( bookDao.queryBookById(4));
}
}
=================================================================================
import sharm.pojo.Book;
import java.util.List;
/**
- 此时Service的业务层的具体业务刚好与Dao层相同
*/
public interface BookService {
public List queryBooks();
public void addBook(Book book);
public void deleteBookById(Integer id);
public void updateBook(Book book);
public Book queryBookById(Integer id);
}
import sharm.dao.BookDao;
import sharm.dao.impl.BookDaoImp;
import sharm.pojo.Book;
import sharm.service.BookService;
import java.util.List;
public class BookServiceImp implements BookService {
//依旧多态
private BookDao bookdao=new BookDaoImp();
@Override
public List queryBooks() {
return bookdao.queryBooks();
}
@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);
}
}
import sharm.pojo.Book;
import sharm.service.BookService;
import sharm.service.impl.BookServiceImpl;
import org.junit.Test;
import java.math.BigDecimal;
import static org.junit.Assert.*;
public class BookServiceTest {
private BookService bookService = new BookServiceImpl();
@Test
public void addBook() {
bookService.addBook(new Book(null,“人生”, “1125”, new BigDecimal(1000000), 100000000, 0, null));
}
@Test
public void deleteBookById() {
bookService.deleteBookById(3);
}
@Test
public void updateBook() {
bookService.updateBook(new Book(2,“生活”, “1125”, new BigDecimal(999999), 10, 111110, null));
}
@Test
public void queryBookById() {
System.out.println(bookService.queryBookById(2));
}
@Test
public void queryBooks() {
for (Book queryBook : bookService.queryBooks()) {
System.out.println(queryBook);
}
}
}
===========================================================================
MVC
全称为Model
模型、View
视图、Controller
控制器。MVC
最早出现在JavaEE
三层中的Web
层,它可以有效的指导Web
层的代码如何有效分离,单独工作。
-
View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作——JSP/HTML。
-
Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面(转到某个页面或者是重定向到某个页面),是一个“调度者”的角色——Servlet。
-
Model 模型:将与业务逻辑相关的数据封装为具体的JavaBean 类,其中不掺杂任何与数据处理相关的代码——JavaBean/domain/entity/pojo。
MVC
的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。
5.2.1 需求
当我们点击主页上的后台管理-图书管理时,网页上需要出现目前书城所有书的列表。
5.2.2 思路
当点击图书管理时,我们不能直接将其链接到展示列表网页的manager.jsp
中,因为该jsp
是没有图书信息的,图书信息在我们的后端数据库中,正确的方法应该是当点击图书管理时,将其链接到Web
层的BookServlet
程序中,让Web
层从数据库中拿到数据,然后将数据保存到Request域
中,并将其转发到展示列表网页的manager.jsp
。完整步骤如下所示:
介绍一下实际工程中的前台与后台。
5.2.3 代码实现
1)在web
层新建BookServlet
,同时在web.xml
加入前端与后台Servlet
程序的映射文件
BookServlet
sharm.web.BookServlet
BookServlet
/manager/bookServlet
2)修改【图书管理】请求地址
打开common
包的manager_menu.jsp
文件,修改图书管理的href
为:
最后
Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
5.2.3 代码实现
1)在web
层新建BookServlet
,同时在web.xml
加入前端与后台Servlet
程序的映射文件
BookServlet
sharm.web.BookServlet
BookServlet
/manager/bookServlet
2)修改【图书管理】请求地址
打开common
包的manager_menu.jsp
文件,修改图书管理的href
为:
最后
Java架构学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-stcPwn0e-1714339395295)]