欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈jsp与servlet

程序员文章站 2022-06-03 08:33:06
...

前言

在JavaWeb中,jsp和servlet都扮演着重要的角色。如果你之前有看过我的一篇关于web容器的文章(https://blog.csdn.net/PANDORA_A/article/details/106903844)的话,那你应该对jsp和servlet之间的关系有一定的了解,简单总结一下,jsp运行时会被编译成servlet,因此jsp本质上就是一种servlet。那么问题来了,既然二者本质上是同一种东西,那为什么需要分开成两个呢,也就是说,他们各自负责的功能是什么呢?那么通过本篇文章,希望你能对这两者有一个更深刻的了解。

1.回到最初的起点(jsp和servlet是如何出现的)

(本章内容转载自https://zhuanlan.zhihu.com/p/42343690https://zhuanlan.zhihu.com/p/69832497
1987年9月20日,有人从北京向海外发出了中国第一封电子邮件。邮件内容为“Across the GreatWall we can reach every corner in the world(越过长城,走向世界)”,发送时间是北京时间1987年9月20日20时55分。这预示着,互联网时代悄然叩响了中国的大门。

让我们将目光从中国转向海外。上世纪的90年代,当时的互联网还是天地初开、一片混沌。而1995年以及随后的一年,可谓群雄逐鹿风起云涌,注定不平凡。而当时,我还在家里玩泥巴。

1995年5月,SUN公司发布了Java。名字取得很随意,据说是因为那群创始人当时正好在咖啡店激烈讨论取什么名字。其中有一个人望着手中的咖啡突然灵机一动:卧槽,就叫Java吧。这就好比农村生娃,老爹一看,卧槽,这孩子骨骼惊奇,面相清秀,就叫…二狗子吧,的感觉一样一样的。几乎同年,也不知道稍早还是稍晚,反正不重要,PHP也发布了。当时的人们还不知道,它将被黑为“世界上最好的语言”。次年,一个叫布兰登·艾奇(Brendan Eich,1961年~)的技术员,应老板要求花了10+天,借鉴几大语言的优秀特性(包括Java),写出了LiveScript。而为了在发布时蹭Java热度扩大宣传,不惜改名JavaScript。所谓慢工出细活,所以…JavaScript只写了10多天,自然是…好在后来也挽救回来了,现在好歹是GitHub提交量最多的语言,而前端这几年也是火得不行。

我们知道,浏览器能通过解析html语句渲染出页面。
浅谈jsp与servlet

关键是这些html语句怎么来的?是不是需要浏览器通过http请求某个页面,然后服务器根据浏览器的请求,通过http响应对应页面的html语句回去?而服务器端是我们用Java开发的,它用什么响应这一大堆html语句?答案就是:Servlet

随手用MyEclipse新建一个Servlet,你会看到,生成的Servlet默认的模板是这样的:
浅谈jsp与servlet

关键是这些html语句怎么来的?是不是需要浏览器通过http请求某个页面,然后服务器根据浏览器的请求,通过http响应对应页面的html语句回去?而服务器端是我们用Java开发的,它用什么响应这一大堆html语句?答案就是:Servlet!随手用MyEclipse新建一个Servlet,你会看到,生成的Servlet默认的模板是这样的:

可以看到Servlet的doGet()和doPost()方法体中有响应html片段的代码。这其实是上古时期开发习惯的“遗迹”。都2018年了,MyEclipse还自作聪明,以为你会在Servlet中手动输出HTML片段。诚然,在早期的JavaWeb开发中,我们的程序猿祖先确实有那么一段黑暗时光,但那是因为当时还没有现在这么多、这么好用的模板和框架。

上古时代,通常情况是美工写好html静态页面后,丢给Java程序员。Java程序猿在Servlet中调用Service拿到数据后,逐句复制html静态页面上的html语句到Servlet的中,根据情况将后端的数据与html片段拼接在一起,然后通过以下格式输出。

out.println("<span>用户名是:"+user.age+<"/span>")

浅谈jsp与servlet
而同时期的PHP,http://ASP.Net就优秀得多了,人家压根不搞你这繁琐的一套。它们选择在html页面中嵌入相应语言来引入动态数据,避免了手动拷贝html片段输出的尴尬局面。
浅谈jsp与servlet

因为仔细想来,我们的主要目的就是希望在最终输出的html的代码中嵌入后台数据罢了。除了把html语句拿出来在Servlet里拼接好再输出这种方式外,我们也可以直接在html语句中写入动态数据(注意,不是HTML文件,必须是JSP之类的动态模板文件中的HTML语句)。而这两种几乎是完全相反的设计思路!

一部分Java程序员一看,就傻眼了:我靠,PHP还真是世界上最好的语言啊,Web开发竟然如此之简单!老子再也不想复制粘贴了!于是转向了PHP或者其他语言的开发。就这样,Java流失了一部分程序员。SUN公司一看,这不行啊,Java也要搞一个。于是,JSP应运而生。

2.什么是jsp

JSP,全称JavaServer Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,在传统的网页HTML(标准通用标记语言的子集)文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件。
JSP与HTML不同,JSP是动态页面,HTML是静态页面。换言之,HTML可以直接访问,而JSP需要在服务器上经历一次动态资源(JSP)到静态资源(HTML)的转化,服务器会自动帮我们把JSP中的HTML片段和数据拼接成静态资源响应给浏览器,最后响应给客户端的则是已经转换好的HTML文件,然后客户端通过浏览器解析、展示。
浅谈jsp与servlet
简单来说,JSP = HTML + Java片段
那么既然jsp会转化成html,并且大部分人在刚开始学习jsp时也会认为,jsp和html没多大区别,为什么我们又说jsp本质上又是servlet呢?
要明白这个问题,我们需要先复习一下servlet是什么。

3.什么是servlet

Servlet是sun公司提供的一门用于开发动态web资源的技术,Servlet运行在Tomcat容器当中。sun公司在其API中提供了一个servlet接口,用户可以通过实现这个接口,开发一个Java程序向处理客户端发出的请求和发出相应。
servlet属于服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

servlet功能:
浅谈jsp与servlet

jsp与servlet的关系

了解完servlet后,我们可以来捋清他们俩之间的关系了。

联系:
WEB容器接收到以.jsp为扩展名的URL的访问请求时,它将把该请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
从二者的功能看,jsp和servlet都可以交互式地浏览和修改数据,生成动态Web内容。换言之,二者都和服务器相关,与服务器进行数据交互,二者都能转化为html页面。

区别:
虽然二者本质相同,但是二者负责的内容有所差异,jsp更注重前端显示(支持html标签),servlet更注重模型和业务逻辑。我们自己写代码的时候尽量能让它们各司其职,不要意图写出万能的jsp或servlet来,使得jsp或servlet代码变得臃肿不堪。

相关标签: java web jsp