1、MVC的概念
MVC 全称: Modle 模型、 View 视图、 Controller 控制器。
MVC 最早出现在 JavaEE 三层中的 Web层,它可以有效的指导 Web层 的代码如何有效分离,单独工作。
View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作 ---- JSP/HTML。
Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个 “调度者” 的角色 ----- Servlet。
转到某个页面,或者重定向到某个页面。
Model 模型:将与 业务逻辑相关的数据 封装为具体的 JavaBean 类,其中不掺杂任何与数据处理相关的代码 ----- JavaBean/domain/entity/pojo
MVC 是一种思想
MVC 的理念是将软件代码拆分成组件,单独开发,组合使用(目的还是为了解耦合)
MVC 的作用是为了降低耦合,让代码合理分层。方便后期升级和维护
2、图书模块
2.1、编写图书模块的数据库表
2.2、编写图书模块的 JavaBean
public class Book {
private Integer id;
private String name;
private String author;
private BigDecimal price;
private Integer sales;
private Integer stock;
private String img_path="static/img/default.jpg";
}
其中
2.3、编写图书模块的 Dao 和 测试 Dao
package com.aiguigu.dao;
import com.aiguigu.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();
}
测试
在 BookDao 接口界面 按 ctrl + shift +T 创建测试类
package com.aiguigu.test;
import com.aiguigu.dao.BookDao;
import com.aiguigu.dao.impl.BookDaoImpl;
import com.aiguigu.pojo.Book;
import org.junit.Test;
import javax.swing.text.html.parser.Entity;
import java.math.BigDecimal;
import java.util.List;
import static org.junit.Assert.*;
public class BookDaoTest {
BookDao bookDao = new BookDaoImpl();
@Test
public void addBook() {
bookDao.addBook(new Book(null,"测试","测试",new BigDecimal(199),1000,1000,null));
}
@Test
public void deleteBookById() {
}
@Test
public void updateBook() {
bookDao.updateBook(new Book(24,"测试3","测试3",new BigDecimal(199),1000,1000,null));
}
@Test
public void queryBookByid() {
System.out.println(bookDao.queryBookByid(2));
}
@Test
public void queryBooks() {
for(Book queryBook : bookDao.queryBooks()){
System.out.println(queryBook);
}
}
}
运行结果
2.4、编写图书模块的 Service 和 测试Service
package com.aiguigu.service;
import com.aiguigu.pojo.Book;
import java.util.List;
public interface BookService {
public void addBook(Book book);
public void deleteBook(Integer id);
public void updateBook(Book book);
public Book queryBookById(Integer id);
public List<Book> queryBook();
}
测试
package com.aiguigu.test;
import com.aiguigu.pojo.Book;
import com.aiguigu.service.BookService;
import com.aiguigu.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,"service层测试","service",new BigDecimal(1100),100,100,null));
}
@Test
public void deleteBook() {
bookService.deleteBook(1);
}
@Test
public void updateBook() {
bookService.updateBook(new Book(25,"service层测试2","service2",new BigDecimal(1100),100,100,null));
}
@Test
public void queryBookById() {
System.out.println(bookService.queryBookById(25));
}
@Test
public void queryBook() {
for (Book book : bookService.queryBook()) {
System.out.println(book);
}
}
}
2.5、编写图书模块的 Web层,和页面联调测试
2.5.1、图书列表功能实现
分析:
tip:先将数据库里的图书信息 搜索出来,才可以进行增删改操作,所以先做 list() 功能。
jsp 页面无法直接访问数据库,得先通过 Servlet ,Servlet调用 Service层,拿到数据,将数据发送到 request 域中,jsp页面从 request域 获取数据 ,通过 _JSTL库遍历出来显示在jsp页面上
代码实现:
- 在 manager_menu.jsp 页面中 修改 图书管理的a标签跳转界面,跳转到manager/bookServlet
<a href="manager/bookServlet?action=list">图书管理</a>
- 在BookServlet 实现
(1)查询全部图书
(2)保存到Request域中
(3)请求转发到pages/manager.jsp 页面
tip:BookServlet得配置 web.xml 文件,路径为:manager/bookServlet
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.通过BookService 查询全部图书
List<Book> books = bookService.queryBook();
//2.把全部图书保存到 Request 域中
req.setAttribute("books",books);
//3.请求转发到 /pages/manager/book_manager.jsp 页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
- 在 manager.jsp 页面 展示所有图书
(1)从Request域中获取全部图书信息
(2)使用JSTL标签库遍历输出
这里要导入JSTL标签库包才能使用
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${requestScope.books}" var="books">
<tr>
<td>${books.name}</td>
<td>${books.price}</td>
<td>${books.author}</td>
<td>${books.sales}</td>
<td>${books.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${books.id}">修改</a></td>
<td><a class="deleteClass" href="manager/bookServlet?action=delete&id=${books.id}">删除</a></td>
</tr>
</c:forEach>
- 最后运行时发现还是无法访问,是以为,a标签默认用 get请求,而BaseServlet 重写的是 doPost()方法,解决:
在BaseServlet重写 doGet()方法,在doGet()方法里执行 doPost()方法即可
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
}