前言
在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/42343690和https://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语句渲染出页面。
关键是这些html语句怎么来的?是不是需要浏览器通过http请求某个页面,然后服务器根据浏览器的请求,通过http响应对应页面的html语句回去?而服务器端是我们用Java开发的,它用什么响应这一大堆html语句?答案就是:Servlet!
随手用MyEclipse新建一个Servlet,你会看到,生成的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>")
而同时期的PHP,http://ASP.Net就优秀得多了,人家压根不搞你这繁琐的一套。它们选择在html页面中嵌入相应语言来引入动态数据,避免了手动拷贝html片段输出的尴尬局面。
因为仔细想来,我们的主要目的就是希望在最终输出的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 = 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的关系
了解完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代码变得臃肿不堪。