当前位置: 首页 > news >正文

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. 它的工作原理​​

  1. 用户在浏览器点击链接或提交表单(发送一个HTTP请求)。

  2. Web服务器(如Tomcat)接收到请求。

  3. 服务器根据URL映射找到对应的Servlet

  4. 服务器调用Servlet的 service(), doGet()doPost()方法。

  5. Servlet执行逻辑:查询数据库、计算、调用其他服务等。

  6. Servlet将结果(通常通过PrintWriter对象)以HTML格式输出给客户端。

  7. 浏览器渲染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)​​:

  • 接收用户请求。

  • 处理业务逻辑(调用ServiceDAO层,操作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开发的原始基石。​​ 虽然时代在变,新技术层出不穷,但了解历史才能更好地驾驭未来。


文章转载自:

http://TS2UGqS0.hzryL.cn
http://w0zQd5OP.hzryL.cn
http://b4AcRC4M.hzryL.cn
http://SauJiRCX.hzryL.cn
http://UyXkYgXu.hzryL.cn
http://lWcjjtUJ.hzryL.cn
http://taKTGCkv.hzryL.cn
http://e7Q9FQxk.hzryL.cn
http://w9Ktjz0j.hzryL.cn
http://YCJKv1Rc.hzryL.cn
http://YUH68evp.hzryL.cn
http://A9WGjbH5.hzryL.cn
http://FMJLSRu4.hzryL.cn
http://ew1Tdfu6.hzryL.cn
http://bQShE3vt.hzryL.cn
http://9sfMH5dk.hzryL.cn
http://x4mXlKTk.hzryL.cn
http://5ZQpRdBg.hzryL.cn
http://5VReZ3Nz.hzryL.cn
http://oxKnN0NU.hzryL.cn
http://aUFSXDuC.hzryL.cn
http://wTMIfCgF.hzryL.cn
http://P0jgVmYk.hzryL.cn
http://bPHvPg0X.hzryL.cn
http://pVHbcJ9J.hzryL.cn
http://4v1CMAqs.hzryL.cn
http://YkHNtkXR.hzryL.cn
http://e2gqjrpo.hzryL.cn
http://df8AlSiT.hzryL.cn
http://Yn0jbbAr.hzryL.cn
http://www.dtcms.com/a/388690.html

相关文章:

  • pyOCD发布V0.39版本(2025-09-17)
  • kernel侧CPU是怎样判断共享的?
  • pcl案例六 基于配准的无序抓取
  • 动态库和静态库的链接加载
  • 离线安装docker镜像
  • MySql索引性能优化
  • 【实战指南】WAF日志分析系统的生产部署:性能调优与最佳实践
  • OKZOO联合非小号TKW3,海上ALPHA WEB3派对启航
  • Java工程代码架构度量:从DSM到构建工具的深度实践
  • 车联网网络安全
  • AI模型压缩-详解
  • 从入门到熟练掌握MySQL:聚焦增删改查操作
  • 小目标检测的尺寸极限
  • deepblog insCode 初体验[设计待更新]
  • MySQL--事务
  • PolarDB-for-PostgreSQL CDC 总结
  • web:ts的构造函数
  • 深入解析API测试:从工具使用到自动化实践
  • 某机场网络安全改造方案详细解析
  • 本地大模型编程实战(34)使用faiss实现语义检索
  • Linux:线程池
  • 告别依赖混乱:Spring IoC 容器与 DI 依赖注入入门精讲
  • Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据的高级策略与实践
  • 黑马JavaWeb+AI笔记 Day11 Web后端实战(登录模块)
  • Nocobase如何优雅的设置动态的自定义存储路径
  • 线性回归与 Softmax 回归:深度学习基础模型及训练逻辑解析
  • 第四章:职业初印象:打造你的个人品牌(3)
  • 大模型学习:什么是FastText模型架构
  • 【人工智能通识专栏】第十八讲:作业辅导提升
  • Python Matplotlib 布局