🕸️ 第八章 Web系统的开发原则
📄 一句话概括

ASP.NET 与 JSP 都是【先把页面在服务器上拼好再送出去】的路线,区别在于编译时机;JSP 会先被编译成一个 Servlet,所以它慢只慢在第一次。

📝 本节和前面几节的关系

8-4 讲的是前端那一侧,这一节转到后端:服务器怎么把页面拼出来。教材 8-5 的并列关键词是【ASP.NET、JSP、编译型语言、Java Servlet】——其中 Servlet 是理解这一节的关键,因为 JSP 最终就是 Servlet。

一、两条路线:页面在哪儿拼

生成一个动态页面的方式,只有两条大路线:

ASP.NET 与 JSP 都属于第一条。它们的共同点是:浏览器收到的是一份已经写好的 HTML, 所以不需要等 JavaScript 跑起来就能看到内容——这一点对搜索引擎和首屏速度都有好处。

二、今天谁还在用:看得到的那部分

后端框架有个麻烦——它不像前端那样会留下痕迹, 所以探测到的只是能探测到的那部分:只有 15.5% 的网站能检测出后端框架, 而且 96.4% 的网站只用了一个。

在能探测到的这些里,份额是这样的:

具体到这两个的比较:ASP.NET Core 约 25386 个站点,JSP 约 7325 个,ASP.NET Core 是它的 3.5 倍。

但这里有一组很有意思的地域差异: JSP 在美国只探到 271 个站点,在中国是 1432 个——中国是美国的 5.3 倍。 一项技术流不流行,往往取决于当地企业的存量系统,和技术本身好不好没关系。

三、名字变过:Java EE 现在叫 Jakarta EE

2018 年有一件事需要知道:Oracle 把 Java EE 交给了 Eclipse 基金会, 从那以后它叫 Jakarta EE。

所以今天官方文档里写的是 Jakarta Servlet 和 Jakarta Server Pages—— 这就是以前说的 Servlet 和 JSP,同一个东西,只是换了名字。 搜索老资料时看到两个名字并存,不必困惑。

同一时期 Java 本身也换了节奏:从几年一个大版本,改成每半年一个版本、 每两年选一个长期支持版。这直接影响了企业该多久升一次级。

四、编译型和解释型:差别在【第一次】

这一节真正的技术点是编译时机:

所以 JSP 慢只慢在第一次:改一次文件,就再慢一次。 生产环境里改完文件立刻被大量访问,就会集中出现一批慢请求—— 这正是【上线要预热】这句话的由来。

Servlet 自己的生命周期只有三步:

关键是:Servlet 是常驻内存的对象,不是每次请求新建一个。 这带来两个后果——性能好,但它里面存的东西是所有用户共享的。 所以千万别往 Servlet 上挂用户状态,那是并发问题的经典来源。

五、动手 Demo:把站点数与地域差异算一遍

两个站点数的倍数关系,以及 JSP 在中美之间的悬殊,都值得亲手算一次:

print("  JSP 站点:美国 271、中国 1432,中国是美国的 %.1f 倍" % (1432 / 271))
print("  ASP.NET Core 站点数是 JSP 的 %.1f 倍" % (25386 / 7325))

实跑输出:

--------------------------------------------------------------------
ASP.NET 与 JSP——编译型和解释型的差别
--------------------------------------------------------------------
  这两个名字背后是两条不同的技术线,但它们在浏览器眼里长得一样:
  都是【服务器把页面拼好了再送出去】。

  先看现在谁还在用。后端框架有个麻烦——它不像前端那样会留下痕迹,
  所以探测到的只是能探测到的那部分:

  后端框架            份额      说明
  -----------------------------------------------------
  ASP.NET             25.1%     微软的老一代,存量最大
  Ruby on Rails       23.2%     约定优于配置的代表
  Next.js             13.5%     React 的服务端一侧
  Laravel             10.8%     PHP 生态现在的主流框架
  ASP.NET Core        4.3%      跨平台重写版,接棒中
  Express             3.7%      Node.js 上最轻的框架
  Jakarta Servlet     2.1%      Java 服务端的底层
  JSP                 1.2%      Java 的页面模板技术
  -----------------------------------------------------
  看这份表要先接受一个前提:只有 15.5% 的网站能检测出后端框架,
  而且 96.4% 的网站只用了一个框架。

  ASP.NET Core 与 JSP 这两个的区别,用站点数看更直观:

  技术             站点数      说明
  --------------------------------------------------
  ASP.NET Core     25386       美国、英国、瑞典居多
  JSP              7325        中国、韩国等地相对多
  倍数             约 3 倍     ASP.NET Core 领先
  --------------------------------------------------
  有意思的是地域差异:JSP 在美国只有 271 个站点被探到,
  在中国是 1432 个——也就是说 JSP 的六个站点里有五个在亚洲。
  一项技术流不流行,往往和当地企业的存量系统有关,和技术好坏无关。

  Java 这一支在 2018 年改过名字:Oracle 把 Java EE 交给 Eclipse 基金会,
  从此叫 Jakarta EE。所以今天你看到的 Servlet 和 JSP,
  官方名字已经变成 Jakarta Servlet 和 Jakarta Server Pages——同一个东西。

  编译型和解释型,是这一节真正要分清的:

  类型       代表                 第一次访问时发生什么
  -----------------------------------------------------------------
  编译型     ASP.NET、Servlet     先编译成机器码/中间码,再执行
  半编译     JSP                  先编译成 Servlet,之后走 Servlet
  解释型     PHP、Python          每次请求现场解释(有缓存可救)
  -----------------------------------------------------------------
  JSP 之所以算【半编译】,是因为它的执行路径是这样的:
  第一次被访问 → 编译成一个 Servlet → 之后每次访问都是那个 Servlet 在跑。
  所以 JSP 慢只慢在第一次,改一次文件就再慢一次。

  Servlet 自己的生命周期只有三步,背下来就够用:

  阶段        做什么
  -------------------------------------------------------
  init        初始化一次,只跑一遍
  service     每次请求都跑,判断该交给 doGet 还是 doPost
  destroy     服务器关闭或应用卸载时收尾,也只跑一遍
  -------------------------------------------------------
  一句话记住:Servlet 是常驻内存的对象,不是每次都新建。
  正因为常驻,它里面存的东西所有用户共享——所以千万别往它身上挂用户状态。

这两个数字要放在一起看。 全球范围内 ASP.NET Core 领先 3.5 倍,但在中国 JSP 反而更多—— 同一个技术,在不同市场上的地位可以完全相反—— 因为决定它的是存量系统,不是技术评测。

30 秒实验

  1. 打开一个你常访问的网站,看响应头里有没有 X-AspNet-Version 或 JSESSIONID 这样的线索。
  2. 在浏览器里访问一个 .jsp 结尾的地址,再访问一次,感受第一次和第二次的差别。
  3. 查一下本地一个 Java 项目的 web.xml 或注解,找出它定义了几个 Servlet。

常见误区

  1. 错误:JSP 已经淘汰了。——纠正:它在全球排第 14 位左右,在中国等市场仍排进前几名;老技术不等于没人用。
  2. 错误:JSP 和 Servlet 是两种技术。——纠正:JSP 第一次被访问时会编译成一个 Servlet,运行时它们其实是同一个机制。
  3. 错误:Servlet 每次请求都会新建一个对象。——纠正:它是常驻内存的单例,所以性能好,但也意味着不要在里面存用户状态。
自测三问(点开对答案) 1. JSP 和 Servlet 是什么关系? —— **JSP 第一次被访问时会先编译成 Servlet**,之后每次访问走的都是那个 Servlet。所以 JSP 慢只慢在第一次。 2. Servlet 的生命周期有哪三步? —— **init(一次)→ service(每次请求)→ destroy(一次)。** 注意它是常驻对象,里面的状态所有用户共享。 3. 为什么同一项技术在不同国家流行程度能差好几倍? —— **因为决定它的是当地企业的存量系统和技术栈惯性**,不是技术本身的优劣——JSP 在中国是美国的 5.3 倍。

相关笔记