1,测试环境:

Java SE版本:1.8.0_161(AMD64)

Tomcat版本:9.0.7(AMD64)

2,试验

(1)编写HelloServlet。

  由于测试代码很简单,此处只列出doGet方法的实现。

resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");
        PrintWriter writer = resp.getWriter();
        writer.write("Hash Code : " + this.hashCode());

(2)配置Servlet

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="SessionQuiz" version="3.1"> <display-name>SessionQuiz</display-name> <servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>hell</servlet-name>
<servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hell</servlet-name>
<url-pattern>/hell</url-pattern>
</servlet-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

(3)实验一

分别访问http://localhost:8080/SessionQuiz/hello和http://localhost:8080/SessionQuiz/hell两个URL

返回页面显示两个不同的Hash Code。说明创建了两个不同的HelloServlet实例。

(4)试验二

把如下代码

     <servlet>
<servlet-name>hell</servlet-name>
<servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hell</servlet-name>
<url-pattern>/hell</url-pattern>
</servlet-mapping>

替换为

     <!-- <servlet>
<servlet-name>hell</servlet-name>
<servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
</servlet> -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hell</url-pattern>
</servlet-mapping>

再次分别访问http://localhost:8080/SessionQuiz/hello和http://localhost:8080/SessionQuiz/hell两个URL

返回页面显示完全相同的Hash Code。说明Web容器只创建了一个HelloServlet实例。

(5)试验结论

  • Servlet名称相同,映射的URI不同,则Web容器只创建一个Servlet实例。
  • Servlet名称和映射的URI都不同,则Web容器分别为这个两个不同的URI创建一个Servlet实例。

3,最终结论

  • Servlet实例并非线程安全的。故,对于在多个请求之间共享的数据进行操作必须确保数据一致性。
  • 不建议使用javax.servlet.SingleThreadModel接口。因为此接口已经被Java EE API废弃了。

当然,还有其他的方式来验证Servlet实例化的问题。比如,通过监听创建Servlet实例的方式。

Servlet是否单例?的更多相关文章

  1. struts2的action是多例,servlet是单例

    struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的 属性不一样,操作得出的 ...

  2. Servlet以及单例设计模式

    1.Servlet概述 a)Servlet,全城是Servlet Applet,服务器端小程序,是一个接口,定义了若干方法,要求所有的Servlet必须实现. b)Servlet用于接收客户端的请求, ...

  3. Servlet是单例的吗?

    如题,是吗?首先我们得搞清楚啥是单例.一聊起单例,条件反射的第一个想到的自然是单例模式.单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供.如果按照Java中单例的定义,那么当Ser ...

  4. struts2,servlet和springmvc的单例多例问题

    struts2,servlet和springmvc的单例多例问题 原创 2017年06月12日 09:59:21 标签: struts2 / servlet / springmvc / 单例 / 多例 ...

  5. Spring工作原理与单例

    最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...

  6. SpringMVC中的Controller默认单例

    众所周知,Servlet是单例的. 在struts中,Action是多例的,每一个请求都会new出来一个action来处理. 在Spring中,Controller默认是单例的,多个请求都会访问同一个 ...

  7. 单例设计模式-java

    在实际项目中单例模式常见应用场景列举如下: 1.servlet编程中,每个servlet就是单例 2.网站计数器,和Application(servlet中涉及) 3.Strucs1框架中,控制器对象 ...

  8. Servlet 单例多线程

    Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在 ...

  9. servlet单例多线程

    Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在 ...

随机推荐

  1. 完整的http请求分析

    首先我们要明白什么是http. http:超文本传输协议(HTTP,HyperText Transfer Protocol). 超文本传输协议是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...

  2. 雷达无线电系列(一)几种常见的幅度分布函数(matlab)

    文件下载地址: https://github.com/mufasa007/myblog/tree/master/%E9%9B%B7%E8%BE%BE%E6%97%A0%E7%BA%BF%E7%94%B ...

  3. BBS论坛(三十)

    30.显示评论和添加评论功能完成 (1)apps/models.py class CommentModel(db.Model): __tablename__='comment' id=db.Colum ...

  4. BBS论坛(三)

    3.1.cms用户名渲染和注销功能实现 显示登录的用户名 (1)app/cms/hooks.py from .views import bp import config from flask impo ...

  5. 微信小程序使用nginx方向代理实现内嵌非业务域名

    通过上一篇文章简单介绍了一下微信小程序的新组件<web-view>,实现了在小程序中内嵌业务域名的功能.但是boss要的小程序中不仅想内嵌业务域名,还想要打开一些非业务域名(无法操作web ...

  6. C#版 - 226. Invert Binary Tree(剑指offer 面试题19) - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - 2 ...

  7. 《HelloGitHub月刊》第 11 期

    <HelloGitHub>第 11 期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 简介 最开始我只是想把自己在浏览 GitHub 过程中,发现的有意思.高 ...

  8. Python列表的深浅复制

    概述 Python的列表可以复制,但是这里面有浅复制和深复制,我相信有些人不明白什么是深复制和浅复制,今天我们就来谈谈. = 号复制 #!/usr/bin/env python # -*- codin ...

  9. Chapter 5 Blood Type——9

    He grimaced. 他扮了一个鬼脸. "Or better," I continued, the pent-up annoyance flowing freely now, ...

  10. C#2.0导航

    主要特性 泛型 类型和方法的参数化 可空类型 值类型可为null 委托 更简化的方式 迭代器 简单的foreach,不简单的状态机