一、开篇:为什么你必须了解 JSP 与 Servlet?
在 Java Web 开发的世界里,Servlet 是一切 Web 服务的底层骨架,而 JSP 则是 Servlet 的“前端友好版”封装。无论你未来使用 Spring Boot、Spring MVC 还是其他 Web 框架,它们的底层都离不开 Servlet 规范;而 JSP 作为早期动态页面开发的标准,也承载了 Web 开发中“前后端交互”的核心思想。
很多初学者会直接跳过 Servlet/JSP,上手 Spring Boot,结果遇到请求流程、容器原理等问题时一头雾水。本文带你从底层到实战,彻底搞懂这两项技术,为后续学习打下坚实基础。
二、核心概念拆解:Servlet 与 JSP 到底是什么?
1. Servlet:Java Web 的“请求处理器”
Servlet 是遵循 Java Servlet 规范的服务器端 Java 类,它运行在 Web 容器(如 Tomcat)中,专门用于处理客户端的 HTTP 请求,并生成 HTTP 响应。
- 核心职责:接收请求参数、处理业务逻辑、控制页面跳转、返回响应结果。
- 特点:纯 Java 代码编写,对业务逻辑的控制能力极强,但直接拼接 HTML 输出页面会非常繁琐。
- 本质:一个实现了 Servlet 接口的类,Tomcat 会通过反射机制实例化它,并调用对应的方法处理请求。
2. JSP:嵌入 Java 代码的“动态 HTML”
JSP(Java Server Pages)是一种在 HTML 中嵌入 Java 代码的技术,文件后缀为 .jsp ,它的出现就是为了解决 Servlet 输出 HTML 繁琐的问题。
- 核心职责:快速编写动态页面,将 Java 代码与 HTML 标签混合,实现页面的动态渲染。
- 特点:编写页面直观方便,但如果嵌入过多业务逻辑代码,会导致页面臃肿、难以维护。
- 关键真相:JSP 本质上就是 Servlet!服务器第一次访问 JSP 时,会自动将其翻译成 Servlet 源文件,再编译成字节码执行,后续访问直接复用编译好的 Servlet。
3. 两者的关系与分工
技术 角色 优势 劣势
Servlet 控制器(Controller) 业务逻辑处理能力强、性能高 输出 HTML 繁琐,开发效率低
JSP 视图(View) 编写动态页面方便,支持直接嵌入 Java 代码 业务逻辑与页面耦合,维护困难
两者配合使用,就形成了早期 Java Web 开发的 MVC 雏形:Servlet 负责处理请求和控制跳转,JSP 负责展示数据和渲染页面。
三、Servlet 实战:第一个 Web 请求处理器
我们先通过一个简单的例子,感受 Servlet 的工作流程。
1. 编写 Servlet 类
java
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 java.io.IOException;
import java.io.PrintWriter;
// 配置 Servlet 的访问路径
@WebServlet("/demoServlet")
public class DemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应的编码和内容类型,避免中文乱码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 向客户端输出 HTML 内容
out.println("<html>");
out.println("<head><title>我的第一个Servlet</title></head>");
out.println("<body>");
out.println("<h2>Hello Servlet!</h2>");
out.println("<p>这是由Servlet动态生成的页面内容</p >");
out.println("</body>");
out.println("</html>