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;
impo
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
rt 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为:
<%–?action=list表示打开BookServlet中的list方法–%>
3)在BookServlet里写上遍历的代码
private BookService bookService = new BookServiceImp();
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 通过BookService查询全部图书
List 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);
}
4)利用JSTL表达式修改pages/manager/book_manager.jsp 页面的数据遍历输出。众所周知,JSTL是为了替换jsp中的代码脚本而存在的。
- 导入
JSTL的jar包
taglibs-standard-impl-1.2.1.jartaglibs-standard-spec-1.2.1.jar
- 在
book_manager.jsp开头加上:
*<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- 利用
JSTL表达式修改原来的遍历函数
<c:forEach items="${requestScope.books}" var=“book”>
${book.name} ${book.price} ${book.author} ${book.sales} ${book.stock} 修改 删除</c:forEach>
- 因为此时的表单上传是
doGet请求,而之前在BaseServlet中只弄好了doPost请求,所以需要……在doGet请求里面调用doPost方法。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
在实际的代码书写中,不同的编程环境肯定会遇到很多的Bug,所以一定要学会解决Bug。
5.3.1 需求
系统会按照自己上传的图书信息(包括书名、作者等)达到添加图书的功能,同时,当添加完成后会自动刷新数据,显示添加的图书。
5.3.2 思路
实现思路图如下所示:

5.3.3 请求转发与重定向
1)请求转发
request.getRequestDispatcher(URL地址).forward(request, response)
处理流程:
客户端发送请求,Servlet做出业务逻辑处理;
Servlet调用forword()方法,服务器Servlet把目标资源返回给客户端浏览器。
2)重定向
response.sendRedirect(URL地址)
处理流程:
客户端发送请求,Servlet做出业务逻辑处理;
Servlet调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器;
客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
5.3.4 代码实现
1)BookServlet程序中添加add方法
private BookService bookService = new BookServiceImp();
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取请求的参数==封装成为Book对象
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//2 调用BookService.addBook()保存图书
bookService.addBook(book);
//3 跳到图书列表页面
//利用重定向而非请求转发来达到跳到图书列表页面的目的
//req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req, resp);
resp.sendRedirect(req.getContextPath() + “/manager/bookServlet?action=list”);
}
2)修改book_edit.jsp 页面
5.4.1 需求
可以根据自己点击删除某一本图书,同时在删除时给用户一个确认删除的界面,防止用户误删除。
5.4.2 思路
实现思路图如下所示:

5.4.3 代码实现
1)在BookServlet 程序中添加delete 方法
private BookService bookService = new BookServiceImp();
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取请求的参数id,图书编程
int id = WebUtils.parseInt(req.getParameter(“id”), 0);
//2 调用bookService.deleteBookById();删除图书
bookService.deleteBookById(id);
//3 重定向回图书列表管理页面
resp.sendRedirect(req.getContextPath() + “/manager/bookServlet?action=list”);
}
2)在WebUtils工具类中添加字符串转换成int类型数据的方法
/**
将字符串转换成为int类型的数据
@param strInt
@param defaultValue
@return
*/
public static int parseInt(String strInt,int defaultValue) {
try {
return Integer.parseInt(strInt);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
3)加入单击事件来防止用户误删除
<%–静态包含头内容–%>
<%–加入单击事件来防止用户误删除–%>
<%@include file="/pages/common/head.jsp"%>
5.5.1 需求
修改书城中图书的具体信息。
5.5.2 思路
实现思路图如下所示:

5.5.3 代码实现
1)更新【修改】的请求地址
修改 删除2)在BookServlet 程序中添加getBook 方法
private BookService bookService = new BookServiceImp();
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 获取请求的参数图书编号