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)相关推荐

  1. javaweb(07) Servlet详解

    javaweb(07) Servlet详解 什么是Servlet 简介 从广义上来讲,Servlet规范是Sun公司制定的一套技术标准,包含与web应用相关的一系列接口,是web应用实现方式的宏观解决 ...

  2. 【Java网络编程与IO流】Java之Java Servlet详解

    Java网络编程与IO流目录: [Java网络编程与IO流]Java中IO流分为几种?字符流.字节流.缓冲流.输入流.输出流.节点流.处理流 [Java网络编程与IO流]计算机网络常见面试题高频核心考 ...

  3. java调用项目中的文件_详解eclipse项目中.classpath文件的使用

    1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...

  4. php各种编码集详解和在什么情况下进行使用 [php 字符集 显示]

    http://blog.cnsunrun.com/member/blog/blog_info/30/84 ----------------------------------------------- ...

  5. 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)

    作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...

  6. 【NLP】四万字全面详解 | 深度学习中的注意力机制(三)

    NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attenion小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的 ...

  7. 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)

    NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记  前情提要:四万字全面详解 | 深度学习中的注意力机制(一) 目前深度学习中热点之一就是注意力机制(Attention ...

  8. 详解深度学习中的Normalization,不只是BN(2)

    " 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Batch Normalization 大法自 2015 年由Google ...

  9. html子布局不超出父布局,详解flex布局中保持内容不超出容器的解决办法

    在移动端,flex 布局很好用,它能够根据设备宽度来自动调整容器的宽度,用起来很方便,已经越来越离不开它,但是最近在做项目的时候发现一个问题. 就是在一个设置了 flex:1 的容器中,如果文字很长, ...

  10. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

最新文章

  1. 基于纯 CSS3 技术实现美观的标签云效果
  2. 嵌入式学习笔记-LM75温度传感器驱动总结
  3. 高清变脸更快更逼真!比GAN更具潜力的可逆生成模型来了 | OpenAI论文+代码
  4. hibernate基本映射文件
  5. 学习《apache源代码全景分析》之摘录
  6. (原创)浅谈任意文件下载漏洞的利用
  7. es6 --- 内置的Symbol值
  8. java面向对象中的抽象,类与对象
  9. python输出格式控制_Python3.x那些事儿:[50]多种多样的输出格式
  10. 南方科技大学-计算智能与先进制造方向-博士-博士后-研究助理招聘
  11. Chrome三天内的第二枚0Day
  12. 剖析 |数据现代化-富国银行的数据转型之路
  13. Android 入门实例完整代码
  14. 【WiFi】wifi信道
  15. opencv给视频加字幕加炫光
  16. 前端项目如何添加配置文件
  17. Win10下取消U盘/移动硬盘“写保护”的方法
  18. Chrome 火焰图
  19. 框架系列课程-Spring新版本
  20. Python配置新环境时,复制已经安装好虚拟环境的三种方法

热门文章

  1. 智能优化算法:黑寡妇算法 -附代码
  2. 模板题——贪心(2)
  3. 模板题——容斥原理、博弈论
  4. MODIS三种常见数据辐射定标处理
  5. Android Dialog的简单说明
  6. java writer 乱码_Java servlet 使用 PrintWriter 时的编码与乱码
  7. 初识区块链【区块链01】
  8. 《Android音视频开发》封面由你来投票
  9. 【Android动画】仿新浪微博雷达搜索效果
  10. java设置user.dir_使用java系统属性user.dir读取配置文件