Servlet的生命周期以及线程安全问题
一: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的生命周期以及线程安全问题的更多相关文章
- Servlet生命周期与线程安全
上一篇介绍了Servlet初始化,以及如何处理HTTP请求,实际上在这两个过程中,都伴随着Servlet的生命周期,都是Servlet生命周期的一部分.同时,由于Tomcat容器默认是采用单实例多线程 ...
- servlet的生命周期与运行时的线程模型
第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...
- Servlet的生命周期+实现方式
1.Servlet的生命周期: (1)被创建: 默认情况下,Servlet第一次被访问时,被服务器创建.会调用init()方法. 一个 ...
- (转)Servlet的生命周期——初始化、运行、销毁全部过程
背景:面试中很基础的一个问题,所以有必要好好整理一番. Servlet体系结构是建立在 Java 多线程机制上的,它的生命周期由 Web 容器负责. 当客户端第一次请求某个 Servlet 时,Ser ...
- java基础78 Servlet的生命周期
1.Servlet的生命周期 简单的解析就是: 创建servlet实例(调用构造器)---->调用init()方法---->调用service()方法----->调用destroy( ...
- 第四天:servlet的生命周期和一些细节问题
1. servlet的生命周期: a) 流程 i. Web服务器首先会检查是否装载了该servlet的实例对象.如果装载了直接进行第四步. ii. 装载并创建该servlet的实例对象. ii ...
- Servlet 的生命周期 及 注意事项 总结
Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
- Servlet的生命周期及工作原理
Servlet生命周期分为三个阶段: 1,初始化阶段 调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...
随机推荐
- 关于Android阻塞的解决方法
首先新建一个线程,然后有两种方法 1.POST方法(直接,但是可读性差) 2.使用AnycTask类,可读性好,而且是POST方法的封装
- tensorflow placeholder
placeholder 是 Tensorflow 中的占位符,暂时储存变量. Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(), 然后以这种形式传输数 ...
- .Net开发中的@ 和 using 使用技巧
一.@符号的妙用 1.可以作为保留关键字的标识符 C#规范当中,不允许使用保留关键字(class.bool等)当作普通的标识符来命名,这时候@符号作用就体现 出来了,可以通过@符号前缀把这些保留关键字 ...
- 18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613) phpMyAdmin是一套开源的.基于Web的MySQL数据库管理工具.其index.php中存在一处文件包含逻辑, ...
- HDU 5971 Wrestling Match (二分图)
题意:给定n个人的两两比赛,每个人要么是good 要么是bad,现在问你能不能唯一确定并且是合理的. 析:其实就是一个二分图染色,如果产生矛盾了就是不能,否则就是可以的. 代码如下: #pragma ...
- Java 概述及安装使用
Java是什么 概述 java是一种面向对象编程语言,不过经过多年的发展,现在已经演变为了一套强大的技术体系.Java设计者们将Java划分为3种结构独立但却彼此依赖的技术体系分支,它们分别对应着不同 ...
- .net 前端传值和后端接收的几种方式
第一种:GET传参(常用): get传参方式就是链接?后写上参数和数据用&拼接. 第二种:POST传参(常用): 这种传参方式可以GET POST同时传,在链接上加参数后台用get方式接收,P ...
- Win10访问不了Samba网络共享的解决办法
一,首先安装SMB功能 1.打开"应用和功能",选择“程序和功能” 2.选择"开启或关闭windows功能" 3.选中下面红框中三个选项,点击确定,然后重启,就 ...
- Codeforces Round #558 (Div. 2)C(计算几何,排列组合,模拟)
#include<bits/stdc++.h>using namespace std;typedef struct{ double k,b;}node;node k[1000007];bo ...
- cookie中存取中文字符
1.存入中文: Cookie c = new Cookie("username", java.net.URLEncoder.encode(name,"utf-8" ...