一: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. /* font-awesome-4.7.0的应用*/

    <!DOCTYPE html> /* font-awesome-4.7.0的应用*/ <html lang="en"> <head> <m ...

  2. shell 自动删除n天前备份

    Linux自动删除n天前备份Linux是一个很能自动产生文件的系统,日志.邮件.备份等.因此需要设置让系统定时清理一些不需要的文件.语句写法:     find 对应目录 -mtime +天数 -na ...

  3. [计数问题dp]子数列的个数

    http://www.51nod.com/tutorial/course.html#!courseId=15 解题关键:主要是一种思想 $dp[i] = dp[i - 1]*2$ 如果a[i]不在之前 ...

  4. 【总结整理】webstorm插件使用

    <ul> <li><a href="#">1F 男装</a></li> <li><a href=&qu ...

  5. C++中栈结构建立和操作

    什么是栈结构 栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:后进先出. 我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物. 而从数据的逻 ...

  6. 第五课5、ROS客户端2

    1.简单的主题(topic)发布者和主题订阅者: 编写主题发布者节点需要: a.初始化ROS系统: b.广播消息:在foo主题上发布Foo_type_msg类型的消息 c.指定频率发布消息到foo主题 ...

  7. 20169219linux 内核原理与分析第四周作业

    系统调用 系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口. 一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程. 要访问系统调用 ...

  8. Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)

    题目链接 C. Hacking Cyphertime limit per test1 secondmemory limit per test256 megabytesinputstandard inp ...

  9. 获取指定日期相关DATENAME和DATEPART数据

    DATENAME和DATEPART有何区别,Insus.NET写成一个函数,可以方便查询与对比: 一个是返回一个字符串,另一个是返回一个整数. SET ANSI_NULLS ON GO SET QUO ...

  10. JavaScript -- 数据存储

    Cookie Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议. 一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪 ...