Java Web开发的基石:深入理解Servlet与JSP
Java Web开发的基石:深入理解Servlet与JSP
- Java Web开发的基石:深入理解Servlet与JSP
- 引言
- 第一部分:为什么我们需要Servlet和JSP?—— 历史的背景
- 第二部分:Servlet —— 背后的指挥官
- 1. 什么是Servlet?
- 2. 它的工作原理
- 3. 一个简单的Servlet示例
- 第三部分:JSP —— 前台的视图渲染师
- 1. 什么是JSP?
- 2. 它的工作原理
- 3. 一个简单的JSP示例
- 第四部分:Servlet + JSP 的完美协作 —— MVC模式的雏形
- 1. Servlet作为控制器 (Controller):
- 2. JSP作为视图 (View):
- 第五部分:演进与总结
- 1. 现代发展
- 2. 为什么还要学?
- 总结
Java Web开发的基石:深入理解Servlet与JSP
引言
还记得早期充满活力的互联网吗?那时的网站虽然简单,但却奠定了现代Web应用的基础。在Java的世界里,Servlet和JSP正是这段历史的见证者和奠基者。即使今天已被Spring等框架笼罩,但理解它们,就如同习武之人修习内功心法,是成为JavaWeb高手不可或缺的一环。今天,就让我们一起揭开它们的神秘面纱。
第一部分:为什么我们需要Servlet和JSP?—— 历史的背景
在早期Web开发中,存在一个核心问题:如何让静态的HTML页面变得动态,能够根据用户请求、时间或数据库中的数据发生变化?
-
CGI(通用网关接口):早期解决方案,但每个请求都需启动新进程,性能低下。
-
ASP, PHP:微软和开源社区的解决方案,将代码直接嵌入HTML。
-
Java的答案:Java需要一种既能利用其强大的企业级能力(多线程、安全、跨平台),又能高效生成动态内容的技术。于是,Servlet 和 JSP 应运而生,成为了Java EE(现Jakarta EE)Web规范的核心。
第二部分:Servlet —— 背后的指挥官
1. 什么是Servlet?
Servlet是一个运行在服务器端的Java程序,它接收和响应客户端的请求(通常是HTTP)。你可以把它想象成一个后台指挥官,它负责处理业务逻辑,但自己不直接生产HTML页面。
2. 它的工作原理
-
用户在浏览器点击链接或提交表单(发送一个
HTTP
请求)。 -
Web服务器(如
Tomcat
)接收到请求。 -
服务器根据URL映射找到对应的
Servlet
。 -
服务器调用Servlet的
service()
,doGet()
或doPost()
方法。 -
Servlet执行逻辑:查询数据库、计算、调用其他服务等。
-
Servlet将结果(通常通过PrintWriter对象)以HTML格式输出给客户端。
-
浏览器渲染HTML,用户看到动态生成的页面。
3. 一个简单的Servlet示例
@WebServlet("/hello") // 注解配置访问路径
public class HelloServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();try {out.println("<!DOCTYPE html>");out.println("<html><head><title>Hello World</title></head>");out.println("<body>");out.println("<h1>你好," + request.getParameter("name") + "!</h1>");out.println("</body></html>");} finally {out.close();}}
}
痛点:在Java代码中拼接HTML字符串非常繁琐且容易出错,不利于前端和后台的协作开发。这就引出了JSP。
第三部分:JSP —— 前台的视图渲染师
1. 什么是JSP?
JSP(JavaServer Pages
)的本质就是一个Servlet。它允许你将Java代码直接嵌入到HTML页面中。它的设计目的是为了更方便地编写动态页面,让前端开发者能更轻松地参与。
核心思想:“在HTML中写Java” 而不是 “在Java中写HTML”。
2. 它的工作原理
用户请求一个.jsp
页面。
Web容器(如Tomcat
)会先将JSP文件翻译成一个Servlet类(.java
文件)。
然后编译这个Servlet类(.class
文件)。
最后像执行普通Servlet一样执行它,输出最终的HTML。
所以,JSP只是编写Servlet的一种更便捷的方式,最终都会变成Servlet。
3. 一个简单的JSP示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Hello JSP</title>
</head>
<body><%String name = request.getParameter("name");if (name == null) name = "Visitor";%><h1>你好,<%= name %>!</h1><p>当前时间是:<%= new java.util.Date() %></p>
</body>
</html>
可以看到,HTML结构非常清晰,Java代码只是作为脚本片段 (<% … %>) 和表达式 (<%= … %>) 插入其中。
第四部分:Servlet + JSP 的完美协作 —— MVC模式的雏形
很快,开发者发现将全部逻辑(Controller和Model)和视图(View)都写在JSP里会导致代码混乱(被称为“Spaghetti Code”,面条代码)。于是,最佳实践出现了:
结合使用Servlet和JSP,形成早期的MVC模式:
1. Servlet作为控制器 (Controller):
-
接收用户请求。
-
处理业务逻辑(调用
Service
、DAO
层,操作Model
)。 -
将处理结果(数据对象)放入请求域(
request.setAttribute()
)。 -
转发请求(
request.getRequestDispatcher().forward()
)给JSP页面。
2. JSP作为视图 (View):
-
专注于显示和渲染。
-
使用JSTL/EL表达式从请求域中获取Servlet传来的数据。
-
生成最终的HTML页面。
示例流程:
-
用户访问
/userinfo
。 -
UserInfoServlet
处理,从数据库查询用户数据 User user = userDao.findById(1);。 -
request.setAttribute("user", user);
// 将用户数据放入请求 -
request.getRequestDispatcher("/userInfo.jsp").forward(request, response);
// 转发 -
userInfo.jsp
使用${user.name}
等EL
表达式显示用户信息。
这种职责分离的设计,为后来Spring MVC等框架的流行奠定了理念基础。
第五部分:演进与总结
1. 现代发展
如今,纯Servlet和JSP的直接使用已大幅减少,取而代之的是更强大的MVC框架(如Spring MVC)、模板引擎(如Thymeleaf, FreeMarker)以及前后端分离架构(React/Vue + Spring Boot API)。
2. 为什么还要学?
-
理解根基:所有Java Web框架都是对Servlet和JSP的封装和扩展。懂了它们,才能深刻理解框架的原理。
-
排查问题:遇到深层问题(如过滤器、会话管理)时,Servlet知识至关重要。
-
维护老系统:很多传统企业系统仍基于这些技术。
总结
Servlet是藏在幕后的业务处理大师,而JSP是站在台前的页面渲染师。它们一前一后,紧密配合,共同构成了Java Web开发的原始基石。 虽然时代在变,新技术层出不穷,但了解历史才能更好地驾驭未来。