ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Servlet基础

2020-08-09 13:31:31  阅读:272  来源: 互联网

标签:CGI WEB 容器 基础 接口 服务器 Servlet


必读20遍好文章:

https://www.oschina.net/question/12_52027

https://www.ibm.com/developerworks/cn/java/j-lo-servlet/

 

读文基础:计算机网络基础,参见阮一峰和我的理解

 

Servlet简介

Servlet技术是啥?干哈的?

那么这个web底层是啥呢?CGI又是啥呢?

CGI的工作原理和Perl性能问题

Servlet技术总结

Web/应用服务器是啥?干哈?Servlet容器是啥?干哈?Servlet?

WEB服务器是啥?

WEB服务器干哈?

WEB服务器总结

Servlet容器是啥?

Servlet容器Servlet之间有啥关系?

Servlet容器提供了什么?

Servlet大总结

接下来要读的是

 

 

Servlet简介

Servlet技术是啥?干哈的?

Servlet技术为创建基于web的应用程序提供了基于组件、独立平台的方法,可以不受CGI程序的性能限制。Servet有权限访问所有的Java API,包括企业级数据库的JDBC API。说白了就是Servlet技术实现了web底层的一个接口,而且能使用一些Java的API。 

 

那么这个web底层是啥呢?CGI又是啥呢?

【扯淡中】看到CGI又不得不使我想到Python实现web应用程序的WSGI接口。在Python里是这样描述WSGI接口的:我们都知道互联网之间的通信,有两种连接方式TCP连接和UDP连接,也就是socket。最古老的方式我们本地有一台计算机A要想和另一台计算机B通信,首先需要在计算机A中建立socket,这个socket被称为client(客户端),然后在建立的socket的参数中填写要访问计算机B(服务器)的ip地址和端口号,这样我们就做好访问计算机B的准备了。要想通信,计算机B当然也要有一个socket,只不过这个socket被称为server(服务器),建立它时需要指定本机地址和监听的端口号,这样当客户端对着服务器监听的端口发送一条HTTP请求时,服务器就能接收到,并有所反馈,这就完成了最原始的通信。但是实际中我们不是这样的啊,我本地没有写任何socket啊,但是我能通过浏览器访问百度啊,淘宝啊,在这个过程中,浏览器帮你实现了socket连接,浏览器就像是你客户端的代言人,它拿着你的身份证去给百度的服务器发送了一条请求,请求获取一些数据,然后百度的server就反馈给你一些响应的数据。在通信道路中,你按着我的身份证地址找我来要信息,我按着你的身份证把信息传递给你(这就属于互联网协议之间的事了)。这上面的整个过程,从接收HTTP请求、解析HTTP请求、发送HTTP响应,如果让你去一个一个的写,你光回头看HTTP规范就让你够呛!像这种底层的代码应该交由专门的服务器软件实现,我们不希望在接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们不必在关心这些东西,而只要专心业务逻辑。这个接口就是:WSGI,WSGI接口帮你封装了WEB服务器所干的事情,你所要做的就是实现你的业务逻辑就行。WSGI部分扯淡结束。

CGI的全称为通用网关接口,啥是通用网关呢?网关是干啥的呢?网关是有着逻辑程序的硬件设备,又叫网间连接器、协议转换器。网关在网络层以上实现网络互连。我们再来对比对比WSGI接口叫啥,要在对比中学习,WSGI全称是web服务器网关接口,以层的角度来看,WSGI接口所在层的位置低于CGI接口,但是WSGI比起CGI有很强的伸缩性且能运行多线程或多进程的环境,实际上WSGI并非CGI,因为其位于web应用程序与web服务器之间,而web服务器可以是CGI,mod_wsgi,或者是一个定义了WSGI接口标准的web服务器。粗略划分一下就是:

 

 

 

如果你了解WEB服务器,你更应该这样看:

 

 

 

细想想,CGI就是一个实现了某些规范(且称为CGI规范吧)的接口而已,在物理上就是一段程序。CGI接口是外部应用程序(cgi程序,实现了CGI接口的程序)与WEB服务器之间的接口标准,CGI接口允许Web服务器执行外部程序(cgi程序),并将它们的输出发送给Web浏览器。

说白了,你遵循这个CGI的接口就可以用cgi程序干一些事,比如说访问数据库数据,数据库传递数据给浏览器,这个过程你都遵循了CGI规范,因为它是web服务的标准规范。嗳?cgi程序明明都能实现用户与服务器之间的交互了,那不就完事了嘛?

这里我们再来说一下CGI接口的实现语言,CGI接口可以用任何一种语言编写,只要这种语言具有标准的输入、输出和环境变量,我们首选想到的肯定是C语言,C语言效率高啊,虽然C语言是跨平台的,但是C语言编写的程序不是跨平台的,这样可移植性就很差了啊!那Linux中的呢?Internet上大部分服务器都是使用UNIX操作系统,Linux上实现CGI的脚本是Bourne Shell(一个交换式的命令解释器和命令编程语言)编写的,它到Windows就又不通用了!怎么办?当然是找一个可移植的,易于修改的语言了,最终Perl胜出了,它成为了编写CGI接口的主流语言,以至于一般的cgi程序就是Perl程序。

 

CGI的工作原理和Perl性能问题

工作原理

 浏览器通过HTML表单或超链接请求指向一个cgi应用程序的URL。

 服务器发到这个请求。

 服务器执行指定cgi应用程序。

 cgi应用程序执行所需要的操作,通常是基于浏览者输入的内容。

 cgi应用程序把结果格式化为网络服务器和浏览器能够理解的文档(通常是HTML网页)。

 网络服务器把结果返回到浏览器中。

 

性能问题

cgi程序大多是Perl程序(因为CGI接口就是使用Perl语言编写的嘛),Perl语言的缺点我不得不吐槽一下(Java是世界上最好的语言),说到Perl我不得不说一下Python,Perl和Python的设计理念类似,都是以极简的代码实现复杂的功能(尽管赞美Java,但我内心想的是用Python真好),业界号称一行代码能实现Java几百行代码的功能,在简化程序员负担的同时却给系统性能造成了一定的影响,而且很多时候,perl.exe进程会占用很多的内存空间,这点让人感觉很不好。sun公司肯定不乐意用别人的东西了,我自己明明也是跨平台啊,我Java的性能多高了,别人的东西性能又不好,想用别人的东西还要搞一个perl.exe,烦不烦啊,花里胡哨的,凭啥搞你这套东西?不搞!我自己搞一套我自己的!所以sun公司用Java写了一套CGI接口,而这一套接口,以及对接口的实现扩展等等这些东西被统称为Servlet技术。

 

 

 

 

Servlet技术总结

现在在回头看看Servlet技术你大致就明白了,Servlet技术只不过是sun公司用Java语言实现了CGI规范的一套接口而已,它帮你封装好了从接收HTTP请求,解析HTTP请求,发送HTTP响应,建立TCP连接等等的一切底层东西,让你只关注你的业务,真正牛逼的是人家CGI的规范,接口的实现和用哪种语言实现并不牛逼。到这我脑子里又想捣鼓一些东西就是CGI(网关接口)。细想,socket客户端【传输层】发送的数据包给一个不在同一子网的计算机B时要经过网关【网络层】找到计算机B,和计算机B的某个应用程序Code【应用层】通信。计算机B中Code要想操作数据库并把数据返回给客户端,这就属于WWW技术规范了,web程序只有遵循了CGI接口的才允许你这样操作,如果不是一个web程序,你爱怎样操作数据库都没吊事,因为你操作也只是在本地操作,不会对别人的计算机造成危害。但是别人去访问你,让你操作你的数据库返回数据给他这就要有CGI规范来约定了。

 

 

Web/应用服务器是啥?干哈?Servlet容器是啥?干哈?Servlet?

参考WEB服务器应用服务器文章2。通俗的讲:Web服务器传送页面使浏览器可以浏览,而应用服务器提供的是客户端应用程序可以调用的方法。

 

WEB服务器是啥?

在这里主要要了解一下WEB服务器。WEB服务器也称WWW服务器,主要功能是提供网上信息浏览服务。WEB服务器可以解析HTTP协议,当WEB服务器收到一个HTTP请求,会返回一个HTTP响应,例如返回一个页面。为了处理一个请求,WEB服务器可以响应一个静态页面或图片,或进行页面跳转,或者把动态响应的产生委托给一些其他程序例如CGI程序,JSP页面,Servlet程序,ASP页面,服务端JavaScript脚本,或者一些其他的服务器端技术。无论它们的目的如何,这些服务器端的程序通常产生一个HTML的响应来让浏览器可以浏览。

 

WEB服务器干哈?

说白了WEB服务器主要功能封装一些底层的东西,比如说解析HTTP协议、建立HTTP连接、发送响应例如一些静态页面啊图片啊,或把响应处理委交给别人来做。在实际应用中,WEB服务器的代理模型很简单,当一个HTTP请求被送到WEB服务器时,它只是把请求传递给可以很好处理请求的程序,例如Servlet程序。WEB服务器仅仅提供一个可以执行服务端程序和返回(程序所产生的)响应的环境,而不会超出职能范围。服务器端程序通常具有事务处理,数据库连接和消息等功能。

 

WEB服务器工作原理

 连接过程

 WEB服务器和其浏览器之间建立起来的一种连接(常称为:握手),你可以在chrome中查看WebSocket连接(F12将All切换为WS)。然后打开socket这个虚拟文件,有这个文件意味着建立连接成功,但是我的浏览器咋看不到啊?

 请求过程

 WEB浏览器运用socket这个文件向其服务器提出各种请求。

 应答过程

 运用HTTP协议把请求过程中所提出来的请求传输到Web的服务器,进而实施任务处理,然后运用HTTP协议把任务处理的结果传输到Web浏览器,同时在Web的浏览器上面展示上述所请求的页面。

 关闭连接

 当应答完成,Web服务器和其浏览器之间断开socket连接。

 

WEB服务器总结

WEB服务器主要是用来和浏览器建立socket连接的,然后解析浏览器发来的HTTP请求,在响应请求的过程中它可能是直接返回一些静态文件,或者是将响应的处理交给一些服务器端的小程序来做(例如:Servlet程序),然后将服务器端程序执行的结果返回。它只是提供一个可执行服务器端程序和返回数据的环境。

 

 

Servlet容器是啥?

说到Servlet容器,我又想问WEB容器、Tomcat容器和Servlet容器之间有啥关系?

WEB容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理客户端发出的请求。常见的WEB服务器有Java里的Tomcat、Weblogic容器,ASP里的IIS、PWS容器,一个服务器可以有多个容器。

Tomcat容器是一个小型的轻量级应用服务器,Tomcat部分是Apache服务器的扩展,但它是独立运行的,当你运行Tomcat时,它实际上作为一个独立的进程单独运行的,与Apache服务器是独立的。当你配置好后,Apache为HTML页面服务,而Tomcat实际上为运行JSP页面和Servlet程序。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,而且它还是一个Servlet程序和JSP页面的容器,独立的Servlet容器是Tomcat的默认模式,不过Tomcat处理静态HTML的能力不如Apache服务器。

回想一下WEB服务器是用来干啥的,它只是提供一个环境,一个可以运行服务端程序和返回结果的环境,我们也知道一开始服务器也只能响应HTTP请求,比如静态页面和图片等,更高级的WEB做不了,它只提供一个环境而已。而Tomcat呢?Tomcat是属于Apache服务器的一个进程,它主要是用来能执行一些Servlet(JSP最终也是Servlet)程序的容器,尽管它也能处理静态页面,但这点我们可以忽略,这并不是Tomcat的主要用途。

只要能运行Servlet程序的容器都可以称为Servlet容器,而Tomcat只是Servlet容器的一种。Servlet容器其实扩展了WEB服务器的交互能力,更主要的是处理业务的能力。

 

 

 

 

Servlet容器Servlet之间有啥关系?

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立的字节码文件,可以被动态加载到支持Java技术的Web服务器中运行。

Servlet容器也叫做Servlet引擎,是Web服务器或应用服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调度Servlet的方法,如doPost()和doGet(),Servlet容器在Servlet的声明周期内包容和管理Servlet,在JSP技术推出后,管理和运行Servlet/JSP的容器也称为Web容器。(注:常用的MIME类型:text/html,application/pdf,video/quicktime,application /java,image/jpeg,application/jar,application/octet-stream,application/x- zip)。【上两段摘抄自池的巧克力

有了Servlet之后,你在回头看一下CGI的工作原理,在那里你只要把cgi程序替换成Servlet程序,CGI接口想成是Servlet接口,慢慢的一条线路大概就在你脑瓜子里形成了。但还要细说的一点就是,Web服务器接收到请求后,不是直接交给Servlet的,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定的方法对请求进行处理,并产生一个响应。这个响应有Servlet容器返回Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给请求方。我在把上面那一张图放在这,让你细细品品。

 

 

 

 

Servlet容器提供了什么?

Servlet容器是可以运行Servlet,在Servlet的声明周期内管理着Servlet。难到就只提供这些?

 通信支持:利用容器提供的方法,你能轻松的让Servlet与Web服务器对话,而不自己建立servletsocket、监听某个端口、创建流等等。容器知道自己与Web服务器之间的协议,所以你的Servlet不用担心Web服务器(如Apache)和你自己的代码之间的API,只要考虑如何实现你的业务即可。

 生命周期管理:Servlet容器控制着Servlet的生死,它负责加载、实例化和初始化Servlet,调用Servlet方法,以及销毁Servlet。有了Servlet容器,你不必太过关心资源管理。

 多线程支持:容器会自动为它所接收的每个Servlet请求创建一个新的java线程。针对用户的请求,如果Servlet已经运行完响应的http服务方法,这个线程就结束。并不是说你不需要考虑线程安全问性,其实你还会遇到同步问题,不过这样能使你少做很多工作。

 声明方式实现安全:利用Servlet容器,你可以使用xml部署描述文件和修改安全性,而不必要将其硬编码写到Servlet类代码中。

 JSP支持:Servlet容器负责将jsp代码翻译为真正的java代码。【本小节摘抄自池的巧克力

 

Servlet大总结

自此,Servlet的起源和Servlet容器一些基础基本上是介绍明白了,下面我们该去在实践中体会Servlet技术了,在此抛出几个问题,Servlet容器是怎么实现运行Servlet的?Servlet运行在Servlet容器里是怎样的?Servlet能干哪些具体的功能呢?本片笔记到此结束,问题我们留在Servlet实践中探索。

 

 

 

 

接下来要读的是

Tomcat工作流程

 

标签:CGI,WEB,容器,基础,接口,服务器,Servlet
来源: https://www.cnblogs.com/liudaihuablogs/p/13462422.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有