最新Java书城项目第三阶段:优化,java面试基础笔试题

总结

三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。

  • 第一个是算法

关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。

而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本

《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

《算法的乐趣》共有23个章节:

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)

基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

  • 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)

最新出炉,头条三面技术四面HR,看我如何一步一步攻克面试官?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//同时提示用户,是哪个地方出现问题

request.setAttribute(“msg”,“用户名或者密码错误”);

request.setAttribute(“username”,username);

这个时候通过静态转发可以将request域中的数据返回给前端。

类似的,可以把登录的静态转发也写起来。

4 Servlet程序的融合与抽取

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

1)在实际的项目开发中,一个模块最好只使用一个Servlet 程序,而用户的登录和注册应该属于用户这个模块。所以合并LoginServlet 和RegistServlet 程序为UserServlet程序。其中是登录还是注册逻辑通过判断来决定;

在这里插入图片描述

修改后的UserServlet程序如下所示:

public class UserServlet extends HttpServlet{

//哈哈哈,同dao层之于service层一样,service层之于web层也是这样操作

private UserServiceImp userServiceImp=new UserServiceImp();

protected void doRegist(HttpServletRequest request, HttpServletResponse response) throws Exception{

//1 获取请求的参数

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

String email = request.getParameter(“email”);

String code = request.getParameter(“code”);

//用来测试使用BeanUtils这个第三方jar包来封装数据

WebUtils.copyParamToBean(request.getParameterMap(),new User());

//System.out.println(username); 验证表单成功上传到Servlet服务器

//2 优先级最高的是验证码,首先判断验证码是否正确(这里我把验证码规定死为1234)

if(“1234”.equalsIgnoreCase(code)){

//3 判断用户名是否存在(由于用户名、密码、邮箱的格式我在Jquery中有判断,所以不需要在servlet服务器中再判断)

if (userServiceImp.existsUsername(username)) {

System.out.println(“该用户名[”+username+“]已经存在,请重新注册”);

// 把回显信息,保存到Request域中

request.setAttribute(“msg”, “用户名已存在!!”);

request.setAttribute(“username”, username);

request.setAttribute(“email”, email);

//跳回注册页面 其中的“/”表示的是web这个目录

RequestDispatcher requestDispatcher=request.getRequestDispatcher(“/pages/user/regist.jsp”);

requestDispatcher.forward(request,response);

} else {

//则将注册信息保存到数据库

//从属性到对象,用的是new User(属性1,属性2)

//从对象到属性,用的是User.get的方法

userServiceImp.registUser(new User(null,username,password,email));

request.getRequestDispatcher(“/pages/user/regist_success.jsp”).forward(request, response);

}

}else{

// 把回显信息,保存到Request域中

request.setAttribute(“msg”, “验证码错误!!”);

request.setAttribute(“username”, username);

request.setAttribute(“email”, email);

System.out.println(“验证码[” + code + “]错误”);

request.getRequestDispatcher(“/pages/user/regist.jsp”).forward(request, response);

}

}

protected void doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{

// 1 获取请求的参数

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

// 2 调用userService.login()登录处理业务

User loginUser = userServiceImp.login(new User(null, username, password, null));

// 如果等于null,说明登录失败!

if (loginUser == null) {

//同时提示用户,是哪个地方出现问题

request.setAttribute(“msg”,“用户名或者密码错误”);

request.setAttribute(“username”,username);

// 跳回登录页面

request.getRequestDispatcher(“/pages/user/login.jsp”).forward(request, response);

} else {

//登录成功

//跳到成功页面login_success.html

request.getRequestDispatcher(“/pages/user/login_success.jsp”).forward(request, response);

}

}

@Override

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

//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数

if (“login”.equals(req.getParameter(“action”))){

try {

doLogin(req, resp);

} catch (Exception e) {

e.printStackTrace();

}

}else{

try {

doRegist(req, resp);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

2)使用Java反射这个高级特性来优化大量if else代码;

这样我只要写我的业务、功能和方法就行了,就可以把我的注意力专注于业务之上。

如下所示:

@Override

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

//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数

// if (“login”.equals(req.getParameter(“action”))){

// try {

// doLogin(req, resp);

// } catch (Exception e) {

// e.printStackTrace();

// }

// }else{

// try {

// doRegist(req, resp);

// } catch (Exception e) {

// e.printStackTrace();

// }

// }

//利用的Java反射的高级特性来代替大量的if else判断语句,这样可以把我的注意力专注于业务之上

String action = req.getParameter(“action”);

try {

// 获取action业务鉴别字符串,获取相应的业务 方法反射对象

Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);

System.out.println(method);

// 调用目标业务 方法

method.invoke(this, req, resp);

} catch (Exception e) {

e.printStackTrace();

}

}

3)在实际的项目开发中,不同模块间的代码可能会重复,所以可以利用继承Servlet父类来复用这些方法。

让BaseServlet继承HttpServlet,然后让UserServlet继承BaseServlet。

BaseServlet代码如下:

public class BaseServlet extends HttpServlet {

@Override

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

//利用选择判断逻辑来进行操作,同时判断的依据是前端页面上的隐藏域中的参数

// if (“login”.equals(req.getParameter(“action”))){

// try {

// doLogin(req, resp);

// } catch (Exception e) {

// e.printStackTrace();

// }

// }else{

// try {

// doRegist(req, resp);

// } catch (Exception e) {

// e.printStackTrace();

// }

// }

//利用的Java反射的高级特性来代替大量的if else判断语句,这样可以把我的注意力专注于业务之上

String action = req.getParameter(“action”);

try {

// 获取action业务鉴别字符串,获取相应的业务 方法反射对象

Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);

System.out.println(method);

// 调用目标业务 方法

method.invoke(this, req, resp);

} catch (Exception e) {

e.printStackTrace();

}

}

}

UserServlet代码如下:

public class UserServlet extends BaseServlet{

//哈哈哈,同dao层之于service层一样,service层之于web层也是这样操作

private UserServiceImp userServiceImp=new UserServiceImp();

protected void doRegist(HttpServletRequest request, HttpServletResponse response) throws Exception{

//1 获取请求的参数

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

String email = request.getParameter(“email”);

String code = request.getParameter(“code”);

//用来测试使用BeanUtils这个第三方jar包来封装数据

WebUtils.copyParamToBean(request.getParameterMap(),new User());

//System.out.println(username); 验证表单成功上传到Servlet服务器

//2 优先级最高的是验证码,首先判断验证码是否正确(这里我把验证码规定死为1234)

if(“1234”.equalsIgnoreCase(code)){

//3 判断用户名是否存在(由于用户名、密码、邮箱的格式我在Jquery中有判断,所以不需要在servlet服务器中再判断)

if (userServiceImp.existsUsername(username)) {

System.out.println(“该用户名[”+username+“]已经存在,请重新注册”);

// 把回显信息,保存到Request域中

request.setAttribute(“msg”, “用户名已存在!!”);

request.setAttribute(“username”, username);

request.setAttribute(“email”, email);

//跳回注册页面 其中的“/”表示的是web这个目录

RequestDispatcher requestDispatcher=request.getRequestDispatcher(“/pages/user/regist.jsp”);

requestDispatcher.forward(request,response);

} else {

//则将注册信息保存到数据库

//从属性到对象,用的是new User(属性1,属性2)

//从对象到属性,用的是User.get的方法

userServiceImp.registUser(new User(null,username,password,email));

request.getRequestDispatcher(“/pages/user/regist_success.jsp”).forward(request, response);

}

}else{

// 把回显信息,保存到Request域中

request.setAttribute(“msg”, “验证码错误!!”);

request.setAttribute(“username”, username);

request.setAttribute(“email”, email);

System.out.println(“验证码[” + code + “]错误”);

request.getRequestDispatcher(“/pages/user/regist.jsp”).forward(request, response);

}

}

protected void doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{

// 1 获取请求的参数

String username = request.getParameter(“username”);

String password = request.getParameter(“password”);

// 2 调用userService.login()登录处理业务

User loginUser = userServiceImp.login(new User(null, username, password, null));

// 如果等于null,说明登录失败!

if (loginUser == null) {

//同时提示用户,是哪个地方出现问题

request.setAttribute(“msg”,“用户名或者密码错误”);

request.setAttribute(“username”,username);

// 跳回登录页面

request.getRequestDispatcher(“/pages/user/login.jsp”).forward(request, response);

} else {

//登录成功

//跳到成功页面login_success.html

request.getRequestDispatcher(“/pages/user/login_success.jsp”).forward(request, response);

}

}

}

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

**

[外链图片转存中…(img-8R5krTwz-1715633013192)]

⑦数据管理:

[外链图片转存中…(img-E6r0bcUr-1715633013192)]

⑧使用网络:

[外链图片转存中…(img-0fWCSszb-1715633013192)]

⑨高级网络配置:

[外链图片转存中…(img-5XaN2mbF-1715633013193)]

⑩安全:

[外链图片转存中…(img-U3T1bBlU-1715633013193)]

⑪底层实现:

[外链图片转存中…(img-VlP1bIou-1715633013193)]

⑫其他项目:

[外链图片转存中…(img-9LGsZP4b-1715633013194)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值