当前位置: 首页 > 图灵资讯 > 技术篇> Servlet 生命周期、工作原理

Servlet 生命周期、工作原理

来源:图灵教育
时间:2023-07-05 17:35:32

Servlet 生命周期,工作原理

Servlet 生命周期:Servlet 加载—>实例化—>服务—>销毁。

init():在servlet的生命周期中,只执行一次init()方法。它是在服务器安装到servlet时执行的,负责初始化servlet对象。在启动服务器或客户机器首次访问servlet时,可以配置服务器安装servlet。无论访问servlet的客户机有多少,init()都不会重复执行。

service():它是Servlet的核心,负责响应客户的要求。每当客户要求HttpServlet对象时,就会调用Service()方法,并将其传递给该方法进行“请求”(ServletRequest)对象和“响应”(ServletResponse)对象作为参数。Service()方法已经存在于Httpservlet中。默认服务功能是调用与HTTP请求相对应的do功能。

destroy(): 该方法只执行一次,当服务器停止并卸载Servlet时执行。当Servlet对象退出生命周期时,负责释放占用的资源。Servlet在运行Service()方法时可能会产生其他线程,因此需要确认这些线程已经终止或完成。

Tomcat 与 Servlet 如何工作:

步骤:

Web Client 向Servlet容器方向(Tomcat)发出HTTP请求

Servlet容器接收Web Client的请求

创建Httprequest对象的Servlet容器 这个对象包装了Client要求的信息。

创建Htttpresponse对象的Servlet容器

Servlet容器调用Httpservlet对象的service方法,将Httprequest对象和Httpresponse对象传递给参数 HttpServlet 对象。

Httpservlet调用Httprequest对象的相关方法,获取Http请求信息。

Httpservlet调用Httpresponse对象的相关方法,生成响应数据。

Servlet容器将HttpServlet的响应结果传递给Web Client。

Servlet工作原理:

1、首先,简要解释Servlet接收和响应客户请求的过程。首先,客户发送请求。Servlet呼叫Service()方法响应请求,可以通过源代码看到。service()匹配方法中的要求,选择调用doget、dopost等方法,然后进入相应的方法调用逻辑层方法,实现对客户的响应。在Servlet接口和GenericServlet中,没有doget()、doPost()等等。这些方法在Httpservlet中定义,但都是返回error信息。因此,每次定义servlet,都必须实现doget或dopost。

2、每一个自定义的Servlet都必须实现Servlet界面,Servlet界面定义了五种方法,其中三种更重要的方法涉及Servlet的生命周期,即上述init(),service(),destroy()方法。Genericservlet是一种通用的Servlet,不具体于任何协议,它实现了Servlet接口。而Httpservlet继承于Genericservlet,因此Httpservlet也实现了Servlet接口。因此,当我们定义Servlet时,我们只需要继承HttpServlet。

3、Servlet接口和Genericservlet不具体于任何协议,而Httpservlet是具体于HTTP协议的类别,因此Service()方法在Httpservlet中实现,要求Servletrequest、ServletResponse 强转为Httprequesttt 和 HttpResponse。

创建Servlet对象的时机:

当Servlet容器启动时,读取web.xml配置文件中的信息,构建指定的servlet对象,创建servletconfig对象,并将servletconfig对象作为参数调用servlet对象的init方法。

Servlet容器启动后:客户首次要求Servlet,Servlet容器将判断内存中是否有指定的Servlet对象,如果没有,创建它,然后根据客户的要求创建Httprequest。、Httpresponse对象,从而调用Servletet 对象的service方法。

Servlet Servlet容器在启动时自动创建Servlet.xml文件中Servlet设置的属性决定。由此,我们还可以看到Servlet容器中以单例的形式存在相同类型的Servlet对象。

<servlet> <servlet-name>Init</servlet-name> <servlet-class>org.xl.servlet.InitServlet</servlet-class> <load-on-startup>1</load-on-startup>