MVC 全称:Model 模型、 View 视图、 Controller 控制器。
MVC 最早出现在 JavaEE 三层中的 Web 层,它可以有效的指导 Web 层的代码如何有效分离,单独工作。
View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作—— JSP/HTML。
Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个“调度者”的角色——Servlet。 转到某个页面。或者是重定向到某个页面。
Model 模型:将与业务逻辑相关的数据封装为具体的 JavaBean 类,其中不掺杂任何与数据处理相关的代码—— JavaBean/domain/entity/pojo。
MVC 是一种思想 MVC 的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k9hOrzfy-1668346966031)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220505205517911.png)]](https://1000bd.com/contentImg/2024/04/23/eb483ba148a3bac9.png)
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)
);
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');
public class Book {
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";
public String getImgPath() {
//要求图书封面路径不为空
if(imgPath!=null &&!"".equals(imgPath)) {
this.imgPath = imgPath;
}
return imgPath;
}
Dao 接口
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();
}
BookDaoImpl 实现类:
import my.book.dao.BookDao;
import my.book.pojo.Book;
import java.util.List;
public class BookDaoImpl extends BaseDao implements BookDao {
@Override
public int addBook(Book book) {
String sql = "insert into t_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 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` imgPath from t_book where id = ?";
return queryForOne(Book.class, sql,id);
}
@Override
public List<Book> queryBooks() {
String sql = "select `id` , `name` , `author` , `price` , `sales` , `stock` , `img_path` imgPath from t_book";
return queryForList(Book.class, sql);
}
}
BookService 接口
import my.book.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();
}
BookServiceImpl 实现类
import my.book.dao.BookDao;
import my.book.dao.impl.BookDaoImpl;
import my.book.pojo.Book;
import my.book.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();
}
}
BookService 的测试
public class BookServiceTest {
private BookService bookService=new BookServiceImpl();
@Test
public void addBook() {
bookService.addBook(new Book(null,"我为什么这么帅!", "191125", new BigDecimal(9999),1100000,0,null
));
}
@Test
public void deleteBookById() {
bookService.deleteBookById(23);
}
@Test
public void updateBook() {
bookService.updateBook(new Book(21,"大家都可以这么帅!", "国哥", new BigDecimal(9999),1100000,0,null
));
}
@Test
public void queryBookById() {
System.out.println( bookService.queryBookById(21) );
}
@Test
public void queryBooks() {
for (Book queryBook : bookService.queryBooks()) {
System.out.println(queryBook);
}
}
}
1、图解列表功能流程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R3N0E4nl-1668346966033)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506171513281.png)]](https://1000bd.com/contentImg/2024/04/23/eb3e8e2cdc4ed89e.png)
2、BookServlet 程序中添加 list
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
//1 通过 BookService 查询全部图书
List<Book> books = bookService.queryBooks();
//2 把全部图书保存到 Request 域中
req.setAttribute("books", books);
//3、请求转发到/pages/manager/book_manager.jsp 页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
3、修改【图书管理】请求地址
manager_menu.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
4、修改 pages/manager/book_manager.jsp 页面的数据遍历输
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gqe9to5U-1668346966034)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506171955647.png)]](https://1000bd.com/contentImg/2024/04/23/fa4c7c5d2410a8f3.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CJGM8TdL-1668346966035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506172044870.png)]](https://1000bd.com/contentImg/2024/04/23/06a12f017592e78b.png)
1、添加图书流程细节:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eebi5yIv-1668346966035)(C:\Users\庞继豪\AppData\Roaming\Typora\typora-user-images\image-20220506172118645.png)]](https://1000bd.com/contentImg/2024/04/23/421db8c54e77d06e.png)
2、问题说明:表单重复提交:
// /manager/bookServlet?action=list
//会出现bug,用户刷新就会在一次添加
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
//用重对象
resp.sendRedirect(req.getContextPath()+"/manager/bookServlet?action=list");
当用户提交完请求,浏览器会记录下最后一次请求的全部信息。当用户按下功能键 F5,就会发起浏览器记录的最后一次 请求。
3、BookServlet 程序中添加 add 方法:
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取请求的参数==封装为book对象
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//2、调用bookService.add保存图书
bookService.addBook(book);
//3、跳到图书列表页面
// /manager/bookServlet?action=list
//会出现bug,用户刷新就会在一次添加
// req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
//用重对象
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=list");
}
4、修改 book_edit.jsp