servlet详解及Tomcat中多线程下的Servlet(1)
2019独角兽企业重金招聘Python工程师标准>>>
servlet作为java web开发举足轻重的东西,在此总结一下对Servlet的学习(jsp也是servlet)
一。servlet生命周期
加载—>实例化—>服务—>销毁
加载由web服务器容器完成。
- init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
- service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
- destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
service()源码如下(很简单,,几个if语句,,doGet比较特殊,需要判断传入内容容量大小):
/*** Receives standard HTTP requests from the public* <code>service</code> method and dispatches* them to the <code>do</code><i>Method</i> methods defined in* this class. This method is an HTTP-specific version of the* {@link javax.servlet.Servlet#service} method. There's no* need to override this method.** @param req the {@link HttpServletRequest} object that* contains the request the client made of* the servlet** @param resp the {@link HttpServletResponse} object that* contains the response the servlet returns* to the client** @exception IOException if an input or output error occurs* while the servlet is handling the* HTTP request** @exception ServletException if the HTTP request* cannot be handled** @see javax.servlet.Servlet#service*/protected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String method = req.getMethod();if (method.equals(METHOD_GET)) {long lastModified = getLastModified(req);if (lastModified == -1) {// servlet doesn't support if-modified-since, no reason// to go through further expensive logicdoGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);} catch (IllegalArgumentException iae) {// Invalid date header - proceed as if none was setifModifiedSince = -1;}if (ifModifiedSince < (lastModified / 1000 * 1000)) {// If the servlet mod time is later, call doGet()// Round down to the nearest second for a proper compare// A ifModifiedSince of -1 will always be lessmaybeSetLastModified(resp, lastModified);doGet(req, resp);} else {resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);}}} else if (method.equals(METHOD_HEAD)) {long lastModified = getLastModified(req);maybeSetLastModified(resp, lastModified);doHead(req, resp);} else if (method.equals(METHOD_POST)) {doPost(req, resp);} else if (method.equals(METHOD_PUT)) {doPut(req, resp);} else if (method.equals(METHOD_DELETE)) {doDelete(req, resp);} else if (method.equals(METHOD_OPTIONS)) {doOptions(req,resp);} else if (method.equals(METHOD_TRACE)) {doTrace(req,resp);} else {//// Note that this means NO servlet supports whatever// method was requested, anywhere on this server.//String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[1];errArgs[0] = method;errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);}}
二。Tomcat中的Servlet
tomcat中servlet运行时的时序图:
三。Servlet是单例的
在web访问中,每多一个用户,会在web容器中多一个用户线程。
多用户同时访问某个servlet的 doget方法时(在doget方法未使用字段,也就是该方法不依赖外界或者不更改外界变量),此时由于方法的执行在线程中是私有的,每个线程执行某个方法不影响。
于是乎,servlet是单例的,经过测试,init()方法只在servlet加载时执行,destroy()只在销毁时执行。
这样看来,servlet单例就够了。
四。Servlet测试,
测试servlet代码,TestThreadServlet.java:
package xatu.zsl.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Created by zsl on 2017/8/7.*/
@WebServlet("/TestThreadServlet")
public class TestThreadServlet extends HttpServlet {@Overridepublic void init() throws ServletException {System.out.println("执行了 init()");super.init();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet请求,线程名:" + Thread.currentThread().getName());try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("执行完毕!! doGet请求,线程名:" + Thread.currentThread().getName());super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}@Overridepublic void destroy() {System.out.println("执行了 destory()");super.destroy();}
}
doGet中做耗时操作,,,并打印当前线程名,
结果如下:
当然最后sotp,服务器关闭执行:
注意:未做耗时操作时,结果如下图,:
注意:只有十个线程,但是上面做耗时操作的却有多个线程。由此可见tomcat 自带线程池机制,默认创建了10个线程(当然可调)
转载于:https://my.oschina.net/xiaominmin/blog/1593219
servlet详解及Tomcat中多线程下的Servlet(1)相关推荐
- javaweb(07) Servlet详解
javaweb(07) Servlet详解 什么是Servlet 简介 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与web应用相关的一系列接口,是web应用实现方式的宏观解决 ...
- 【Java网络编程与IO流】Java之Java Servlet详解
Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...
- java调用项目中的文件_详解eclipse项目中.classpath文件的使用
1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...
- php各种编码集详解和在什么情况下进行使用 [php 字符集 显示]
http://blog.cnsunrun.com/member/blog/blog_info/30/84 ----------------------------------------------- ...
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)
作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(三)
NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attenion小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的 ...
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)
NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 前情提要:四万字全面详解 | 深度学习中的注意力机制(一) 目前深度学习中热点之一就是注意力机制(Attention ...
- 详解深度学习中的Normalization,不只是BN(2)
" 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Batch Normalization 大法自 2015 年由Google ...
- html子布局不超出父布局,详解flex布局中保持内容不超出容器的解决办法
在移动端,flex 布局很好用,它能够根据设备宽度来自动调整容器的宽度,用起来很方便,已经越来越离不开它,但是最近在做项目的时候发现一个问题. 就是在一个设置了 flex:1 的容器中,如果文字很长, ...
- java 泛型详解、Java中的泛型方法、 java泛型详解
本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...
最新文章
- 基于纯 CSS3 技术实现美观的标签云效果
- 嵌入式学习笔记-LM75温度传感器驱动总结
- 高清变脸更快更逼真!比GAN更具潜力的可逆生成模型来了 | OpenAI论文+代码
- hibernate基本映射文件
- 学习《apache源代码全景分析》之摘录
- (原创)浅谈任意文件下载漏洞的利用
- es6 --- 内置的Symbol值
- java面向对象中的抽象,类与对象
- python输出格式控制_Python3.x那些事儿:[50]多种多样的输出格式
- 南方科技大学-计算智能与先进制造方向-博士-博士后-研究助理招聘
- Chrome三天内的第二枚0Day
- 剖析 |数据现代化-富国银行的数据转型之路
- Android 入门实例完整代码
- 【WiFi】wifi信道
- opencv给视频加字幕加炫光
- 前端项目如何添加配置文件
- Win10下取消U盘/移动硬盘“写保护”的方法
- Chrome 火焰图
- 框架系列课程-Spring新版本
- Python配置新环境时,复制已经安装好虚拟环境的三种方法