Servlet的生命周期和工作原理

本文详细介绍了Servlet的生命周期,包括Servlet的初始化、服务及销毁过程。同时提供了具体的代码示例和配置文件,帮助理解Servlet如何响应HTTP请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Servlet

         Servlet是用Java编写的服务端程序,其主要功能在于交互式地浏览和修改数据,生成动态的Web内容。

Servlet的生命周期

         下面我们通过一段代码和配置文件来试验一下Servlet的生命周期

代码

package Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet extends HttpServlet {
	public Servlet() {
		System.out.println("调用了Servlet的构造方法");
	} 
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
	
	@Override
	public void init() throws ServletException {
		System.out.println("调用了Servlet的init方法");
	}
	 @Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("调用了Servlet的service方法");
	}
	 @Override
	public void destroy() {
		System.out.println("调用了Servlet的destory方法");
	}
}

Web.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>Servlet.Servlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Servlet</servlet-name>
    <url-pattern>/servlet/Servlet</url-pattern>
  </servlet-mapping>	
  </web-app>

通过网页访问Servlet方法,在控制带依次输出的文字为:

调用了Servlet的构造方法

调用了Servlet的init方法

调用了Servlet的service方法

如果刷新网页,或者打开一个新的网页访问会发现,程序在控制台中接着输出

         调用了Servlet的service方法

没有在调用Serlvet的构造方法和init初始化方法,说明Servlet是单实例多线程的,所以我们在写代码的时候要注意线程安全的问题。

那么Servlet的调用过程是怎样的呢?下面用一个图简单说明一下



详细的执行过程为

1、  Servlet容器启动,加载web.xml文件,读取相关配置

2、  客户访问Servlet容器,如果Servlet类还没有被初始化,那么Servlet容器根据客户输入的URL地址,去配置文件中找到与之相对应的映射类

3、  Servlet容器通过反射的方法实例化该类

4、  实例化类后Servlet容器会调用init(ServletConfigconfig)方法,获取web.xml中的相关配置。

5、  Servlet容器会调用调用init()方法。

6、  调用 publicvoid service(ServletRequest req, ServletResponse res)方法,将ServletRequest和ServletResponse转换成HttpServletRequest和HttpServletResponse方法。并调用protectedvoid service(HttpServletRequest req, HttpServletResponse resp)方法

7、  在service(HttpServletRequestreq, HttpServletResponse resp)方法中判断用户是通过什么请求来进行的页面访问,并调用相关的方法。

8、  当容器关闭的时候调用destory()方法销毁。

注意

1、  Servlet容器的默认配置是当有用户访问Serlvet类的时候才会对该类进行初始化操作,这样首次访问的用户等待的时间可能会比较长,所以用户可以通过在<servlet></servlet>中添加<load-on-startup>(正整数)</load-on-startup>来使该类在Servlet容器启动的时候就完成Servlet类的初始化。

2、  init(ServletConfig config)方法是Servlet容器自己调用的初始化方法,最好不要重写这个方法,如果需要在容器初始化时候进行某些操作,可以重写init()方法,该方法是专门为开发人员设置的。

3、  重写service方法最好重写service(HttpServletRequestreq, HttpServletResponse resp)方法,因为service(ServletRequest req, ServletResponse res)方法是将ServletRequest和ServletResponse对象转换为HttpServletRequest对象和HttpServletResponse对象的。


评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值