`

Servlet简述及生命周期和线程安全

阅读更多
   在传统Web开发中,我们处理Http请求最常用的方式是通过实现Servlet对象来进行Http请求的响应。Servlet是J2EE的重要标准之一,规定了Java如何响应Http请求规范。通过HttpServletRequest和HttpServletResponse对象,我们能够轻松地与Web容器交互。

Web容器使用servlet处理http请求
    当Web容器收到一个Http请求时,Web容器中的一个主调度线程会从事先定义好的线程中分配一个当前工作线程,将请求分配给当前的工作线程,由该线程来执行对应的servlet对象中的servce方法。当这个工作线程正在执行的时候,Web容器收到另外一个请求,主调度线程会同样从线程池中选择另外一个工作线程来服务新的请求。Web容器本身并不关心这个新的请求是否访问的是同一个Servlet实例。因此,得出:对于同一个Servlet对象的多个请求,Servlet的service方法将在一个多线程的环境中并发执行。所以,Web容器默认采用单实例(单个servlet实例)多线程的方式来处理http请求。也就是说,Servlet对象并不是一个线程安全的对象。

Servlet的多线程机制
Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该servlet时,一般不会再实例化该servlet类,也就是有多个线程在使用这个实例,servlet容器会自动使用线程池等技术来支持系统的运行。

测试servlet多线程机制
web.xml
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.action.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/servlet/TestServlet</url-pattern>
  </servlet-mapping>


TestServlet.java
package com.action;

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 TestServlet extends HttpServlet {
	private int counter = 0;  
	public TestServlet() {
		super();
	}
	public void init() throws ServletException {
	}
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
	}

	 public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
		 
		for (int c = 0; c < 10; c++) {
			response.getWriter().println("Counter = " + counter + "<BR>");
			try {
				Thread.sleep(1000);
				counter++;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	 }
}



开两个窗口同时访问http://localhost:8080/test_t/servlet/TestServlet该servlet,会看到成员counter的增加是在多个线程同时运行。

Servlet线程安全问题主要是由实例变量造成的,因此在Servlet中应避免使用实例变量。如果应用程序设计无法避免使用实例变量,那么使用同步来保护要使用的实例变量,但为保证系统的最佳性能,应该同步可用性最小的代码路径。


servlet生命周期
servlet生命周期分为三个阶段
1、初始化阶段  调用init()方法
2、响应客户请求阶段  调用service()方法
3、终止阶段    调用destroy()方法


(1)初始化阶段
在以下时刻servlet容器装载servlet:
1.1 servlet容器启动时自动装载某些servlet,实现它只需要在web.xml文件中的<servlet></servlet>之间添加如下代码:<load-on-startup>1</load-on-startup>
1.2 在servlet容器启动后,客户首次向servlet发送请求。
1.3 servlet类文件被更新后,重新装载servlet。

servlet被装载后,servlet容器创建一个servlet实例并且调用servlet的init()方法进行初始化。在servlet的整个生命周期内,init()方法只调用一次

(2)终止阶段
在web应用被终止,或servlet容器终止运行,或servlet容器重新装载servlet新实例时,servlet容器会先调用servlet的destroy()方法,在destroy()方法中可以释放掉servlet所占用的资源。

(3)Servlet响应请求阶段:

  对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。

Servlet何时被创建:

  1,默认情况下,当WEB客户第一次请求访问某个Servlet的时候,WEB容器将创建这个Servlet的实例。

  2,当web.xml文件中如果<servlet>元素中指定了<load-on-startup>子元素时,Servlet容器在启动web服务器时,将按照顺序创建并初始化Servlet对象。

  注意:在web.xml文件中,某些Servlet只有<serlvet>元素,没有<servlet-mapping>元素,这样我们无法通过url的方式访问这些Servlet,这种Servlet通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载这些Servlet并调用init()方法,完成一些全局性的初始化工作。

servlet与Jsp比较:
都可以生在动态网页。
jsp的优点是擅长网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。
servlet是纯java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。
分享到:
评论

相关推荐

    Servlet与JSP之间的关系

    Servlet的生命周期包括三个阶段:初始化、执行和终止。初始化阶段,Servlet会被加载并实例化,调用`init()`方法;执行阶段,Servlet通过`service()`方法处理请求,根据HTTP方法(如GET、POST)调用相应的`doGet()`或...

    day04-Tomcat&Servlet入门-资料.zip

    5. **Servlet容器**:理解Servlet容器(如Tomcat)是如何管理Servlet的,包括实例化、线程安全问题和请求分发。 6. **部署应用**:学习如何将Java Web应用打包成war文件,然后部署到Tomcat服务器上。 7. **MVC模式...

    Java web自学课程安排.pdf

    5. **Servlet和JSP**:学习Servlet的使用和生命周期,了解Cookie、Session及其关系,以及Servlet的线程安全问题。同时,探讨JSP的声明、脚本片段、表达式、注释、指令和动作。 **第二阶段:Java Web综合应用** 1. ...

    java面试进阶讲义

    - **线程概述**:这部分介绍了 Java 多线程的基本概念,包括线程的生命周期、创建方式等。 - **同步机制**:例如 `synchronized` 关键字和 `ReentrantLock` 类,用于保证线程安全。 - **线程池**:使用 `...

    java面试宝典

    232、说出Servlet的生命周期,并说出Servlet和CGI的区别。 55 233、说出在JSP页面里是怎么分页的? 55 234、存储过程和函数的区别 55 235、事务是什么? 55 236、游标的作用?如何知道游标已经到了最后? 55 237、...

    超级有影响力霸气的Java面试题大全文档

    9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当...

    java面试200题(1)

    文档概述了Servlet的生命周期: - **init()**: Servlet初始化时调用。 - **service()**: 处理客户端请求的核心方法,内部根据请求类型调用`doGet()`或`doPost()`等。 - **destroy()**: 在Servlet销毁前调用,进行...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    第6章 生命周期(Lifecycle) 43 6.1 概述 43 6.2 Lifecycle接口 43 6.3 LifecycleEvent类 44 6.4 LifecycleListener接口 44 6.5 LifecycleSupport类 44 6.6 应用程序 45 6.6.1 ex06.pyrmont.core.SimpleContext 45 ...

    java面试题(亲身经历)

    15》Servlet 的生命周期,Servlet 与 CGI 的区别Servlet 生命周期包括加载、初始化、服务、销毁四个阶段。Servlet 相比于CGI,具有更好的性能和持久性,因为CGI每次请求都会创建新的进程,而Servlet在服务器中常驻。...

    Java web面试题

    Servlet的生命周期包括以下几个阶段: - **加载和实例化**: 当容器首次启动或者接收到第一个请求时,容器会加载并实例化Servlet。 - **初始化**: 调用`init`方法进行初始化工作。 - **处理请求**: 每次请求到达时,...

    网络编程复习资料

    #### 6、说出Servlet的生命周期,并说出Servlet和CGI的区别 **Servlet的生命周期**: 1. **初始化阶段**:当Servlet首次被加载到内存中时,服务器会调用`init()`方法进行初始化。 2. **服务阶段**:每次客户端请求...

    心得.rar心得.rar

    8. **Java Servlet**:讲解Servlet的基本概念、生命周期、请求响应处理流程,以及Servlet与HTTP协议的关系。 9. **我也谈谈Guice**:可能讨论Google的依赖注入框架Guice,包括其核心概念(如Module、Injector、...

    中软公司--JAVA培训资料

    此外,还介绍了RequestDispatcher接口的forward()和include()方法,以及Servlet生命周期方法如init()、service()和destroy()的作用。 #### 六、EJB(Enterprise JavaBeans) EJB是JAVA EE平台的核心组件之一,用于...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【WEB】servlet 生命周期 35 【WEB】阐述JDBC操作数据库的步骤 36 【WEB】JSP内置对象 37 【WEB】JSP中的四种作用域 38 【WEB】转发(forward)和重定向(redirect)的区别 38 forward(转发): 38 redirect...

    收汇宝网络技术服务有限公司面试题目

    2. **Servlet生命周期**:包括初始化(init)、服务(service)和销毁(destroy)三个主要阶段。 3. **Servlet配置**:通过web.xml文件或注解方式(如@WebServlet)来配置Servlet。 4. **编写步骤**: - 创建一个...

Global site tag (gtag.js) - Google Analytics