Web 基础知识
Web 应用的基本组成
Web 应用通常由前端、后端、数据库和 Web 服务器等部分组成。
-
前端:运行在浏览器中,负责页面展示、用户交互和部分数据处理。常见技术包括 HTML、CSS、JavaScript、jQuery 和 Bootstrap。
-
后端:运行在服务器中,负责接收请求、处理业务、访问数据库并返回结果。Java Web 中常见技术包括 Servlet 和 Spring MVC。
-
接口:约定请求地址、请求方式、参数格式和响应格式,使前后端能够协作。
前后端集成开发
前端页面和后端程序放在同一个项目或同一个服务器应用中部署。启动服务后,页面资源和后端接口通常一起运行。
在这种模式中,后端除了处理业务数据,还可能负责页面跳转和服务器端页面渲染。前端与后端对同一项目结构和页面模板的依赖较强,因此耦合度通常较高。
以登录页面为例:

前后端分离开发
前端和后端作为两个相对独立的应用开发和部署。前端负责页面展示、用户交互和路由跳转,后端负责业务处理和数据访问。
双方按照接口文档交换数据,常见数据格式为 JSON。通常是前端向后端发送请求数据,后端处理后返回 JSON 结果,前端再根据结果更新页面。
这种模式可以降低前后端在代码和部署上的直接依赖,并支持前后端并行开发,但双方仍需要共同遵守接口约定。

MVC 分层模式
MVC 将应用职责划分为 Model、View 和 Controller:

View 视图层
负责展示数据并接收用户操作。在前后端集成项目中,View 可能是 JSP 或 HTML 模板;在前后端分离项目中,View 通常由独立前端应用实现。
Controller 控制器层
负责接收客户端请求、读取请求参数、调用业务层,并将处理结果返回给客户端。
在前后端集成模式中,Controller 可能返回页面视图;在前后端分离模式中,Controller 通常返回 JSON 数据。
Model 模型层
负责业务数据和处理逻辑。实际 Java Web 项目通常会继续拆分为:
-
Service层:处理业务逻辑和事务。 -
DAO或 Repository 层:访问数据库或其他数据源。
MVC 描述的是职责划分,实际项目中的具体分层方式可以根据框架和业务规模调整。
Servlet API
Servlet API 提供了 Java Web 开发所需的一组接口和类,用于处理 HTTP 请求、生成 HTTP 响应、管理会话及访问 Web 应用上下文。
添加 Maven 依赖
以下依赖适用于基于 javax.servlet 命名空间的 Servlet 4.0 项目:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
provided 表示编译时需要该依赖,但运行时通常由 Tomcat 等 Servlet 容器提供。
创建 Servlet
Servlet 可以通过注解与 URL 路径建立映射。客户端访问对应路径时,Servlet 容器会调用相应方法:
import java.io.IOException;
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("/test")
public class TestController extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 读取请求参数
// 调用业务层
// 将结果写入响应
System.out.println("客户端访问了 /test,执行了 TestController 的 service 方法");
}
}Servlet 实例通常由容器创建和管理。一次 HTTP 请求会对应一组请求对象和响应对象,但多个请求可能由同一个 Servlet 实例处理,因此不要把单次请求的数据保存在 Servlet 的实例字段中。
HttpServletRequest 请求对象
HttpServletRequest 封装客户端发送的 HTTP 请求。一次请求处理结束后,该请求对象通常不再使用。
常见操作包括:
-
获取请求方法:
request.getMethod()。 -
获取请求 URL:
request.getRequestURL()。 -
获取上下文路径:
request.getContextPath()。 -
获取请求头:
request.getHeader("请求头名称")。 -
获取单个请求参数:
request.getParameter("参数名")。 -
获取同名的多个参数:
request.getParameterValues("参数名")。 -
保存请求范围属性:
request.setAttribute("name", value)。 -
读取请求范围属性:
request.getAttribute("name")。
请求属性常用于服务器内部转发时传递数据,其生命周期通常只覆盖当前请求。
HttpServletResponse 响应对象
HttpServletResponse 用于设置状态码、响应头、字符编码和响应体。
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write("响应给浏览器的数据");
常见操作包括:
-
设置响应状态码。
-
设置响应头。
-
设置响应内容类型和字符编码。
-
通过字符流或字节流写入响应体。
-
执行重定向。
HttpSession 会话对象
HttpSession 用于在服务器端保存与某个客户端会话相关的数据。第一次调用 request.getSession() 时,如果当前会话不存在,容器通常会创建新会话。
HttpSession session = request.getSession();
session.setAttribute("test", "test");
Object value = session.getAttribute("test");
浏览器通常通过会话 Cookie 携带会话标识,使后续请求能够关联到同一个 HttpSession。
会话会在超时、主动失效或服务器处理后被销毁。超时时长由服务器或应用配置决定,并不固定为 20 分钟。
Cookie
Cookie 是由服务器发送给浏览器,并由浏览器按规则保存的小段数据。浏览器后续访问匹配的地址时,可以把 Cookie 随请求发送给服务器。
向客户端写入 Cookie
Cookie cookie = new Cookie("username", "tom");
cookie.setMaxAge(3600);
response.addCookie(cookie);
读取请求中的 Cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());
System.out.println(cookie.getValue());
}
}
Cookie 常用于保存会话标识、偏好设置等信息。不要在 Cookie 中直接保存明文密码等敏感数据;身份凭证还应结合 HttpOnly、Secure、SameSite 等安全属性和服务端校验机制。
ServletContext 应用上下文
ServletContext 表示当前 Web 应用的运行上下文。通常在应用启动时创建,在应用停止时销毁。同一个 Web 应用一般只有一个 ServletContext。
ServletContext context = getServletContext();
context.setAttribute("name", "abcde");
Object value = context.getAttribute("name");
应用范围属性可以被同一 Web 应用中的多个 Servlet 和多个请求共享。由于可能被多个线程同时访问,保存可变共享数据时需要考虑线程安全。
常见作用域对比
| 对象 | 典型范围 | 常见用途 |
|---|---|---|
HttpServletRequest | 一次请求 | 转发数据、保存当前请求处理结果 |
HttpSession | 一个客户端会话 | 登录状态、会话级用户数据 |
ServletContext | 整个 Web 应用 | 应用级共享配置或公共数据 |
| Cookie | 浏览器按规则保存 | 会话标识、用户偏好等少量数据 |
喜欢的话,留下你的评论吧~