javase面试题目hot2web开发

javase面试题目hot2web开发
mengnankkzhouweb基础
1.JavaWeb是什么(静态资源和动态资源)
JavaWeb 是基于 Java 技术的 Web 开发体系,用于构建浏览器/服务器(B/S)架构的动态网站或服务。
核心组成部分:
| 模块 | 说明 |
|---|---|
| Servlet | JavaWeb 的核心,用于处理 HTTP 请求 |
| JSP / Thymeleaf | 页面展示层,用于动态生成 HTML 内容 |
| Filter / Listener | 过滤器和监听器,提供请求过滤、生命周期监听等功能 |
| Web.xml | 部署描述文件,用于配置 Servlet、Filter 等组件(Spring Boot 多用注解配置) |
| 静态资源 | 纯前端文件,如 HTML、JS、CSS、图片等 |
| 动态资源 | 由 Servlet / Controller 处理、运行时生成的内容 |
| 类型 | 描述 | 是否经过服务端处理 |
|---|---|---|
| 静态资源 | 浏览器请求后直接返回内容(如 HTML/CSS/JS/图片) | ❌ 不经过 Java 代码处理,直接由服务器返回 |
| 动态资源 | 运行时由后端生成(如 .jsp、Servlet、Controller 响应 JSON) | ✅ 由 Java 程序处理后动态生成响应 |
静态资源:
- URL:
http://example.com/static/index.html - 返回:静态 HTML 页面
- 存储位置:
/static/、/public/、/resources/(Spring Boot 默认支持)
动态资源:
- URL:
http://example.com/user/list - 后端:调用 Controller → Service → Dao → 数据库 → 生成动态 HTML / JSON
- 常见技术:Servlet、JSP、Spring MVC、Thymeleaf、FreeMarker
流程:::
浏览器请求 → Tomcat(Servlet 容器)接收 → 判断资源类型:
├─ 静态资源:直接读取文件返回
└─ 动态资源:交给 Servlet/DispatcherServlet 执行 → 处理请求 → 返回响应
总结:::
JavaWeb 是基于 Java 的 Web 应用开发技术,主要通过 Servlet 处理 HTTP 请求,支持静态与动态资源的服务。
静态资源如 HTML、CSS、JS 不经后端处理直接响应;
动态资源(如 Servlet、JSP、Controller)通过服务器运行 Java 逻辑动态生成响应内容。
在现代开发中,JavaWeb 往往结合 Spring MVC + 前端页面模板或前后端分离架构使用。
可以使用nginx进行动静的分离
2.tomcat是什么以及作用
Tomcat 是一个开源的、轻量级的 Web 服务器和 Servlet 容器
Servlet 规范:Servlet 是 Java 语言的一个接口,它定义了如何响应客户端请求(如浏览器发出的 HTTP 请求)。Tomcat 作为 Servlet 容器,负责加载、初始化和管理 Servlet 的生命周期,并根据请求将它们与对应的 Servlet 实例关联起来。
JSP (JavaServer Pages) 规范:JSP 允许开发者在 HTML 页面中嵌入 Java 代码,从而动态生成 Web 内容。Tomcat 能够解析和编译 JSP 文件为 Servlet,然后像处理普通 Servlet 一样执行它们。
它能理解来自客户端(比如你的浏览器)的 HTTP 请求,将这些请求传递给你的 Java Web 应用程序(比如你写的 Servlet 或 JSP),然后把应用程序处理完的结果(比如一个 HTML 页面)再返回给客户端。
3.HTTP协议的作用以及组成(请求行:请求头,请求体)
HTTP(HyperText Transfer Protocol),超文本传输协议,是互联网上应用最为广泛的一种网络协议。它定义了客户端(如浏览器)和服务器之间如何进行通信,是 Web 应用程序能够正常运作的基础。
HTTP 规范了客户端(如你的浏览器、手机 App)如何向服务器发送请求,以及服务器如何响应这些请求。这包括了请求的格式、响应的格式、如何处理错误等等。
功能:
实现连接,传输资源,无状态,可扩展性
报文组成:
请求行,请求头,请求体
4.浏览器输入一个网址后,看到返回结构,都经历了哪些流程
解析,host检查,dns递归解析,tcp三次握手,发送http请求,响应http请求,浏览器解析
5.URI和URL的区别
URI,全称 统一资源标识符,它是一个字符串,用来唯一标识互联网上的一个资源。这里的“资源”可以是任何东西,比如一个网页、一张图片、一段视频、一个文件,甚至是一个服务或者一个抽象概念。
URL,全称 统一资源定位符,它是 URI 的一个子集。URL 不仅能够标识一个资源,更重要的是,它还指明了这个资源在互联网上的位置。换句话说,URL 告诉我们如何访问到这个资源。
6.MVC架构是什么
旨在将应用程序的业务逻辑、数据和用户界面进行分离,从而提高代码的可维护性、可扩展性和重用性。
Model(模型)
- 作用:模型是应用程序的核心,它包含了数据和业务逻辑。它独立于用户界面,负责数据的存储、检索、处理、验证和管理。当数据发生变化时,模型会通知视图进行更新。
- 职责:
- 数据管理:负责与数据库或其他数据源的交互,进行数据的增删改查。
- 业务规则:包含应用程序的核心业务逻辑和规则,确保数据的完整性和一致性。
- 状态管理:管理应用程序的状态,并在其状态改变时通知相关的视图或控制器。
- 示例:在一个电商应用中,
Product类、Order类、User类以及它们对应的数据库操作和业务逻辑(如计算订单总价、库存管理)都属于模型层。
- View(视图)
- 作用:视图是用户与应用程序交互的界面。它负责显示模型的数据给用户,并接收用户的输入(如点击按钮、填写表单)。视图本身不包含任何业务逻辑,它只负责数据的展示。
- 职责:
- 数据展示:从模型中获取数据,并以用户友好的方式呈现。
- 用户交互:提供用户界面元素,并捕获用户的输入事件。
- 不含业务逻辑:视图层应该尽可能“哑巴”,不直接处理业务逻辑,而是将用户输入事件传递给控制器。
- 示例:网页中的 HTML 页面、Android 或 iOS 应用中的 UI 界面、桌面应用中的窗口和控件,都属于视图层。
- Controller(控制器)
- 作用:控制器是模型和视图之间的桥梁或“协调者”。它接收用户的输入(来自视图),根据输入调用相应的模型进行业务逻辑处理,然后选择合适的视图来显示处理结果。
- 职责:
- 处理用户输入:接收并解析来自视图的用户请求和操作。
- 协调模型和视图:根据用户输入,调用模型层执行相应的业务逻辑操作。
- 更新视图:模型处理完数据后,控制器会选择一个合适的视图来展示更新后的数据或结果。控制器通常不直接修改视图,而是告诉视图去更新自己。
- 示例:在 Web 应用中,一个 Servlet 或 Spring MVC 中的
@Controller类就是控制器。它接收 HTTP 请求,调用服务层(模型的一部分)处理业务,然后将数据传递给 JSP 或 Thymeleaf 模板(视图)进行渲染。
7.三大组件Servlet、Filter 和 Listener
Servlet 是 Java 语言的一个接口,也是所有 Java Web 应用程序的核心组件。它定义了服务器端程序如何接收和响应客户端(通常是浏览器)的请求。
处理请求:接收并处理来自客户端的 HTTP 请求(如 GET、POST 等)。
生成响应:根据请求执行业务逻辑(如查询数据库、调用服务),然后生成动态内容(如 HTML 页面、JSON 数据)作为 HTTP 响应返回给客户端。
生命周期管理:Servlet 容器负责管理 Servlet 的生命周期,包括加载、实例化、初始化 (init())、处理请求 (service()) 和销毁 (destroy())。
多线程处理:同一个 Servlet 实例可以同时处理多个请求,每个请求都在独立的线程中执行。因此,Servlet 中的共享资源需要考虑线程安全问题。
init(ServletConfig config):Servlet 初始化时调用,只执行一次。
service(ServletRequest req, ServletResponse res):每次客户端请求时调用,根据请求类型分发到 doGet()、doPost() 等方法。
doGet(HttpServletRequest req, HttpServletResponse resp):处理 HTTP GET 请求。
doPost(HttpServletRequest req, HttpServletResponse resp):处理 HTTP POST 请求。
destroy():Servlet 销毁时调用,只执行一次,用于释放资源。
Filter 也是 Java Web 的一个接口,它允许你在请求到达 Servlet 之前和响应发送回客户端之后拦截和处理请求/响应。过滤器就像一个“管道”或“拦截器”,可以在核心业务逻辑(Servlet)执行前后进行预处理和后处理。
请求/响应拦截:在请求进入 Servlet 之前进行预处理,或在 Servlet 处理完响应返回客户端之前进行后处理。
链式调用:可以配置多个过滤器形成一个过滤链,请求会依次经过这些过滤器。
不改变核心业务:过滤器主要用于通用性、非核心的逻辑处理,而不会改变 Servlet 的核心业务功能。
init(FilterConfig filterConfig):过滤器初始化时调用,只执行一次。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain):每次请求匹配到过滤器时调用。核心逻辑在此方法中实现,chain.doFilter() 方法用于将请求传递给下一个过滤器或目标 Servlet。
destroy():过滤器销毁时调用,只执行一次。
Listener 也是 Java Web 的一组接口,用于监听 Web 应用程序中的特定事件。当这些事件发生时,监听器会收到通知并执行相应的处理逻辑。监听器就像应用程序的“耳目”,能感知到各种生命周期或状态变化。
事件驱动:基于事件机制,当某个特定事件(如 ServletContext 创建/销毁、HttpSession 创建/销毁、ServletRequest 创建/销毁等)发生时,自动触发相应的监听器方法。
无侵入性:监听器通常与业务逻辑分离,用于处理一些全局性的、非业务相关的任务。
Web 应用程序范围:
ServletContextListener:监听 ServletContext(Web 应用上下文)的创建和销毁。contextInitialized(ServletContextEvent sce):Web 应用启动时调用。contextDestroyed(ServletContextEvent sce):Web 应用关闭时调用。- 应用场景:加载配置文件、初始化资源池、启动后台任务。
会话范围:
HttpSessionListener:监听 HttpSession 的创建和销毁。sessionCreated(HttpSessionEvent se):新会话创建时调用。sessionDestroyed(HttpSessionEvent se):会话销毁时调用(如超时、手动失效)。- 应用场景:统计在线用户数量。
HttpSessionAttributeListener:监听 HttpSession 中属性的增删改。
请求范围:
ServletRequestListener:监听 ServletRequest 对象的创建和销毁。requestInitialized(ServletRequestEvent sre):请求开始处理时调用。requestDestroyed(ServletRequestEvent sre):请求处理结束时调用。- 应用场景:统计请求次数、记录请求日志。
ServletRequestAttributeListener:监听 ServletRequest 中属性的增删改。
8.什么是JDBC
它提供了一套统一的接口和类,允许 Java 开发者使用相同的 Java 代码来连接、查询和更新不同的关系型数据库,而无需关心底层数据库的具体实现细节。
JDBC 定义了:
- 如何建立与数据库的连接。
- 如何发送 SQL 语句给数据库。
- 如何处理从数据库返回的结果。
- 如何管理数据库事务。
统一的编程接口: JDBC 提供了一套标准的 API(位于 java.sql 和 javax.sql 包中),无论底层是 MySQL、Oracle、SQL Server 还是 PostgreSQL,开发者都使用相同的接口来编写数据库操作代码。这大大简化了开发工作。
可插拔的驱动机制: 虽然 JDBC 定义了统一的接口,但不同数据库厂商的底层实现是不同的。为了让 Java 程序能够与特定的数据库通信,每个数据库厂商都需要提供一个符合 JDBC 规范的 JDBC 驱动程序。这个驱动程序负责将 JDBC API 调用翻译成数据库能理解的特定协议,并进行实际的数据传输。 开发者只需要在项目中引入对应数据库的 JDBC 驱动 JAR 包,并在代码中加载该驱动,就可以连接到相应的数据库。
支持多种数据库: 由于其驱动机制,JDBC 可以支持几乎所有主流的关系型数据库。这使得 Java 应用具有很强的数据库无关性和可移植性。如果未来需要更换数据库,通常只需要更换 JDBC 驱动和修改连接配置,而无需大幅改动业务代码。
提供强大的数据库操作能力: JDBC 提供了丰富的方法来执行 SQL 语句,包括:
- 建立连接:
DriverManager.getConnection() - 创建语句:
Connection.createStatement()、Connection.prepareStatement() - 执行查询:
Statement.executeQuery(),返回ResultSet(结果集) - 执行更新:
Statement.executeUpdate()(用于插入、更新、删除) - 处理结果集:
ResultSet接口提供了遍历结果、获取列值等方法。 - 事务管理:
Connection.setAutoCommit()、commit()、rollback()等。
9.RESTful API RPC的联系和区别
RESTful API 和 RPC 是两种广泛使用的架构风格,用于构建 Web 应用程序和分布式系统. 它们在多个方面存在差异,包括通信协议、数据传输、编码方式和服务契约.
- RPC (Remote Procedure Call): 侧重于函数或操作,客户端在服务器上进行远程函数调用,就像在本地调用一样. RPC 是一种面向过程的远程调用协议,其目标是使应用程序能够在网络上进行远程调用,类似于本地函数调用.
- REST (Representational State Transfer): 侧重于资源或对象. REST 客户端请求服务器针对特定资源执行操作,操作仅限于 CRUD(创建、读取、更新和删除),通过 HTTP 动词传达. REST 是一种面向资源的架构风格,它是一种基于 HTTP 协议的分布式系统架构,主要用于构建 Web 服务和 API.
区别
- RESTful API: 使用 HTTP 协议作为通信协议. HTTP 协议是基于文本的,包含请求头、请求体、响应头和响应体等信息.
- RESTful API: 使用 JSON 或 XML 格式进行编码.
- RESTful API: 服务契约通常通过 URL、HTTP 方法、HTTP 头和 HTTP 状态码等来定义.
- REST: 核心在于“表征状态转移”,其六大原则的核心是面向资源的设计理念.
- RESTful API: 适合构建 Web 服务和 API
- RPC: 可以使用多种传输协议进行通信,例如 TCP、UDP、HTTP 等
- RPC: 可以使用多种编码方式进行编码,例如 Protocol Buffers、Thrift、Avro 等.
- RPC: 服务契约通常通过接口定义语言(IDL)来定义,IDL 可以定义数据类型、服务方法和异常等,然后通过编译器生成客户端和服务器代码.
- RPC: RPC解决了三个基本问题:如何表示数据、如何传递数据、如何确定方法
- RPC: 适合构建分布式系统和微服务.












