先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
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
为:
<%–?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.jar
-
taglibs-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 需求
修改书城中图书的具体信息。
如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
rn confirm(“你确定要删除【” + $(this).parent().parent().find(“td:first”).text() + “】?”);
// return false// 阻止元素的默认行为===不提交请求
});
});
5.5.1 需求
修改书城中图书的具体信息。
如何快速更新自己的技术积累?
- 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
- 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
- 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
- 学习以后不知道有没有学成,则可以通过面试去检验。
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目
[外链图片转存中…(img-uupTVekS-1713615122072)]
[外链图片转存中…(img-zwjuQUy5-1713615122073)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-5iutpi0q-1713615122074)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!