ASP.NET 与 JSP 都是【先把页面在服务器上拼好再送出去】的路线,区别在于编译时机;JSP 会先被编译成一个 Servlet,所以它慢只慢在第一次。
8-4 讲的是前端那一侧,这一节转到后端:服务器怎么把页面拼出来。教材 8-5 的并列关键词是【ASP.NET、JSP、编译型语言、Java Servlet】——其中 Servlet 是理解这一节的关键,因为 JSP 最终就是 Servlet。
一、两条路线:页面在哪儿拼
生成一个动态页面的方式,只有两条大路线:
- 服务器端拼装——服务器把数据填进模板,拼成完整 HTML 再发下去。ASP.NET、JSP、PHP 都走这条。
- 客户端拼装——服务器只发数据和一段程序,浏览器自己把界面画出来。React、Vue 走这条。
ASP.NET 与 JSP 都属于第一条。它们的共同点是:浏览器收到的是一份已经写好的 HTML, 所以不需要等 JavaScript 跑起来就能看到内容——这一点对搜索引擎和首屏速度都有好处。
二、今天谁还在用:看得到的那部分
后端框架有个麻烦——它不像前端那样会留下痕迹, 所以探测到的只是能探测到的那部分:只有 15.5% 的网站能检测出后端框架, 而且 96.4% 的网站只用了一个。
在能探测到的这些里,份额是这样的:
- ASP.NET 25.1%,Ruby on Rails 23.2%,Next.js 13.5%,Laravel 10.8%。
- ASP.NET Core 4.3%,Express 3.7%,Jakarta Servlet 2.1%,JSP 1.2%。
具体到这两个的比较: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 本身也换了节奏:从几年一个大版本,改成每半年一个版本、 每两年选一个长期支持版。这直接影响了企业该多久升一次级。
四、编译型和解释型:差别在【第一次】
这一节真正的技术点是编译时机:
- 编译型(ASP.NET、Servlet)——先编译成中间码或机器码,再执行,之后每次都快。
- 半编译(JSP)——第一次被访问时先编译成 Servlet,之后就走 Servlet。
- 解释型(PHP、Python)——每次请求现场解释,靠操作码缓存来救。
所以 JSP 慢只慢在第一次:改一次文件,就再慢一次。 生产环境里改完文件立刻被大量访问,就会集中出现一批慢请求—— 这正是【上线要预热】这句话的由来。
Servlet 自己的生命周期只有三步:
- init——初始化一次,只跑一遍。
- service——每次请求都跑,在里面判断该交给 doGet 还是 doPost。
- destroy——服务器关闭或应用卸载时收尾,也只跑一遍。
关键是: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 秒实验
- 打开一个你常访问的网站,看响应头里有没有
X-AspNet-Version或JSESSIONID这样的线索。 - 在浏览器里访问一个
.jsp结尾的地址,再访问一次,感受第一次和第二次的差别。 - 查一下本地一个 Java 项目的
web.xml或注解,找出它定义了几个 Servlet。
常见误区
- 错误:JSP 已经淘汰了。——纠正:它在全球排第 14 位左右,在中国等市场仍排进前几名;老技术不等于没人用。
- 错误:JSP 和 Servlet 是两种技术。——纠正:JSP 第一次被访问时会编译成一个 Servlet,运行时它们其实是同一个机制。
- 错误:Servlet 每次请求都会新建一个对象。——纠正:它是常驻内存的单例,所以性能好,但也意味着不要在里面存用户状态。
自测三问(点开对答案)
1. JSP 和 Servlet 是什么关系? —— **JSP 第一次被访问时会先编译成 Servlet**,之后每次访问走的都是那个 Servlet。所以 JSP 慢只慢在第一次。 2. Servlet 的生命周期有哪三步? —— **init(一次)→ service(每次请求)→ destroy(一次)。** 注意它是常驻对象,里面的状态所有用户共享。 3. 为什么同一项技术在不同国家流行程度能差好几倍? —— **因为决定它的是当地企业的存量系统和技术栈惯性**,不是技术本身的优劣——JSP 在中国是美国的 5.3 倍。- ☐ 下一节(8-6 前端与后端的边界:前端、后端、Node.js)
相关笔记
- 应用程序的设计理念 —— 上一节讲分层,这一节看具体技术怎么落在层上
- 开发框架 —— 上一节的前端框架刚好是另一条路线的代表
- Web服务器的外观与内部结构 —— 服务器上到底装了什么
- 程序的启动 —— CGI 那套更早的做法
- 网络基础 —— Java 在服务端的能力从哪来
- 源代码、执行文件、编译器、解释器-转换成计算机能处理的格式 —— 编译与解释的系统讲法
- 🕸️ Web技术原理 · 索引