flag = true;
break;
}
}
if (flag){
document.getElementById(“form”).submit();
}
}
}
}
接下来设置第一行的checkbox可以实现全选全不选,逻辑上只用保证所有的所有checkbox的checked属性与第一行相同即可
window.onload = function () {
// 第一行checkbox实现全选
document.getElementById(“firstCb”).onclick = function () {
var cbs = document.getElementsByName(“uid”);
for (var i = 0; i < cbs.length; i ++){
// 设置所有checkbox的状态与第一行相同
cbs[i].checked = this.checked;
}
}
}
7 分页查询功能
由于要实现分页查询,需要总记录数、总页码数、每一页的数据集合、当前的页码以及每一页显示的条目数等数据,所以最好用一个类的对象来保存这些数据,如下图所示
于是设计PageBean类来保存这些数据,相应的生成getter、setter及toString方法
package domin;
import java.util.List;
/**
- 分页对象
*/
public class PageBean {
private int totalCount; // 总记录数
private int totalPage; // 总页码
private List list; // 每页数据
private int currentPage;// 当前页码
private int rows; // 每页显示记录数
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
@Override
public String toString() {
return “PageBean{” +
“totalCount=” + totalCount +
“, totalPage=” + totalPage +
“, list=” + list +
“, currentPage=” + currentPage +
“, rows=” + rows +
‘}’;
}
}
实际上,服务器端只需接收到页面传过来的当前页码及每页显示的条目数即可得到所有的PageBean类的属性,具体如上图所示
实现分页查询并显示的设计如下图所示:
查询用户信息时,会自动调用后台 FindUserByPageServlet.java 程序,完成以下四个步骤:
-
接受请求参数 currentPage, rows
-
调用service层的 findUserByPage(currentPage, rows) 方法获取分页查询结果(PageBean类的对象)
-
将该对象存入request域中
-
转发至页面list.jsp展示
基于以上步骤,FindUserByPageServlet.java 的主要代码如下:
@WebServlet(“/findUserByPageServlet”)
public class FindUserByPageServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取参数
String currentPage = request.getParameter(“currentPage”);
String rows = request.getParameter(“rows”);
if (currentPage == null || “”.equals(currentPage)){
currentPage = “1”;
}
if (rows == null || “”.equals(rows)){
rows = “5”;
}
// 调用service查询
UserService service = new UserServiceImpl();
PageBean pb= service.findUserByPage(currentPage, rows);
// 将PageBean存入request
request.setAttribute(“pb”, pb);
// 转发到list.jsp
request.getRequestDispatcher(“/list.jsp”).forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
service层 UserServiceImpl.java 类定义findUserByPage(String _currentPage, String _rows)方法以供FindUserByPageServlet.java 调用,在这里要根据传入的当前页面和每页显示条目数来计算出其他所需要的值,具体分为以下七个步骤:
-
创建PageBean对象pb
-
设置pb的currentPage和rows属性
-
调用dao层的finTotalCount()方法查询总记录数totalCount
-
计算sql查询的起始数据位置 start = (currentPage - 1) * rows
-
调用dao层的findByPage(int start, int rows)方法查询用户集合
-
计算总页码,totalCount % rows 并向上取整
-
返回pb
基于以上步骤,UserServiceImpl.java 中添加方法代码如下:
@Override
public PageBean findUserByPage(String _currentPage, String _rows) {
int currentPage = Integer.parseInt(_currentPage);
int rows = Integer.parseInt(_rows);
// 创建PageBean对象
PageBean pb = new PageBean();
// 查询总记录数
int totalCount = dao.finTotalCount();
pb.setTotalCount(totalCount);
// 计算总页码
int totalPage = (totalCount % rows) == 0 ? (totalCount/rows) : (totalCount/rows) + 1;
pb.setTotalPage(totalPage);
// 设置参数
if (currentPage > totalPage)
currentPage = totalPage;
if (currentPage <= 0)
currentPage = 1;
pb.setCurrentPage(currentPage);
pb.setRows(rows);
// 调用dao查询List集合
int start = (currentPage - 1) * rows;
List list = dao.findByPage(start, rows);
pb.setList(list);
return pb;
}
该方法调用了dao层 UserDaoImpl.java 中查询数据库总数据数的finTotalCount()方法:
@Override
public int finTotalCount() {
String sql = “select count(*) from user”;
return template.queryForObject(sql, Integer.class);
}
还调用了dao层按照页面可展示用户数查询的findByPage(int start, int rows)方法:
@Override
public List findByPage(int start, int rows) {
String sql = “select * from user limit ? , ?”;
return template.query(sql, new BeanPropertyRowMapper<>(User.class), start, rows);
}
改造显示页面list.jsp
首先将循环取出每一条用户数据按行展示的jstl语句中foreach的items参数修改
items=“${pb.list}”
动态显示总记录数
共 p b . t o t a l C o u n t 条记录,共 {pb.totalCount}条记录,共 pb.totalCount条记录,共{pb.totalPage}页
动态修改导航栏个数,高亮当前页面,并绑定servlet
<c:forEach begin=“1” end=“${pb.totalPage}” var=“i”>
<c:if test=“${pb.currentPage == i}”>
- ${i}
</c:if>
<c:if test=“${pb.currentPage != i}”>
- ${i}
</c:if>
</c:forEach>
添加导航栏向左符号《 和 向右符号 》功能
<c:if test=“${pb.currentPage == 1}”>
</c:if>
<c:if test=“${pb.currentPage != 1}”>
</c:if>
«
<c:if test=“${pb.currentPage == pb.totalPage}”>
</c:if>
<c:if test=“${pb.currentPage != pb.totalPage}”>
</c:if>
»
完成分页查询后将 UpdateUserServlet.java 和 AddUserServlet.java 和 DelSelectedServlet.java 和delUserServlet.java 的重定向目标换成分页查询的servlet
8 复杂条件查询
由于根据条件查询所得的结果也要分页展示,所以仍需借助PageBean对象,如下图所示:
当用户点击查询按钮时,会传过来一个表单,这里表单一共有姓名、地址、email三个属性,但有可能用户只输入其中的几个,所以sql语句要动态的生成,如上图所示,如果用户输入了姓名和地址,那么查询总的条目数的模糊查询sql语句变为:
select count(*) from user where name like ? and address like ?;
同理,分页查询的sql语句为:
select * from user where name like ? and address like ? limit ?, ?;
改造list.jsp
给查询部分的表单添加action和method,action传入分页的servlet
注意表单中的input标签必须加上name属性,否则数据到不了服务器。
为了查询条件的回显,将查询输入框的value进行设置
分页导航在点击左右按钮或数字按钮是,要把可能存在的条件查询的条件name=KaTeX parse error: Undefined control sequence: \[ at position 16: {condition.name\̲[̲0\]}&address={condition.address[0]}&email=${condition.eamil[0]} 也加上
- ${i}
改造FindUserByPageServlet.java
添加获取条件查询的参数condition,condition如果为空,则表示默认查询,没有设置查询条件
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取参数
String currentPage = request.getParameter(“currentPage”);
String rows = request.getParameter(“rows”);
if (currentPage == null || “”.equals(currentPage)){
currentPage = “1”;
}
if (rows == null || “”.equals(rows)){
rows = “5”;
}
// 获取条件查询的参数
Map<String, String[]> condition = request.getParameterMap();
// 调用service查询
UserService service = new UserServiceImpl();
PageBean pb= service.findUserByPage(currentPage, rows, condition);
// 将PageBean存入request
request.setAttribute(“pb”, pb);
request.setAttribute(“condition”, condition); // 储存查询条件,用于回显
// 转发到list.jsp
request.getRequestDispatcher(“/list.jsp”).forward(request, response);
}
改造UserServiceImpl.java
其中的findUserByPage方法添加一个参数map,表示条件查询的条件,在方法里面调用UserDaoImpl类的操作数据库方法时,也多传入一个map参数
@Override
public PageBean findUserByPage(String _currentPage, String _rows, Map<String, String[]> condition) {
int currentPage = Integer.parseInt(_currentPage);
int rows = Integer.parseInt(_rows);
// 创建PageBean对象
PageBean pb = new PageBean();
// 查询总记录数
int totalCount = dao.finTotalCount(condition);
pb.setTotalCount(totalCount);
// 计算总页码
int totalPage = (totalCount % rows) == 0 ? (totalCount/rows) : (totalCount/rows) + 1;
pb.setTotalPage(totalPage);
// 设置参数
if (currentPage <= 0)
currentPage = 1;
if (currentPage > totalPage)
currentPage = totalPage;
pb.setCurrentPage(currentPage);
pb.setRows(rows);
// 调用dao查询List集合
int start = (currentPage - 1) * rows;
List list = dao.findByPage(start, rows, condition);
pb.setList(list);
return pb;
}
改造UserDaoImpl.java
动态生成sql语句,注意要排除分页条件参数 “currentPage” 和 “rows”
@Override
public int finTotalCount(Map<String, String[]> condition) {
// 定义模板sql
String sql = “select count(*) from user where 1=1”;
StringBuilder sb = new StringBuilder(sql);
// 遍历map
Set keySet = condition.keySet();
// 参数的集合
List params = new ArrayList<>();
for (String key : keySet) {
// 排除分页条件参数
if (“currentPage”.equals(key) || “rows”.equals(key))
continue;
String value = condition.get(key)[0];
if (value != null && !“”.equals(value)){
// 有值
sb.append(" and “+ key +” like ? ");
params.add(“%” + value + “%”); // 存储sql语句中 ? 的值
}
}
System.out.println(sb.toString());
System.out.println(params);
return template.queryForObject(sb.toString(), Integer.class,params.toArray());
}
findByPage(int start, int rows, Map condition)方法的实现类似于上面的实现,在这里没有将重复代码提取出一个单独的方法,大家可以自己完成一下
@Override
public List findByPage(int start, int rows, Map<String, String[]> condition) {
String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
// 遍历map
Set keySet = condition.keySet();
// 参数的集合
List params = new ArrayList<>();
for (String key : keySet) {
// 排除分页条件参数
if (“currentPage”.equals(key) || “rows”.equals(key))
continue;
String value = condition.get(key)[0];
if (value != null && !“”.equals(value)){
// 有值
sb.append(" and “+ key +” like ? ");
params.add(“%” + value + “%”); // 存储sql语句中 ? 的值
}
}
// 添加分页查询
sb.append(" limit ?,? ");
// 添加分页查询参数值
params.add(start);
params.add(rows);
sql = sb.toString();
System.out.println(sql);
System.out.println(params);
return template.query(sql, new BeanPropertyRowMapper<>(User.class), params.toArray());
}
9 登录功能
login.jsp页面
将表单的action设置为对应servlet程序的目录
验证码图片的src设置为对应servlet程序的目录
在javascript中定义刷新验证码的函数
function refreshCode() {
// 获取验证码图片对象
var vcode = document.getElementById(“vcode”);
// 设置src属性 加上时间戳
vcode.src = “${pageContext.request.contextPath}/checkCodeServlet?time=” + new Date().getTime();
}
验证码自动生成程序 CheckCodeServlet.java,网上有很多实例代码,这里只将其贴在这里
package web.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
- 验证码
*/
@WebServlet(“/checkCodeServlet”)
public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//服务器通知浏览器不要缓存
response.setHeader(“pragma”,“no-cache”);
response.setHeader(“cache-control”,“no-cache”);
response.setHeader(“expires”,“0”);
//在内存中创建一个长80,宽30的图片,默认黑色背景
//参数一:长
//参数二:宽
//参数三:颜色
int width = 80;
int height = 30;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = image.getGraphics();
//设置画笔颜色为灰色
g.setColor(Color.GRAY);
//填充图片
g.fillRect(0,0, width,height);
//产生4个随机验证码,12Ey
String checkCode = getCheckCode();
//将验证码放入HttpSession中
request.getSession().setAttribute(“CHECKCODE_SERVER”,checkCode);
//设置画笔颜色为黄色
g.setColor(Color.YELLOW);
//设置字体的小大
g.setFont(new Font(“黑体”,Font.BOLD,24));
//向图片上写入验证码
g.drawString(checkCode,15,25);
//将内存中的图片输出到浏览器
//参数一:图片对象
//参数二:图片的格式,如PNG,JPG,GIF
//参数三:图片输出到哪里去
ImageIO.write(image,“PNG”,response.getOutputStream());
}
/**
- 产生4位随机字符串
*/
private String getCheckCode() {
String base = “0123456789ABCDEFGabcdefg”;
int size = base.length();
Random r = new Random();
StringBuffer sb = new StringBuffer();
for(int i=1;i<=4;i++){
//产生0到size-1的随机值
int index = r.nextInt(size);
//在base字符串中获取下标为index的字符
char c = base.charAt(index);
//将c放入到StringBuffer中去
sb.append©;
}
return sb.toString();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
当用户点击登陆按钮时,自动跳转到后台 LoginServlet.java 程序, 完成以下几个步骤:
-
设置编码为"utf-8",防止中文乱码问题
-
获取用户输入的登陆数据map 及 输入的验证码
-
验证码校验
-
若校验成功则根据 map 封装用户,并调用service层的login(User user)方法查询是否登陆成功
-
若登陆成功则返回主页 index.jsp,失败返回登录页面 login.jsp
基于以上步骤,LoginServlet.java 程序的主要代码如下:
@WebServlet(“/loginServlet”)
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding(“utf-8”);
// 获取数据
String verifycode = request.getParameter(“verifycode”);
Map<String, String[]> map = request.getParameterMap();
// 封装User对象
User user = new User();
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 验证码校验
HttpSession session = request.getSession();
String checkcode_server = (String) session.getAttribute(“CHECKCODE_SERVER”);
session.removeAttribute(“CHECKCODE_SERVER”);
if (! checkcode_server.equalsIgnoreCase(verifycode)){
request.setAttribute(“login_msg”, “验证码错误”);
request.getRequestDispatcher(“/login.jsp”).forward(request, response);
return;
}
// 调用service查询
UserService service = new UserServiceImpl();
User loginUser = service.login(user);
// 判断是否成功
if (loginUser != null){
// 登陆成功
session.setAttribute(“user”, loginUser);
response.sendRedirect(request.getContextPath() + “/index.jsp”);
}else {
request.setAttribute(“login_msg”, “用户名或密码错误”);
request.getRequestDispatcher(“/login.jsp”).forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
service层 UserServiceImpl.java 类定义login(User user)方法以供 LoginServlet.java 调用:
@Override
public User login(User user){
return dao.findUserByUsernameAndPassword(user.getUsername(), user.getPassword());
}
该方法调用了dao层的findUserByUsernameAndPassword(String username, String password)判断能否根据用户名和密码找到该用户,如果无法找到即返回null
public User findUserByUsernameAndPassword(String username, String password){
try{
String sql = “select * from user where username = ? and password = ?”;
User user = template.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), username, password);
return user;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
10 添加过滤器进行登录验证
为了保证只有在登录的条件下才可以访问各个资源,需要添加 Filter 来进行验证,验证主要分为以下两步骤:
- 访问的是否是与登录相关的资源
-
是,则直接放行
-
否,则判断其是否登录
2. 判断是否已经登陆(Session中是否有User)
-
是,则放行
-
否,则跳转至登录页面
基于以上步骤,编写Filter代码如下:
package web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
- 登录验证的过滤器
*/
@WebFilter(“/*”)
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 强制转换
HttpServletRequest request = (HttpServletRequest) req;
// 获取资源请求路径
String uri = request.getRequestURI();
// 判断是否包含登录相关资源路径
// 要注意放行掉 css/js/图片/验证码等
if (uri.contains(“/login.jsp”) || uri.contains(“/loginServlet”) || uri.contains(“/css/”) || uri.contains(“/js/”) || uri.contains(“/fonts/”) || uri.contains(“/checkCodeServlet”)){
chain.doFilter(req, resp);
}else {
// 验证用户是否登陆
Object user = request.getSession().getAttribute(“user”);
if (user != null){
// 登陆了,放行
chain.doFilter(req, resp);
}else {
request.setAttribute(“login_msg”, “您尚未登陆,请登录”);
request.getRequestDispatcher(“login.jsp”).forward(request, resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
注意与登陆有关的资源不只是相应的.jsp页面和servlet,还有相关的css,js,字体,验证码等资源。
11 过滤敏感词汇
有些时候,用户可能会输入一些敏感词汇,我们需要将其和谐掉,然而request没有setAttribute的方法,所以可以使用代理的方式,创建一个新的request代理,增强网页中getParameter()方法,如果做了敏感词汇的河蟹,则放行新的request代理,否则,放行原先的request。
package web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
- 敏感词汇过滤器
*/
@WebFilter(“/*”)
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象,增强getParameter方法
ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后的内容
在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)
如何准备面试?
1、前期铺垫(技术沉积)
程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。
下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问
这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!
- Java程序员必看《Java开发核心笔记(华山版)》
- Redis学习笔记
- Java并发编程学习笔记
四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇
- Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)
- 大厂面试必问——数据结构与算法汇集笔记
其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。
2、狂刷面试题
技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。
①大厂高频45道笔试题(智商题)
②BAT大厂面试总结(部分内容截图)
③面试总结
3、结合实际,修改简历
程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)
如何准备面试?
1、前期铺垫(技术沉积)
程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。
下面是我会看的一些资料笔记,希望能帮助大家由浅入深,由点到面的学习Java,应对大厂面试官的灵魂追问
这部分内容过多,小编只贴出部分内容展示给大家了,见谅见谅!
- Java程序员必看《Java开发核心笔记(华山版)》
[外链图片转存中…(img-yOcAbAuv-1711443287787)]
- Redis学习笔记
[外链图片转存中…(img-Z816iTRj-1711443287787)]
- Java并发编程学习笔记
四部分,详细拆分并发编程——并发编程+模式篇+应用篇+原理篇
[外链图片转存中…(img-kYXyNW2N-1711443287788)]
- Java程序员必看书籍《深入理解 ava虚拟机第3版》(pdf版)
[外链图片转存中…(img-dDUzkldm-1711443287788)]
- 大厂面试必问——数据结构与算法汇集笔记
[外链图片转存中…(img-0AZAqcqH-1711443287788)]
其他像Spring,SpringBoot,SpringCloud,SpringCloudAlibaba,Dubbo,Zookeeper,Kafka,RocketMQ,RabbitMQ,Netty,MySQL,Docker,K8s等等我都整理好,这里就不一一展示了。
[外链图片转存中…(img-vs9Z9tvJ-1711443287788)]
2、狂刷面试题
技术主要是体现在平时的积累实用,面试前准备两个月的时间再好好复习一遍,紧接着就可以刷面试题了,下面这些面试题都是小编精心整理的,贴给大家看看。
①大厂高频45道笔试题(智商题)
[外链图片转存中…(img-kPOQjHfB-1711443287788)]
②BAT大厂面试总结(部分内容截图)
[外链图片转存中…(img-9zT2ZBMX-1711443287789)]
[外链图片转存中…(img-EeQ6M8mc-1711443287789)]
③面试总结
[外链图片转存中…(img-Y3yYSbA4-1711443287789)]
[外链图片转存中…(img-Pt0tbl3G-1711443287789)]
3、结合实际,修改简历
程序员的简历一定要多下一些功夫,尤其是对一些字眼要再三斟酌,如“精通、熟悉、了解”这三者的区别一定要区分清楚,否则就是在给自己挖坑了。当然不会包装,我可以将我的简历给你参考参考,如果还不够,那下面这些简历模板任你挑选:
[外链图片转存中…(img-KHKrIqpN-1711443287789)]
以上分享,希望大家可以在金三银四跳槽季找到一份好工作,但千万也记住,技术一定是平时工作种累计或者自学(或报班跟着老师学)通过实战累计的,千万不要临时抱佛脚。
另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!