一:Servlet生命周期图,以及注意事项

二:代码演示

LifeCycleServlet.java

 package cn.woo.servlet;

 import java.io.IOException;

 import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 类说明:演示Servlet的生命周期
* @author wyh
* @version 创建时间:2018年8月13日 上午9:06:20
*/
public class LifeCycleServlet extends HttpServlet{ /**
* Servlet是单例多线程的,Servlet加载的时候只会创建一次,只存在一个实例,当服务关闭的时候才销毁该servlet
* 当多个客户端并发访问Servlet的时候,Servlet会开启多个线程分别去执行Servlet的service方法
*
*/ private static final long serialVersionUID = 1L; /**
* 使用@PostConstruct的非静态void方法,属于新增的Servlet生命周期的一部分,在Servlet的init方法之前执行
*/
@PostConstruct
public void beforeServletInit() {
System.out.println("在Servlet的init方法之前执行");
} /**
* 初始化Servlet的时候执行,并且只执行一次
* 该方法会在加载该Servlet的时候最先执行,如果在web.xml文件中配置<load-on-startup>1</load-on-startup>的时候,当项目启动的时候就会加载该Servlet
* ①:通常在该方法中进行一些初始化参数,或者上下文参数的获取。避免写在doGet/doPost方法中重复读取。
*/
@Override
public void init() throws ServletException {
// String initParameter = getServletConfig().getInitParameter("paramName");
System.out.println("初始化LifeCycleServlet");
} /**
* 服务,每一次客户端访问Servlet的时候都会执行该方法
*/
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//执行服务
System.out.println("执行service方法跳转到指定的get、post方法中");
super.service(request, response);
} /**
* 销毁Servlet的时候执行该方法(通常关闭服务的时候就会执行该方法),仅执行一次:
* ①:通常在该方法中进行一些对象、数据销毁的操作
*/
@Override
public void destroy() {
System.out.println("销毁LifeCycleServlet");
} /**
* 使用@PreDestroy的非静态void方法,属于新增的Servlet生命周期的一部分,在Servlet的destroy方法之后执行
*/
@PreDestroy
public void afterServletDestroy() {
System.out.println("在Servlet的destroy方法执行后执行");
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行doPost方法");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行doget方法");
}
}

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ServletDemo1</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <!-- Servlet -->
<servlet>
<servlet-name>LifeCycleServlet</servlet-name>
<servlet-class>cn.woo.servlet.LifeCycleServlet</servlet-class>
<!-- 配置项目一启动的时候就加载该Servlet -->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>LifeCycleServlet</servlet-name>
<url-pattern>/servlet/LifeCycleServlet</url-pattern>
</servlet-mapping>
</web-app>

三:关于Servlet的线程安全

  因为Servlet是单例的,当多个客户端并发访问Servlet中的某个成员属性的时候,就会造成数据不同步的问题。如:线程A要读取成员属性name属性的值,由于某种原因(如:A线程睡眠了几秒钟),在睡眠的过程中,线程B已经将name的值给改了,此时线程A再次输出的值已经不再是原先的值了。

  

Servlet的生命周期以及线程安全问题的更多相关文章

  1. Servlet生命周期与线程安全

    上一篇介绍了Servlet初始化,以及如何处理HTTP请求,实际上在这两个过程中,都伴随着Servlet的生命周期,都是Servlet生命周期的一部分.同时,由于Tomcat容器默认是采用单实例多线程 ...

  2. servlet的生命周期与运行时的线程模型

    第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...

  3. Servlet的生命周期+实现方式

    1.Servlet的生命周期:        (1)被创建:            默认情况下,Servlet第一次被访问时,被服务器创建.会调用init()方法.                一个 ...

  4. (转)Servlet的生命周期——初始化、运行、销毁全部过程

    背景:面试中很基础的一个问题,所以有必要好好整理一番. Servlet体系结构是建立在 Java 多线程机制上的,它的生命周期由 Web 容器负责. 当客户端第一次请求某个 Servlet 时,Ser ...

  5. java基础78 Servlet的生命周期

    1.Servlet的生命周期 简单的解析就是: 创建servlet实例(调用构造器)---->调用init()方法---->调用service()方法----->调用destroy( ...

  6. 第四天:servlet的生命周期和一些细节问题

    1.  servlet的生命周期: a)  流程 i.  Web服务器首先会检查是否装载了该servlet的实例对象.如果装载了直接进行第四步. ii.  装载并创建该servlet的实例对象. ii ...

  7. Servlet 的生命周期 及 注意事项 总结

    Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...

  8. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  9. Servlet的生命周期及工作原理

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

随机推荐

  1. Unity添加自定义快捷键——UGUI快捷键

    在Editor下监听按键有以下几种方式: 自定义菜单栏功能: using UnityEngine; using UnityEditor; public static class MyMenuComma ...

  2. Unusual Sequences

    题意: 求解合为 y 的总体 gcd 为 x 的正整数非空序列个数. 解法: 特判一下后,原问题等价于合为 s = y/x 的整体gcd为1的正整数序列个数. 1.$ans = \sum_{\sum{ ...

  3. 《精通Spring4.X企业应用开发实战》读后感第五章(不同配置方式比较)

  4. p1198&bzoj1012 最大数

    传送门(洛谷) 传送门(bzoj) 题目 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数 ...

  5. Entity Framework Code-First(9.9):DataAnnotations - ForeignKey Attribute

    DataAnnotations - ForeignKey Attribute: ForeignKey attribute can be applied to properties of a class ...

  6. Raising Modulo Numbers(ZOJ 2150)

    这题其实就是快速求一个高次幂的模. 这是题目的答案 #include<iostream> #include<cmath> using namespace std; ]; ]; ...

  7. MATLAB进行无约束优化

    首先先给出三个例子引入fminbnd和fminuc函数求解无约束优化,对这些函数有个初步的了解 求f=2exp(-x)sin(x)在(0,8)上的最大.最小值. 例2 边长3m的正方形铁板,四角减去相 ...

  8. DMZ的原理与应用

    DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓 ...

  9. 单机部署zookeeper、kafka

    先安装jdk:mkdir /usr/javatar xf jdk-8u151-linux-x64.tar.gzmv jdk1.8.0_151/ /usr/java/jdk1.8 cat /etc/pr ...

  10. 洛谷P2911 [USACO08OCT]牛骨头Bovine Bones【水题】

    题目大意:输入S1,S2,S3,随机生成三个数x,y,z,求x+y+z出现次数最多的数(如果有多个答案输出最小的),其中1<=x<=S1,1<=y<=S2,1<=z< ...