之前以为面经只是死记硬背的东西,后来发现记住了它们,对自己对知识的理解确实有帮助,难怪语文的文章老是要求背背背。
前言
这次的面经整理分为以下几个部分,希望对大家的工作有帮助。
内容 | 链接地址 |
---|---|
Java 基础 | 传送门 |
Java 集合 | 传送门 |
Java 多线程 | 传送门 |
Java虚拟机 | 传送门 |
计算机网络 | 传送门 |
数据结构和算法 | 传送门 |
数据库 | 传送门 |
JavaWeb | 传送门 |
设计模式 | 传送门 |
Spring、MyBatis | 传送门 |
1 语言和框架
1 什么是 JavaWeb
JavaWeb 是所有通过 Java 语言编写的、且可以通过浏览器访问的程序的总称。JavaWeb 是基于请求和响应来开发的。
2 JavaWeb 目前的技术和框架有哪些
HTML、CSS、JavaScript:这三门语言是前端语言,其中 HTML 主要负责定义网页的内容,CSS 规定网页的布局,而 JavaScript 则对网页行为进行编程。
JSP:全称是 Java Server Page,它表示的是 Java 的服务器页面,主要作用是代替 Servlet 程序回传 HTML 页面的数据。实际上,我的所有前端网页都是通过 JSP 来完成的。
Servlet: Servlet 是运行在服务器上的一个 Java 程序,它可以接收客户端发送过来的请求,并响应数据给客户端。前端和后端就这么产生了。
Tomcat:Tomcat 实际上是一个服务器。
MySQL:MySQL 是一个关系型数据库管理系统,它使用 SQL 语言来作为开发。
3 介绍一下 HTML 和 CSS
关于这两部分,参考博客:
HTML:传送门
CSS:传送门
2 JavaScript
1 如何进行 JavaScript 与 HTML 的融合
JavaScript 是 HTML 的默认脚本语言,所以无需在 HTML 文件头部加上引入标签。不过在 HTML 中,JavaScript 代码必须位于 <script>
与</script>
标签之间。
拓展:
JSP 与 HTML 的融合方式是重新定义一个 .jsp 的文件,然后将 HTML 文件进行复制,而 JavaScript 是 HTML 的默认脚本语言,所以在 HTML 文件头部通过 <script type="text/javascript">
引入不是必须的。
2 JavaScript 与 HTML 的融合的代码实例
1)在 head 或者 body 标签内,用 script 标签来书写 JavaScript 代码
例如在 head 中:
<!DOCTYPE html>
<html>
<head>
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "段落被更改。";
}
</script>
</head>
<body>
<h1>一张网页</h1>
<p id="demo">一个段落</p>
<button type="button" onclick="myFunction()">试一试</button>
</body>
</html>
在 body 中:
<!DOCTYPE html>
<html>
<body>
<h1>A Web Page</h1>
<p id="demo">一个段落</p>
<button type="button" onclick="myFunction()">试一试</button>
<--!把脚本置于 <body> 元素的底部,可改善显示速度,-->
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "段落被更改。";
}
</script>
</body>
</html>
2)使用 script 标签引入单独的 JavaScript 代码文件
略。
3 JavaScript 的语法是怎样的
JavaScript 是弱类型的语言,同时 JavaScript 的数组会自动扩容。
4 介绍一下 JavaScript 的 DOM 模型
JavaScript 中的 DOM (Document Object Model) ,即文档对象模型,是把文档中的标签,属性,文本等转换成对象来管理的模型,通过将其进行对象化,使得我们可以直接根据 DOM 来访问 HTML 文档内容。
DOM 模型常用的方法如下:
方法 | 功能 |
---|---|
document.getElementById(elementId) | 通过标签的 id 属性查找元素 |
document.getElementsByName(elementName) | 通过标签的 name 属性查找元素 |
document.getElementsByTagName(tagname) | 通过标签名查找元素 |
三者的优先级从上到下以此递减。
5 介绍一下 JavaScript 的事件
事件是电脑输入设备与网页页面进行交互的一种响应,可分为静态注册(直接赋予)和动态注册(通过 DOM 模型)。
常用的事件:
事件名 | 作用 |
---|---|
onload 加载完成事件 | 浏览器页面加载完成后,所执行的 JS 初始化代码 |
onclick 单击事件 | 用户点击了 HTML 元素 |
onblur 失去焦点事件 | 用户的光标从原本的某个地方移开就算失去焦点 |
onchange 内容发生改变事件 | 下拉列表或者输入框的内容发生改变 |
onsubmit 表单提交事件 | 常用于表单提交前,验证所有表单项是否合法 |
3 JSP
1 说一说 JSP 的定义
JSP 表示的是服务器页面,它的主要作用是代替 Servlet 程序回传 HTML 页面的数据。尽管 JSP 的代码是写在前端的,但其本质是后端语言。
JSP HTML 的融合方式是重新定义一个 .jsp 的文件,然后将 HTML 文件进行复制。
- 与 JavaScript 相比:虽然 JavaScript 可以在客户端动态生成 HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等;
- 与纯 Servlet 相比:JSP 可以很方便的编写或者修改 HTML 网页而不用去面对大量的 println 语句;
- 与静态 HTML 相比:静态 HTML 不包含动态信息。
因此,JSP 的优点:可以动态地生成 HTML 页面,而且还可以方便地与服务器进行交互。
2 说一说 JSP 标签
JSP 共有六种标签,分别为指令标签、声明标签、表达式标签、代码标签、注释标签、动作标签。
指令标签有三种,分别如下:
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如缓存信息、导入的 Java 类等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
三个脚本标签为:声明标签、表达式标签、代码标签,其作用是在 JSP 页面中加入 Java 代码来实现功能。
脚本类型 | 格式 | 作用 | 示例 |
---|---|---|---|
声明脚本 | <%! %> | 申明变量或者方法,供后面的 Java 代码使用 | <%! int a, b, c; %> |
表达式脚本 | <%= %> | 在 jsp 页面上输出数据 | Today's date: <%= (new java.util.Date()).toLocaleString()%> |
代码脚本 | <% %> | 在 jsp 页面中定义自己需要的 Java 代码 | – |
动作标签示例:
名称 | 作用 |
---|---|
jsp:forward | 把请求转到一个新的页面。 |
3 说一说 JSP 的九大内置对象
JSP 中的内置对象,是指 Tomcat 在翻译 JSP 页面成为 Servlet 源代码后,内部提供的九大对象。此时翻译而来的 Java 源代码就是由这九大内置对象组合而成的。
对象名 | 作用 |
---|---|
request | 请求对象 |
response | 响应对象 |
pageContext | JSP 的上下文对象 |
session | 会话对象 |
application | ServletContext对象 |
config | ServletConfig对象 |
out | JSP输出流对象 |
page | 指向当前JSP的对象 |
exception | 异常对象 |
4 说一说 JSP 的四大域对象
域对象是可以像Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。首先说明这四大域对象是属于九大内置对象的,四个域对象分别为:
域对象 | 所属类 | 作用域 |
---|---|---|
pageContext | PageContextImpl 类 | 只在当前 JSP 页面范围内有效 |
request | HttpServletRequest 类 | 一次请求内有效 |
session | HttpSession 类 | 一个会话范围内有效(即打开浏览器访问服务器到关闭浏览器) |
application | ServletContext 类 | 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在) |
5 介绍一下静态包含和动态包含的区别
静态包含的代码为:<%@ include file="/include/include2.jsp"%>
动态包含的代码为:<jsp:include page="/include/include2.jsp"></jsp:include>
静态包含不可以传递参数,而动态包含可以,静态包含适合没有大量 Java 代码的 JSP,而动态包含适合需要传递参数,且含有大量 Java 代码的 JSP。
6 简述转发和重定向的区别
// 转发
request.getRequestDispatcher("/SecondServlet?addParam=newParam").forward(request, response);
// 重定向
response.sendRedirect("/WebSocket/SecondServlet");
- 转发只访问服务器一次,而重定向访问服务器两次;
- 转发页面的 URL 不会改变,而重定向地址会改变;
- 转发只能转发到自己的 web 应用内,重定向可以重定义到任意资源路径;
- 转发时两个文件属于同一次请求,所以共用一个 request 域;而重定向会产生一个新的请求,所以无法共享之前的 request 域信息;
可以这么理解:
转发相当于,张三向你借钱,但是你兜里没钱,所以你去找李四借到钱之后借给张三。对于张三而言并不知道你的钱是和李四借的。
重定向相当于,张三向你借钱,你兜里没钱,你告诉他李四有钱,所以张三再次去找李四借钱。
7 简述 JSP 的生命周期
JSP 生命周期定义了 JSP 从创建到销毁的整个过程。JSP 与Servlet 生命周期类似,不同的是,JSP 需要先被编译成 Servlet。
JSP 生命周期阶段如下:
- 编译:JSP 通过 servlet 容器编译生成 servlet 类;
- 初始化:加载该类,创建其实例,并调用它的初始化方法;
- 处理请求:利用该实例处理请求;
- 销毁:销毁该实例。
4 Servlet
简述 Servlet 的定义
Servlet 是运行在服务器上的一个 Java 程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达。JSP 侧重于视图,Servlet 主要用于控制逻辑。
2 简述 Servlet 的生命周期
- 初始化:Web 容器加载 Servlet,调用初始化方法,且只会在第一次访问 Servlet 程序时调用;
- 处理请求:利用该实例处理请求,每次访问 Servlet 程序时都会调用;
- 销毁:销毁该程序。
3 简述 HttpServletRequest 类
只要有请求进入Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 HttpServletRequest 对象中,我们可以通过该对象,获取到所有请求的信息。
4 简述 HttpServletResponse 类
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse 对象来进行设置。
5 简述 url 地址到 Servlet 程序的访问
我们在浏览器的Tomcat服务器主页上的 url 地址添加后缀/hello,实际上,我们在 web.xml 这个 XML 配置文件中已经配置好了/hello与 TestHelloServlet 这个类的映射,所以,才有了前端与后端之间的连接。