美文网首页嵌牛IT观察我爱编程
【转载】Servlet的历史与简要

【转载】Servlet的历史与简要

作者: AmazingRi | 来源:发表于2018-04-10 13:42 被阅读19次

    姓名:何瑞                                                     学号:17021211237

    转载自:http://blog.csdn.net/u010297957/article/details/51498018 有删减           来源:csdn

    作者:有且仅有

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    【嵌牛导读】:Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

    【嵌牛鼻子】:servlet

    【嵌牛提问】:servlet的由来?servlet的工作原理?servlet规范?

    【嵌牛正文】:

    一、Servlet历史

    1.servlet的由来

    1)背景

    上世纪90年代,随着Internet和浏览器的飞速发展,基于浏览器的B/S模式随之火爆发展起来。最初,用户使用浏览器向WEB服务器发送的请求都是请求静态的资源,比如html、css等。但是可以想象:根据用户请求的不同动态的处理并返回资源是理所当然必须的要求。

    2)CGI

    必须要满足上述需求,所以CGI(Common Gateway Interface)出现了。CGI程序使用C、Shell Script或Perl编写,CGI是为特定操作系统编写的(如UNIX或Windows),不可移植,CGI程序对每个请求产生新的进程去处理。步骤如下:

    ①.WEB服务器接收一个用户请求;

    ②.WEB服务器将请求转交给CGI程序处理;

    ③.CGI程序将处理结果返回给WEB服务器;

    ④.WEB服务器把结果送回用户;

    3)Java

    与此同时,Java语言也在迅速发展。必然的,Java要支持上述需求。Java有两种方案来实现动态需求,它们都属于JavaEE技术的一部分。

    ①.applet

    这是纯客户端(浏览器)方案,applet就是浏览器中的Java插件,浏览器通过它就能够解释执行WEB服务器发过来的Java代码,从而实现动态。但是,显然这种方案不好,既需要浏览器必须安装插件,又受限于浏览器,所以Java代码不能太多和太复杂。

    比如,如果安装了JRE,虽然IE浏览器会自动启用Java插件,但是你可以轻易禁止。再比如Chrome还需要你手动去安装插件才行,普通用户连Java是什么都不知道他怎么会去装呢?

    IE如下图:

    ②.Servlet

    既然浏览器不方便执行Java代码,那自然还是服务端来执行了,所以Servlet出现了,Servlet就是server端的applet的意思。

    2. Servlet的工作原理

    其实Servlet的工作原理基本类似上面的CGI,不过Servlet比CGI更好。

           ①.WEB服务器接收一个用户请求;

           ②.WEB服务器将请求转交给WEB服务器关联的Servlet容器;

           ③.Servlet容器找到对应的Servlet并执行这个Servlet;

           ④.Servlet容器将处理结果返回给WEB服务器;

           ⑤.WEB服务器把结果送回用户;

    3.Servlet的发展

    1) Servlet诞生后,SUN公司很快发现了Servlet编程非常繁琐,这是因为:

           Servlet代码中有大量冗余代码,每个Servlet都有一模一样的或基本近似的代码,比如out输出你可能就得写成百遍;

           开发Servlet必须精通网页前端和美工,你得非常不直观的在Servlet中写前端代码,这使得实现各种页面效果和风格非常困难。

    2) 所以,SUN借鉴了Microsoft的ASP,正式提出JSP(Servlet1.1),已期望能代替Servlet。但是很快,SUN发现JSP也有问题:

            前端开发人员需要看JSP中大量的令他困惑的后端代码;

            同样,Servlet开发人员也得在复杂的前端代码中找到其能写Servlet代码的地方;

    3) 所以,Servlet1.2出现了,这个版本的Servlet倡导了MVC思想:

            JSP(V):将后端代码封装在标签中,使用大量的标签,JSP只用来写前端代码而不要有后台代码;

            Servlet(C):Servlet完成Controller的功能再加上部分代码逻辑;

            Model(M):Servlet将数据发送给Model,Model包括部分代码逻辑,最主要的Model也代表着被组织好的用于返回的数据。最终,Model数据会被显示在JSP上(V)。

    基本上到这里Servlet的大方向已经固定了,随之,成熟的发展至 - 2016年5月26日…

    二、Servlet简要

    1. Servlet概述

    1)Servlet有两种意思:

           广义上是:基于Java技术的Web组件,被容器托管,用于生成动态内容。再详细点说,Servlet是JavaEE组件中的 -> Web组件的 -> 一种。(其它两种是JavaServer Faces和JavaServer Page)

           狭义上说:是JavaEE API中的一个interface,javax.servlet.Servlet;

    2)Servlet 容器/引擎:

           Servlet容器也可以叫引擎,Container/Engine,用于执行Servlet。

           容器是以内嵌或者附加组件的形式存在于Web服务器或者应用服务器中的。

           容器本身(不依赖Web服务器)就提供了基于请求/响应发送模型的网络服务,解码基于MIME的请求,格式化基于MIME的响应。

           所有容器必须实现HTTP协议的请求/响应模型。其它协议不强求,如HTTPS。




    下面开始说一下规范的核心要点。

    删减:这里我只是转载了我最近用到的重要的点。要全面了解的可以查看原文或者直接去看完整规范。

    为了方便描述,先声明一些名词:

           ①.web.xml= 部署描述符(Deployment Descriptor )

           ②.容器 = Servlet Container/Engine




    2. Servlet Interface

    Servlet生命周期:

    Servlet的生命(周期)是由容器管理的,换句话说,Servlet程序员不能用代码控制其生命。

    1) 加载和实例化:

     时机取决于web.xml的定义,如果有x则在容器启动时,反之则在第一次针对这个Servlet的请求发生时。

    2) 初始化:

    实例化后会立马进行初始化。也就是执行init方法。

    3) 请求处理:

    初始化后,Servlet就可以接受请求了。

           基本方式是执行Servlet接口中的service方法。

           当然,API也提供了HttpServlet抽象类,其中有doGet、doPost等特殊方法。

           注意:任意的容器按照规范必须实现上述几种方法,所以你的代码写在这几个方法中都可以。

    4) 终止服务:

           容器会在合适的时候销毁某个Servlet对象,这个策略取决于容器的开发者/商。

           在容器关闭的时候Servlet对象一定会被销毁。

           当1或2发生时,也就是Servlet对象被销毁时,destroy方法会被调用。

    3. Request

    1) 请求路径元素

    Context Path:

           通常以'/'开头,但不以'/'结尾;

           如果是容器默认Context,则为空字符串:"";

    Servlet Path:

           首先,这与自己配置的有关(具体理解可看下图);

           其次,通常以'/'开头;

           最后,如果是匹配"/*"或""的话则为空字符串"";

    PathInfo:

           取决于Servlet Path划走了多少;

           通常要么为null要么以'/'开头;

    例如:下图首先展示了1个Context Path和其下3个Servlet的配置,然后给出了3个Request Path的例子来具体分析划分情况

    2) 请求编码

    请求会以什么编码形式送给服务器端呢?

            HTTP协议没有强制规定,所以实际上这是由浏览器自己决定的,决定后浏览器可以通过entity-body中的Content-Type项告诉服务器自己使用了什么编码。但是!大部分情况下浏览器不会这么做的。比如说,Get请求是没有entity-body的,自然也不会使用Content-Type了。

    在服务端,我们Servlet规范规定了如果请求没有指定编码的话,容器必须使用IOS-8859-1来解码。为了让开发人员知道请求给没给出编码,容器会在没给的情况下通过getCharacterEncoding返回null来告诉我们。

    为了在我们明知道不是ISO-8859-1编码的情况下给我们自主权,ServletRequest提供了setCharacterEncoding(String enc);

    相关文章

      网友评论

        本文标题:【转载】Servlet的历史与简要

        本文链接:https://www.haomeiwen.com/subject/llekhftx.html