Java书城项目第四阶段:图书模块,字节跳动架构师面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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);

}

}

3.3 编写BookDaoImpTest测试类


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));

}

}

4 编写Service服务层

=================================================================================

4.1 编写BookService接口


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);

}

4.2 编写BookServiceImp实现类


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);

}

}

4.3 编写BookServiceImpTest测试类


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);

}

}

}

5 编写Web层

===========================================================================

5.1 MVC概念


MVC 全称为Model 模型、View 视图、Controller 控制器。MVC 最早出现在JavaEE 三层中的Web 层,它可以有效的指导Web 层的代码如何有效分离,单独工作。

  • View 视图:只负责数据和界面的显示,不接受任何与显示数据无关的代码,便于程序员和美工的分工合作——JSP/HTML。

  • Controller 控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面(转到某个页面或者是重定向到某个页面),是一个“调度者”的角色——Servlet。

  • Model 模型:将与业务逻辑相关的数据封装为具体的JavaBean 类,其中不掺杂任何与数据处理相关的代码——JavaBean/domain/entity/pojo。

MVC 的理念是将软件代码拆分成为组件,单独开发,组合使用(目的还是为了降低耦合度)。在这里插入图片描述

5.2 遍历图书功能的实现


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中的代码脚本而存在的。

  1. 导入JSTLjar
  • taglibs-standard-impl-1.2.1.jar

  • taglibs-standard-spec-1.2.1.jar

  1. book_manager.jsp开头加上:

*<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

  1. 利用JSTL表达式修改原来的遍历函数

<c:forEach items=“${requestScope.books}” var=“book”>

${book.name} ${book.price} ${book.author} ${book.sales} ${book.stock} 修改 删除

</c:forEach>

  1. 因为此时的表单上传是doGet请求,而之前在BaseServlet中只弄好了doPost请求,所以需要……在doGet请求里面调用doPost方法。

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doPost(req,resp);

}

在实际的代码书写中,不同的编程环境肯定会遇到很多的Bug,所以一定要学会解决Bug。

5.3 添加图书功能的实现


5.3.1 需求

系统会按照自己上传的图书信息(包括书名、作者等)达到添加图书的功能,同时,当添加完成后会自动刷新数据,显示添加的图书。

5.3.2 思路

实现思路图如下所示:

在这里插入图片描述

5.3.3 请求转发与重定向

1)请求转发

request.getRequestDispatcher(URL地址).forward(request, response)

处理流程:

  1. 客户端发送请求,Servlet做出业务逻辑处理;

  2. Servlet调用forword()方法,服务器Servlet把目标资源返回给客户端浏览器。

2)重定向

response.sendRedirect(URL地址)

处理流程:

  1. 客户端发送请求,Servlet做出业务逻辑处理;

  2. Servlet调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器;

  3. 客户端浏览器重新访问服务器资源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 删除图书功能的实现


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 修改图书功能的实现


5.5.1 需求

修改书城中图书的具体信息。

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

rn confirm(“你确定要删除【” + $(this).parent().parent().find(“td:first”).text() + “】?”);

// return false// 阻止元素的默认行为===不提交请求

});

});

5.5 修改图书功能的实现


5.5.1 需求

修改书城中图书的具体信息。

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

[外链图片转存中…(img-uupTVekS-1713615122072)]

[外链图片转存中…(img-zwjuQUy5-1713615122073)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5iutpi0q-1713615122074)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值