深入了解 JSP 的运行过程
JSP(全称JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种==动态==网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。
JSP 主要作用
- 代替 Servlet 程序回传 HTML 页面的数据。
接下来我们去看看 JSP 是如何实现代替 Servlet 的。
如果我们访问一个 Servlet 程序,让它返回给我们一个前端页面,那么就需要在 JavaWEB 项目下编写一个 HelloServlet 程序:
当我们启动程序,在浏览器访问http://localhost:8080/hello-servlet 时,浏览器会回传显示一个简单的页面
按 F12 进入开发者模式,可以看到 Servlet 程序响应回传了我们在Servlet 程序中拼接的 html 代码。
那么到这里还不能让我们明白 JSP 就是一个 Servlet,再往下看。
我们创建一个JSP 文件 index.jsp,这样启动项目时,自动弹出的首页就是我们的 index.jsp 页面。
我们启动项目
从控制台找到项目部署路径
我们直接访问此路径,可以看到目录下存在的文件。
进入work\\Catalina\\localhost\\ROOT\\org\\apache\\jsp 目录,可以看到存在的两个文件【index_jsp.java】和【index_jsp.class】
接着我们将这两个文件删除,同时在浏览器进行刷新页面,可以看到目录下新增了我们刚删除的两个文件【index_jsp.java】和【index_jsp.class】
接着,我们使用 Notepad++ 打开【index_jsp.java】文件,查看编译之后的 Java 文件代码。
可以看到 index.jsp 中 HTML 部分的代码被嵌入在 java 代码中,这和我们一开始在 HelloServlet 中拼接的 HTML 代码一摸一样。
查看源码我们可以看见 index_jsp 继承了 org.apache.jasper.runtime.HttpJspBase 类,
我们继续查看 org.apache.jasper.runtime.HttpJspBase 类的源码,可以发现,HttpJspBase 类直接继承了 HttpServlet类。也就是说,JSP 翻译出来的 index_jsp.java 类,它间接了继承 HttpServlet 类,这和我们直接编写 Servlet 程序继承 HttpServlet 类 是一样的。
因此 JSP 本质就是一个 Servlet 程序。它可以省掉不少我们在 Servlet 中拼接 HTML 代码的时间。不过随着前后端分离的出现,JSP 也逐渐被淘汰。
当我们第一次访问 JSP 页面的时候,Tomcat 服务器主要会帮我们完成:
- 把 JSP 页面翻译成为一个 .java 源文件
- 对 .java 源文件编译成为 .class 字节码文件
- 执行 .class 字节码文件返回结果
当我们第二次访问 JSP 页面的时候,如果未做更改,则使用上次编译的 .class 文件;若修改过,则重新编译。
盘点 6 个被淘汰的 Java 技术,它们都曾经风光过
大家好啊,今天栈长给大家分享下我的开发历程中,我知道的那些被淘汰的技术或者框架,有些我甚至都没有用过,但我知道它曾经风光过。
废话不多说,下面我要开始吹了……
1、Swing
下面这个是用 swing 开发的:
图来源网络,有没有似曾相识的感觉?懂的自然懂!
栈长去年中秋也用过 swing:
这个中秋,我用 Java 画了一个月饼!
Swing 算是 Java 早期代替 AWT 的桌面应用 GUI 开发工具包,一个听到就已经淘汰的技术,给我的感觉就是丑丑丑!现在与 AWT 一起在时间这个长河里长眠。
如果 Java GUI 库发展历程分为三代,可以是:
AWT > SWING > JAVAFX
随着 JavaFx 的发布,加速 SWING 的被淘汰。下面这个是用 JavaFx 开发的:
图来源:zhihu.com/question/54498643/answer/271632290
现在 JavaFx 也有十来年了,虽然这篇帖子也在说 JavaFx 淘汰了的,只是现在桌面应用不是主流吧,我也没用过不敢乱说,JavaFx 在桌面应用开发应该还是有一席之地的。
2、JSF
JSF:Java Server Faces
JSF是一种用于构建 Java Web 应用程序的表现层框架,和 Struts 一样性质的框架。
图来源:https://javabeat.net/jsf-2/
国内用 JSF 的比较少,有也是老系统了,国外应该还有用 JSF 的,不过随着 Spring MVC, Spring Boot 的横空出世,JSF 应该也是过时的技术了。
3、EJB
EJB也是个神器,只见其影,未见其身。前些年,在网上各个面试题还有它的身影,现在估计很难见到了。
EJB:Enterprise Java Beans,即:企业Java Beans
Sun公司发布的文档中对 EJB 的定义是:EJB 是用于开发和部署多层结构的、分布式的、面向对象的 Java 应用系统的跨平台的构件体系结构。
简单来说,EJB就是部署分布式系统用的,就是把A程序放在服务器上,通过B客户端来调用,并且是跨平台的。
图来源:oreilly.com
因为 EJB 过于复杂和笨重,调试非常麻烦,现在都被轻量级的 RPC 框架(Dubbo)及轻量级 Restful 形式的分布式框架 (Spring Cloud) 替代了。
4、JSP
JSP 全称:Java Server Pages,是由早期的 Sun 公司发布的一种动态网页开发技术,即在 HTML 网页代码中嵌入 JSP 标签的 Java 代码实现动态网页。
JSP 代码示例:
这个示例只是简单的调用 JSP 的内置 out 对象在页面输出展示一句话。
JSP 的本质其实就是 Servlet,JSP 文件被编译之后,就变成了 Servlet Java 类文件,因为 JVM 虚拟机只能识别 Java 字节码文件,而不能识别 JSP 文件。
在 JSP 的时代,那时候还没有前后端分离的说法,JSP 可以包揽全部,即实现静态页面,又实现动态代码逻辑,全部都在一个 JSP 文件里面。这样,一个程序员既是前端,又是后端。
但是,现如今在前后端分离的热潮下,前后端分工明确,后端只负责业务逻辑的接口开发,前端负责调用后端接口再做页面数据封装展示,JSP 几乎是被淘汰了。
虽然 JSP 是被前后端分离取代了,但并不说明 JSP 没有用了,不是所有系统都是前后端分离的,比如说一个只有两三个页面的动态系统,JSP、Servlet足以搞定,你总不能上页面模板引擎、各种框架,或者再上前后端分离吧?
5、Struts
Struts2 那些年可谓是风光无限啊,Struts2 + Spring + Hibernate 三大框架一起组成了 “SSH“————牛逼哄哄的 Java Web 框架三剑客。
Struts 这篇就不多说了,具体看这篇:Struts2 为什么被淘汰?
6、Memcached
Redis 这几年的大热,现在已经替代 Memcached 成为缓存技术的首要中间件,作为大厂的带头兵,在 BAT 里面,Redis 也已经逐渐取代了 Memcached,广泛使用 Redis 作为缓存应用方案。
为什么 Redis 能后来居上呢?
1)速度更快
Memcached 使用的是多线程模型,既然是多线程,就会因为全局加锁而带来性能损耗。而 Redis 使用的是单线程模型,没有锁竞争,速度非常快。
相关阅读:Redis 到底是单线程还是多线程?
2)数据类型更丰富
Memcached 数据类型非常单一,只支持 String 数据类型,在业务实现上就非常有瓶颈。
而 Redis 支持 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(sorted set:有序集合) 等……丰富的数据类型可以让 Redis 在业务上大展拳脚。
这也是 Redis 能代替 Memcached 最重要的原因之一。
相关阅读:Redis 的 8 大应用场景!
并且,Memcached 值最大上限为:1M,而 Redis 最大可以到:1GB。
3)数据持久化
Memcached 不支持持久化,Redis 支持。
缓存服务器断电后,Memcached 的数据是不能恢复的,而 Redis 可以将数据保久化在磁盘中,服务器重启的后可以加载再次使用,不会造成数据断电丢失。
比如,有些数据是直接放在缓存数据库中的,其他地方可能没有备份,如果丢失了,那可能会造成业务影响,这也是 Redis 非常有用的一个保障特性。
总结
好了,今天栈长列举了 6 个经典的即将被淘汰的技术或框架,虽然这些技术现在面临淘汰,但它们曾经也风光过,值得敬畏。
另外,虽然这些技术要被淘汰了,但不说明它们没有用了,它们依然在被运用,只是现在不是主流了。
最后,在大家的开发历程中,你都遇到过哪些曾经很风光,但现在即将被淘汰的技术呢?欢迎大家留言分享讨论~
关注我,分享更多好玩的Java技术~
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。