ICode9

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

servlet的本质是什么,它是如何工作的?

2019-08-31 13:35:52  阅读:228  来源: 互联网

标签:http 请求 Servlet 本质 Server 如何 servlet javax


 

servlet的本质是什么,它是如何工作的? (整理自知乎)

servlet的本质是什么,它是如何工作的?基于计算机和网络通讯(主要是http协议)构建网络应用的,具体的实现细节是怎样的?

这个提问的最大一个bug,就是以为servlet是很复杂的东西,事实上,servlet就是一个Java接口,interface! 打开idea,ctrl + shift + n,搜索servlet,就可以看到是一个只有5个方法的interface!

所以,提问中说的网络协议、http什么的,servlet根本不管!也管不着!

那servlet是干嘛的?很简单,接口的作用是什么?规范呗!

servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 你初始化时要做什么

  • 你销毁时要做什么

  • 你接受到请求时要做什么

这是Java给的一种规范!就像阿西莫夫的机器人三大定律、行尸走肉里Rick的那三个问题一样,规范!

servlet是一个规范,那实现了servlet的类,就能处理请求了吗?

答案是,不能。

你可以随便谷歌一个servlet的hello world教程,里面都会让你写一个servlet,相信我,你从来不会在servlet中写什么监听8080端口的代码,servlet不会直接和客户端打交道!

那请求怎么来到servlet呢?答案是servlet容器,比如我们最常用的tomcat,同样,你可以随便谷歌一个servlet的hello world教程,里面肯定会让你把servlet部署到一个容器中,不然你的servlet压根不会起作用。

tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。

以上。

参考文献(看完你就知道Tomcat/Servlet/Spring MVC之间的矫情关系了):

An Introduction to Tomcat Servlet Interactionswww.mulesoft.com

对了,个人Bridge4You公众号已经开通,欢迎关注!

有些话只能在那里跟你说 (〃'▽'〃)

http://weixin.qq.com/r/LSng_EvEvRbCrQ_b93w- (二维码自动识别)

编辑于 2018-03-14

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

工作模式:

1、客户端请求该 Servlet;

2、加载 Servlet 类到内存;

3、实例化并调用init()方法初始化该 Servlet;

4、service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions());

5、destroy();

6、加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet;

7、Server 创建一个 Servlet的实例;

8、第一个客户端的请求到达 Server;

9、Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高);

10、一个客户端的请求到达 Server;

11、Server 创建一个请求对象,处理客户端请求;

12、Server 创建一个响应对象,响应客户端请求;

13、Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数;

14、service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息;

15、service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法;

16、对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

编辑于 2017-09-21

谢照东

佛说五蕴六毒是妄,将因果都念作业障

Servlet是J2EE 规范中的一种,主要是为了扩展java作为web服务的功能.J2EE 从92年到的J2EE 1.2到现在J2EE8 从12个规范到现在20多个规范,越来越完善

他的作用就是为java程序提供一个统一的web应用的规范,方便程序员统一的使用这种规范来编写程序,应用容器可以使用提供的规范来实现自己的特性。比如tomcat的代码和jetty的代码就不一样是吧,但作为程序员你只需要了解servlet规范就可以从request中取值,你可以操作session等等。不用在意应用服务器底层的实现的差别而影响你的开发

当然你也可以自己写一个http 服务器,自己定义一套API,比如你在底层接受到一个http请求后,你把这个http请求的header、cookie和param等封装成一个MyRequest.class 。然后你要得到,你在你的MyServlet中从MyRequest对象中拿到param请求参数,校验成功后需要返还给浏览器一个HTTP response。其中必须要有一个session,所以你往cookie中写了一个字段,LAOZIDESESSIONID=878361839QWQWEQEQE,同时把这个sessionid放在了自己的内存中。下一次浏览器再访问你就会带上这个LAOZIDESESSIONID这个cookie,你就知道他原来已经访问过了,而且上一次访问的数据你都有(在第一次保存在内存中)

但是有没有想过,如果每个程序员都写一个自己的HTTP服务器,该程序员离职了咋办。而且你用你的,我用我的,遇到问题都不能一起解决,你一会儿只支持http/1.0 ,别人都支持http/2.0了(虽然这个是在底层的实现了,和servlet没半毛钱关系,大家注意了,打个比方而已)。别人都支持注解了,你还在写配置呢!肯定不能啊,所有J2EE要出一个规范,要管住你们这群人,大家都要同步走。大家都用我这套规范,所有的请求都放在Request中,返回都放在response中。sessionID的名称也都可以自己设置,

比如tomcat你可以<Context sessionCookieName="zheshilaozidesessionid" >

讲了这么多废话,总结来说Servlet就是一群人来制定java应用中使用web时的各种规范,统一接口,其他内部实现由厂商自己实现,tomcat jetty jboss等等应运而生。面向接口编程!!很熟悉吧

关于他如何工作的:一个http请求到来,容器将请求封装成servlet中的request对象,在request中你可以得到所有的http信息,然后你可以取出来操作,最后你再把数据封装成servlet的response对象,应用容器将respose对象解析之后封装成一个http response。完了

编辑于 2017-09-28

温学良

金融IT工程师

web服务器习惯处理静态页面,所以需要一个程序来帮忙处理动态请求(如当前时间)。Web服务器程序会将动态请求转发给帮助程序,帮助程序处理后,返回处理后的静态结果给web服务器程序。这样就避免了web服务器程序处理动态页面。Servlet的本质是一个帮助程序。如下图

Servlet工作流程分为三个阶段。init(初始化),service(运行),destroy(销毁)

Servlet没有main方法,所有行为由Container控制。Container就是一个java程序。

在加载Servlet的.class后,Servlet会由构造函数生成一个实例,然后Container调用init()方法完成参数的初始化,接着调用service()方法,service会根据网页的请求,调用doGet或者doPost方法,最后调用销毁方法。整个流程如下图:

发布于 2016-01-20

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

 

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

 

最早支持Servlet标准的是JavaSoft的Java Web Server。此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。

 

Servlet编程需要使用到javax.servlet 和 javax.servlet.http两个包下面的类和接口,在所有的类和接口中,javax.servlet.servlet 接口最为重要。所有的servlet程序都必须实现该接口或者继承实现了该接口的类。

javax.servlet.ServletConfig;

javax.servlet.ServletException;

javax.servlet.http.HttpServlet;

javax.servlet.http.HttpServletRequest;

javax.servlet.http.HttpServletResponse;

javax.servlet.http.HttpSession;

javax.servlet.http.Cookie;

javax.servlet.ServletContext;

javax.servlet.GenericServlet;

以上是Servlet的主要类和接口

(1) javax.servlet.Servlet;//Servlet接口

拥有方法:

//该函数用于初始化该servlet 该函数只是会被调用一次, 当用户第一次访问该servlet的时候被调用

public void init(ServletConfig parm1) throws ServletException

// //用于得到servlet配置文件 与生命周期无关

public ServletConfig getServletConfig()

// service 函数用于处理业务逻辑

//程序员应当把业务逻辑代码写在这里

//该函数在用户每次访问servlet的时候都会被调用

//ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

public String getServletInfo()

//销毁servlet实例(释放内存)

//1 reload 该servlet(webApp)

//2 关闭Tomcat 或者说 关机之后 都会调用这个函数

public void destroy()

--------------------------分割线 2015年11月8日------------------------------

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

对这句话再做点解释,比如HttpServlet类继承自Servlet类,可以利用继承HttpServlet来实现Http请求,当不是Http请求的时候,也可以定义其他形式的Servlet。

比如我之前工作过的一个公司的架构就是使用Servlet来处理自己的应用层协议。

-----------------------------------------------------------------------------------------------

下面是我曾经做过的Servlet笔记

Servlet体系结构

servlet首先是一个接口,GenerivServlet呢实现了这个接口。

他们都是属于javax.servlet.*;的这个包里面的

此外,在javax.servlet.http*;的这个包里面呢,其实也含有一个重要的servlet类叫httpServlet

首先我们看到ie浏览器,我们讲servlet也好,讲jsp也罢,首先我们要明确的是这是一个bs的体系结构,所以说他必然有浏览器的,那么浏览器要去访问Tomcat其中的某一个servlet或者说是jsp的时候呢,必须在ie浏览器当中输入

http://........

之类的命令敲了回车键之后浏览器就会向你指定的Tomcat发送http请求的,这个请求会被Tomcat的Web服务器的这个模块接收,web服务器处理之后呢会转发给Tomcat的容器部分进行处理,他会帮助ie浏览器找到这个请求想要找到的servlet,这时呢在容器里面的行为要么是在容器内再向数据库发送操作数据库的命令,要么呢直接返回结果 ,其实就是静态的html页面,当页面被web服务器模块接收到之后呢,他会将静态页面返回给那个发送请求的那个ie浏览器,ie浏览器得到这个结果之后呢,就会自己显示出来,然后用户就能看到结果,所以可以将我们的结果分成三个部分,第一个部分是ie浏览器,第二个呢是Tomcat模块,第三个呢就是数据库模块。

其实开发servlet有三种方法,一种是实现servlet接口,一种是继承GernericServlet 还有一种是继承HttpServlet。 为什么会有三种方法呢?因为这个servlet这个技术并不是说一出现之后就是成熟的,他经历过这三个发展的阶段,因此它具有这三种方式,其实在最先前是实现servlet接口方法来开发的,后面的时候技术人员发现这样写似乎不太方便,所以又发展出来一个叫做继承GenericServlet的方法来实现,后来又发现这个也不是很方便,所以呢又发展出来了继承 HttpServevlet方式来实现

为了使学习更加深刻,我会把三种方式都实现下。

Servlet开发是很简单的事情特别是用一些高级工具来开发的话,特别是像JBuilder来实现的话只要点一下就行了,但很遗憾的这样的高级工具他会隐藏太多的细节,这样的话就不利于我们的学习,特别是部署之类的他就给你全写了,那么你就不好学到他servlet的底层运行机制和原理,为了让大家理解的更为深刻,我还是先用JCreater来实现开发Servlet,后面当然会用到eclipse 或者JBuilder这些高级工具来开发。我们先过一点苦日子,然后再过一点好日子,这样的话知识更加扎实一点了。

下面我们就来真正的来开发Servlet,首先用什么方法呢?用实现接口的方法来实现

在这里呢会引入servlet的生命周期这个特点。这第一个servlet非常简单,就是写一个Hello World 在浏览器中输出。教程依照先简单,再难,再综合的顺序进行。

下面是Servlet的开发流程。

1:首先在Tomcat的主目录下的webapp下面建立一个WEB-INF文件夹

2:然后再WEB-INF文件夹下建立一个web.xml文件,记录网站的配置信息

建立classes子文件夹 存放你的servlet

当然这个操作你可以自己完成 也可以在root目录下拷贝一份

大家可以看到 这个地方传递过来了一个信息,什么信息呢?

对于Tomcat来讲,你所有的这些网站,页面对他来讲都是web应用,他看来就是web应用,就是在webapp下面建立我们的网站。

比如建立一个文件夹叫做mywebsite,接下来文件夹中放什么东西呢,我们要放的就是WEB-INF文件夹,在里面放置web.xml文件以及classes文件夹和lib文件夹。

WEB-INF这个要注意大小写,要注意大小写要一模一样才行的,名字都要一样才行的。

在这个文件夹下进行上述两种操作,你可能会去问,为什么要这样做呢?这个倒是没有办法的事情 因为这就是规范。

classes当然是存servlet用的 ,那个lib文件夹用来做什么呢?

用来存放这个应用汇用到的一些jar包,比如数据库啦之类的,文件的下载要用的包都放在lib里面去,就是lib库。

//这是我的第一个Servlet 使用实现Servlet接口的方式来开发

 

package com.tsinghua;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.Servlet;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

 

public class Hello implements Servlet

{

 

    // 该函数用于初始化该servlet, 类似于我们的类的构造函数

    // 该函数只是会被调用一次, 当用户第一次访问该servlet的时候被调用

    public void init(ServletConfig parm1) throws ServletException

    {

        System.out.println("init it !");

    }

 

    // 用于得到servlet配置文件 与生命周期无关

    public ServletConfig getServletConfig()

    {

        return null;

    }

 

    // service 函数用于处理业务逻辑

    // 程序员应当把业务逻辑代码写在这里

    // 该函数在用户每次访问servlet的时候都会被调用

    // ServletRequest 对象用于获得客户端信息,ServletResponse 对象用于向客户端返回信息(客户端可以理解为浏览器)

    // servelt jsp b/s

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

    {

        System.out.println("service it");

        PrintWriter pw = res.getWriter();

        pw.println("hello world");

    }

 

    public String getServletInfo()

    {

        return " ";

    }

 

    // 销毁servlet实例(释放内存)

    // 1 reload 该servlet(webApp)

    // 2 关闭Tomcat 或者说 关机之后 都会调用这个函数

    public void destroy()

    {

        System.out.println("destory it");

    }

 

}

以上就是实现servlet接口的方式来开发servlet方式来代码实现

其实以上方法都是回调函数 都是会在特定的时候特定的环境下自动调用的

其中iinit() 和 destroy() 都是只会调用一次的 但是 service 会在每一次都会被调用的

到现在还没有完成 因为如果你想让别人访问到你的wervlet 的话 你就要部署你servlet

下面讲授关于部署servlet的步骤(在web.xml 进行配置设置)

如果你要问为什么进行部署,那么还是一句话,规范。

<servlet>

    <!--给你的servlet起名字,任意的-->

<servlet-name>hello_servlet</servlet-name>

<!--指明servlet的路径,包名+类名 注意类名后不能加上java-->

<servlet-class>com.tsinghua.Hello</servlet-class>

</servlet>

<servlet-mapping>

    <!--mapping 自然就是映射了 于是乎 这个同上,一致-->

<servlet-name>hello_servlet</servlet-name>

<!--这是浏览器中输入的访问该servlet的url 任意的-->

    <url-pattern>/sp</url-pattern>

</servlet-mapping>

用下面的控制台命令编译Hello.java之后,我们就可以启动Tomcat来进行访问了

启动Tomcat的bin目录下的startup.bat之后,

输入

http://127.0.0.1:8080/guowuxin/sp

多次访问之后就能体会到Servlet的生命周期

 

访问结果

编辑于 2015-11-28

Measure

Measure

 

标签:http,请求,Servlet,本质,Server,如何,servlet,javax
来源: https://blog.csdn.net/weixin_42635759/article/details/100171907

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

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

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

ICode9版权所有