JavaWeb 学习笔记总结( 二 ),linux高级编程面试题

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

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

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

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

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

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

正文


EL表达式的11个隐含对象,是它自己定义的(内置),可以直接使用。

在这里插入图片描述

7.2 EL 获取四个特定域中的属性



| 特定域属性 | 特定域 |

| — | — |

| pageScope | pageContext域 |

| requestScope | Request域 |

| sessionScope | Session域 |

| applicationScope | ServletContext域 |

<%@page import=“java.util.HashMap”%>

<%@page import=“java.util.Map”%>

<%@page import=“java.util.ArrayList”%>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

<%

pageContext.setAttribute(“key1”, “pageContext1”);

pageContext.setAttribute(“key2”, “PageContext2”);

request.setAttribute(“key1”, “request1”);

request.setAttribute(“key2”, “request2”);

session.setAttribute(“key1”, “session1”);

session.setAttribute(“key2”, “session2”);

application.setAttribute(“key1”, “application1”);

application.setAttribute(“key2”, “application2”);

%>

${ key1 }
${ key2 }

*******************

${ pageScope.key1 }

${ pageScope.key2 }

${ requestScope.key1 }

${ requestScope.key2 }

${ sessionScope.key1 }

${ sessionScope.key2 }

${ applicationScope.key1 }

${ applicationScope.key2 }

7.3 pageContext 使用



pageContext使用跟正常使用没什么差别,方法就是正常的通过对应的get方法来调用方法。

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

------------

<%=request.getScheme() %>

1.协议:${ pageContext.request.scheme }

------------

<%=request.getServerName() %>

2.服务器ip:${ pageContext.request.serverName }

------------

<%=request.getServerPort() %>

3.服务器端口:${ pageContext.request.serverPort }

------------

<%=request.getContextPath() %>

4.获取工程路径:${ pageContext.request.contextPath }

------------

<%=request.getMethod() %>

5.获取请求方法:${ pageContext.request.method }

------------

<%=request.getRemoteHost() %>

6.获取客户端ip地址:${ pageContext.request.remoteHost }

------------

<%=session.getId() %>

7.获取会话id编号:${ pageContext.session.id }

------------

在企业中,常用一种更为方便的方式来定义上面的信息,如下:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

<%

pageContext.setAttribute(“req”, request);

%>

${ req.scheme }

${ req.serverName }

7.4 剩余的6个隐含对象使用


7.4.1 param和paramValues使用


在这里插入图片描述

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

${ param }

${ param.username } , ${ param.age }

${ paramValues.hobby[0] }

${ paramValues.hobby[1] }

请求网址测试如下:http://localhost:8080/EL_JSTL/a.jsp?username=zhangsan&age=18&hobby=eat&hobby=work

param和paramValues使用:

  • param的使用: 它对应map<String , String> , 它可以获取浏览器端发送的参数,但是对于重复的数据,例如:?hobby=eat&hobby=work 它只能获取单个。

  • paramValues的使用,它对应map<String , String[]> , 它可以获取多个值得使用用,例如:?hobby=eat&hobby=work。

7.4.2 header 和 headerValues


在这里插入图片描述

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

${ header }

${ header.user-agent }

${ header[‘user-agent’] }

${ header.connection }

${ headerValues }

${ headerValues[‘user-agent’][0] }

  • header的作用就是获取请求头的内容。

  • headerValues的作用获取所有请求头参数内容,形式和paramValues一样。

7.4.3 EL表达式 cookie使用


在这里插入图片描述

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

${ cookie }

${ cookie.JSESSIONID }

${ cookie.JSESSIONID.name }

${ cookie.JSESSIONID.value }

7.4.4 EL表达式 initParam


在这里插入图片描述

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

${ initParam }

输出<Context-param>:${ initParam.username }

输出<Context-param>:${ initParam.password }

在这里插入图片描述

  • initParam的作用就是获取我们在web.xml配置的context-param参数。

8. JSTL 标签库 概述

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


JSTL标签库 全称是指Jsp Standard Tag Library , JSP标准标签库。是由Apache组织提供的开源的免费的jsp标签。

JSTL标签库是一个不断完善的开发源代码的JSP标签库。

**EL表达式主要是为了替代jsp中的表达式脚本。

而标签库是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。**

在这里插入图片描述

上面的标签库:需要用taglib来导入:

(prefix是前缀的意思。)

在这里插入图片描述

9. JSTL 标签库

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


作用:用于简化和替换jsp页面上的java代码,如果不是JSTL那么使用for循环时,就只能一节一节的<%%>脚本代码块缝合起来的样子很麻烦!。

使用步骤:

  • 1.导入jstl相关jar包。

  • 2.引入标签库:taglib指令: <%@ taglib %>

  • 3.使用标签。

有关jstl的jar下载如下:

http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

常用的JSTL标签:

  • if :相当于java代码的if语句。

  • choose:相当于java代码的switch语句。

  • foreach:相当于java代码的for语句。


对标签的解释:

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

prefix是前缀的意思,就是相当于给标签库起前缀名,前缀名通常命名为 c 。

对于后面内容uri属性,我们导入两个jar包后,自然会补齐。

在这里插入图片描述

10. c:if 标签

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


这里prefix前缀也是命名为c了。

c:if标签:

  • 1.属性:

  • test 是必须设置的属性,接受boolean 表达式。

  • 如果表达式为true,则显示if标签体内容;如果表达式为false,则不显示标签体内容。

  • 一般情况下,test属性值会结合el表达式一起使用。

  • 2.注意:

  • c:if标签是没有else的情况!

<%@page import=“java.util.ArrayList”%>

<%@page import=“java.util.List”%>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

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

Insert title here

<%

//判断request域中的一个list集合是否为空,如果不为null则显示遍历集合。

List list = new ArrayList();

list.add(“aaa”);

request.setAttribute(“list”, list);

%>

<c:if test=“${ not empty requestScope.list }”>

<%=request.getAttribute(“list”) %>

</c:if>


<%

session.setAttribute(“number”, 10);

%>

<c:if test=“${ sessionScope.number % 2 == 0 }”>

session的number数值为偶数

</c:if>

11. c:choose 标签

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


c:choose标签:

  • 使用choose标签取出数字, 相当于switch声明。

  • 使用when标签做数字判断,相当于case。

  • otherwise标签做其他情况的声明, 相当于default。

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

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

Insert title here

<% request.setAttribute(“number”, 8); %>

<c:choose>

<c:when test=“${requestScope.number == 1}”>星期一</c:when>

<c:when test=“${requestScope.number == 2}”>星期二</c:when>

<c:when test=“${requestScope.number == 3}”>星期三</c:when>

<c:when test=“${requestScope.number == 4}”>星期四</c:when>

<c:when test=“${requestScope.number == 5}”>星期五</c:when>

<c:when test=“${requestScope.number == 6}”>星期六</c:when>

<c:when test=“${requestScope.number == 7}”>星期七</c:when>

<c:otherwise>星期八</c:otherwise>

</c:choose>

12. c:foreach 标签

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


foreach:相当于java代码的for语句:

1.完成重复的操作

**for(int i = 0;i < 10;i++){

}**

  • 属性:

  • begin:开始值

  • end:结束值

  • var:临时变量(就是上面的i)

  • step:步长 (这个步长就是i++位置要修改的内容啥的)

  • varStatus:循环状态对象

  • **(有两个方法调用index和count:

index:容器中元素的索引,从0开始。

count:循环次数,从1开始。

)**


2.遍历容器

**List list;

for(User user : list){

}**

  • 属性:

  • items:容器对象。

  • var:容器中元素的临时变量。

  • varStatus:循环状态对象

  • index:容器中元素的索引,从0开始。

  • count:循环次数,从1开始。

<%@page import=“java.util.List”%>

<%@page import=“java.util.ArrayList”%>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

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

Insert title here

<%–

foreach:相当于java代码的for语句

1.完成重复的操作

for(int i = 0;i < 10;i++){

}

  • 属性:

begin:开始值

end:结束值

var:临时变量(就是上面的i)

step:步长 (这个步长就是i++位置要修改的内容啥的)

varStatus:循环状态对象

(有两个方法调用index和count:

index:容器中元素的索引,从0开始。

count:循环次数,从1开始。

)

2.遍历容器

List list;

for(User user : list){

}

  • 属性:

items:容器对象。

var:容器中元素的临时变量。

varStatus:循环状态对象

index:容器中元素的索引,从0开始。

count:循环次数,从1开始。

–%>

<c:forEach begin=“1” end=“10” var=“i” step=“2” varStatus=“s”>

${i}, ${ s.index } , ${ s.count }

</c:forEach>




<%

List list = new ArrayList();

list.add(“aaa”);

list.add(“bbb”);

list.add(“ccc”);

request.setAttribute(“list”, list);

%>

<c:forEach items=“${ list }” var=“str” varStatus=“s”>

${ s.index }, ${ s.count } , ${ str }

</c:forEach>

13. c:set 标签

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


<c:set /> 作用:set标签可以往域中保存数据。

作用:set标签可以往域中保存数据。

  • scope属性有四个对应值:

  • page表示PageContext域(默认值)。

  • request表示Request域。

  • session表示Session域。

  • application表示ServletContext域。

  • var属性:设置key。

  • value属性:设置值。

<%@page import=“java.util.List”%>

<%@page import=“java.util.ArrayList”%>

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

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

Insert title here

保存之前:${ requestScope.abc }

<c:set scope=“request” var=“abc” value=“zhangsan”/>

保存之后:${ requestScope.abc }

14. 文件的上传

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

14.1 文件的上传 说明



步骤如下:

  • 1.要有一个form标签,method=post请求。

  • 2.form标签的encType属性值必须为multipart/form-data值。

  • 3.在form标签中使用input type=file添加上传的文件。

  • 4.编写服务器代码(Servlet程序)接受,处理上传的数据。


encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。

multipart/form-data格式的http请求体如下:

在这里插入图片描述


平时,我们默认的发送数据都是下面这种类型:

在这里插入图片描述


jsp页面代码:

<%@ page language=“java” contentType=“text/html; charset=UTF-8”

pageEncoding=“UTF-8”%>

Insert title here

用户名:

头像:

, file类型要记一下!

Servlet代码:

package com.test;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.ServletInputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

@WebServlet(“/touxiang”)

public class touxiang extends HttpServlet{

@Override

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

// TODO Auto-generated method stub

System.out.println(“文件上传中…”);

//首先,我们传入的参数并不是application/x-www-form-urlencoded , 因此接收不到参数

//System.out.println(req.getParameter(“username”));

//System.out.println(req.getParameter(“photo”));

//我们使用流的方式来接受内容

ServletInputStream inputStream = req.getInputStream();

byte[] buffer = new byte[1024];

int read = inputStream.read(buffer);

while(read!=-1) {

System.out.println(new String(buffer,0,read));

read = inputStream.read(buffer);

}

}

}

在这里插入图片描述

14.2 commons-fileupload.jar 常用API介绍和使用



我们上传文件需要commons-fileupload.jar包,而它需要依赖commons-io.jar这个包,所以两个包我们都要引入。

**commons-fileupload.jar中的ServletFileUpload类:就是用来解析上传的数据;

FileItem类:表示每一个表单项。**


commons-fileupload.jar和commons-io.jar包中我们常用的方法:

在这里插入图片描述

文件上传的大体思路:

package com.test;

import java.io.File;

import java.io.IOException;

import java.util.List;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.FileItemFactory;

import org.apache.commons.fileupload.FileUploadException;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet(“/uploadServlet”)

public class UploadServlet extends HttpServlet {

@Override

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

// 先判断上传的数据是否多段数据(只有是多段数据,才是文件上传的)

if (ServletFileUpload.isMultipartContent(req)) {

// 创建FileItemFactory工厂实现类

FileItemFactory failItemFactory = new DiskFileItemFactory();

// 创建用于解析上传数据的工具类ServletFileUpload类

ServletFileUpload servletFileUpload = new ServletFileUpload(failItemFactory);

try {

// 解析上传的数据,得到每一个表单项FileItem。

List list = servletFileUpload.parseRequest(req);

// 循环判断,每一个表单项,是普通类型,还是上传的文件。

for (FileItem fileItem : list) {

if (fileItem.isFormField()) {

// 返回true,普通表单项:

// 查看当前表单的name:

System.out.println(“表单项的name属性值:” + fileItem.getFieldName());

// 查看当前表单的value:(UTF-8是用来解决乱码问题)

System.out.println(“表单项的value属性值:” + fileItem.getString(“UTF-8”));

} else {

// 返回false,上传的文件

System.out.println(“表单项的name属性值:” + fileItem.getFieldName());

System.out.println(“上传的文件名:” + fileItem.getName());

try {

fileItem.write(

new File(“D:\java_environment_tools\eclipse_project\EL_JSTL\WebContent\image\”

  • fileItem.getName()));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

} catch (FileUploadException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

15. 文件的下载

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

15. 文件下载的 基本过程



步骤如下:

在这里插入图片描述

安装上图步骤一步一步来:(这里我们一访问该servlet对应的url,就会下载)

package com.test;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

@WebServlet(“/downloadServlet”)

public class DownloadServlet extends HttpServlet{

@Override

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

//1.获取要下载的文件名

String downloadFileName = “头像.png”;

//2.读取要下载的文件内容(通过ServletContext对象可以读取)

ServletContext servletContext = getServletContext();

//获取要下载的文件类型

String mimeType = servletContext.getMimeType(“/image/”+downloadFileName);

System.out.println(mimeType);

//4.在回传前,通过响应头告诉客户端返回的数据类型

resp.setContentType(mimeType);

//5.还要告诉客户端收到的数据是用于下载使用(这里依然通过响应头使用)

//Content-Disposition: 这个属性,表示收到的数据怎么处理。

//attachment表示附件

//filename=文件名 :表示指定下载的文件名

resp.setHeader(“Content-Disposition”, “attachment;filename=”+downloadFileName);

总结

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

  • 第一个是算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@Override

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

//1.获取要下载的文件名

String downloadFileName = “头像.png”;

//2.读取要下载的文件内容(通过ServletContext对象可以读取)

ServletContext servletContext = getServletContext();

//获取要下载的文件类型

String mimeType = servletContext.getMimeType(“/image/”+downloadFileName);

System.out.println(mimeType);

//4.在回传前,通过响应头告诉客户端返回的数据类型

resp.setContentType(mimeType);

//5.还要告诉客户端收到的数据是用于下载使用(这里依然通过响应头使用)

//Content-Disposition: 这个属性,表示收到的数据怎么处理。

//attachment表示附件

//filename=文件名 :表示指定下载的文件名

resp.setHeader(“Content-Disposition”, “attachment;filename=”+downloadFileName);

总结

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

  • 第一个是算法

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

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

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

[外链图片转存中…(img-wjvxVCV6-1713409409828)]

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

[外链图片转存中…(img-Clh92K46-1713409409828)]

[外链图片转存中…(img-lUp3d0XS-1713409409828)]

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

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

[外链图片转存中…(img-WJZCoQ18-1713409409829)]

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

[外链图片转存中…(img-jVsKpgMt-1713409409829)]

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值