• Servlet是否单例?


    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

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     5     id="SessionQuiz" version="3.1">
     6 
     7     <display-name>SessionQuiz</display-name>
     8 
     9     <servlet>
    10         <servlet-name>hello</servlet-name>
    11         <servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
    12     </servlet>
    13     <servlet-mapping>
    14         <servlet-name>hello</servlet-name>
    15         <url-pattern>/hello</url-pattern>
    16     </servlet-mapping>
    17 
    18     <servlet> 
    19         <servlet-name>hell</servlet-name> 
    20         <servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class> 
    21     </servlet>
    22     <servlet-mapping>
    23         <servlet-name>hell</servlet-name>
    24         <url-pattern>/hell</url-pattern>
    25     </servlet-mapping>
    26 
    27     <welcome-file-list>
    28         <welcome-file>index.jsp</welcome-file>
    29     </welcome-file-list>
    30 </web-app>

    (3)实验一

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

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

    (4)试验二

    把如下代码

    1     <servlet>
    2         <servlet-name>hell</servlet-name>
    3         <servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
    4     </servlet>
    5     <servlet-mapping>
    6         <servlet-name>hell</servlet-name>
    7         <url-pattern>/hell</url-pattern>
    8     </servlet-mapping>

    替换为

    1     <!-- <servlet>
    2         <servlet-name>hell</servlet-name>
    3         <servlet-class>com.raven.quiz.servlet.HelloServlet</servlet-class>
    4     </servlet> -->
    5     <servlet-mapping>
    6         <servlet-name>hello</servlet-name>
    7         <url-pattern>/hell</url-pattern>
    8     </servlet-mapping>

    再次分别访问http://localhost:8080/SessionQuiz/hellohttp://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实例的方式。

  • 相关阅读:
    Nodejs核心模块之net和http的使用详解
    Node基础:1
    js中const,var,let区别
    count(1)与count(*)比较
    基于物联网实现的智能物流系统
    树莓派 Learning 002 装机后的必要操作 --- 07 设置静态IP地址
    树莓派 Learning 002 装机后的必要操作 --- 06 共用键鼠 之 windows和树莓派
    Ubuntu Linux 使用桂电校园网 上网
    树莓派 Learning 002 装机后的必要操作 --- 00 修改键盘布局
    树莓派 Learning 002 装机后的必要操作 --- 05 给树莓派搭建“x86 + pi”环境 -- 安装**32位运行库** -- 解决`E:未发现软件包 xxx` 问题
  • 原文地址:https://www.cnblogs.com/yitouniu/p/9066566.html
Copyright © 2020-2023  润新知