`

理解Servlet的生命周期的重点:非线程安全

阅读更多

初学Java Web 开发的者,常会忽略Servlet的特性:非线程安全。

所谓线程安全就是:每一次调用是独立的结果,不应当受其它调用的影响。从代码上看就是:函数执行中使用的变量都应该是临时的,不应该是全局变量或者实例成员变量,简单的说就是:执行函数必须是无状态执行。

再来说为什么Servlet是非线程安全:因为Servlet的所谓生命周期是由Web服务器的Servlet容器管理的,Web服务器对相同的Servlet 只会实例化一次,也就是说同一个URL地址的多次请求,都是由同一个Servlet的实例在执行。所以,响应请求的函数一定要做到无状态执行。

下面这个例子,演示了一个错误的代码:

public class HelloWorld extends HttpServlet {
  private PrintWriter pr;
  
  private void getWriter(HttpServletResponse resp) throws IOException {
      pr = resp.getWriter();
  }

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp)	throws ServletException, IOException {
    getWriter(resp);//问题所在,产生了状态变量
    try {
      Thread.sleep(9000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    out("getQueryString:"+req.getQueryString());//问题所在,使用了状态变量
  }
        
  private void out(String s) {
    pr.write(gp(s));
  }

  private String gp(String s) {
    return "<p>" + s + "<p>";
  }
}

 开两个浏览窗口,先在第一个窗口的请求:http://127.0.0.1/hello?name=mike,

然后再在第二个窗口的请求:http://127.0.0.1/hello?name=jonh

会观察到第一个窗口没有任何输出,第二个窗口输出是:

getQueryString:name=mike
getQueryString:name=jonh

之所以出现如此异常现象,就是因为 pr 是一个状态变量,第二次请求时,pr 被改写了,所以每一次请求的输出就定向到第二个窗口了。

 

servlet 是这样,同理JSP也一样,因为JSP本质上是Servlet.

分享到:
评论

相关推荐

    Servlet线程安全问题.docx

    在上一篇关于Serlvet框架和Servlet生命周期的学习中,我们已经知道了在多线程的情况下 Servlet是线程不安全的。Servlet体系是建立在java多线程的基础之上的,它的生命周期是由Tomcat 来维护的。当客户端第一次请求...

    Servlet+API中文API[China]

    Servlet API 中文参考 chm,涉及Servet资料资料、API介绍,讲述Servlets概论、生命周期、解析和载入、初始化、 Servlet处理请求、多线程和映射、Servlet的卸载、Servlet映射技术、通... Servlet API 中文参考 chm,...

    培训资料_servlet

    1、Servlet基本概念 2、Servlet基本运用、配置 3、Servlet生命周期 4、Servlet线程安全 5、Model2与MVC设计模式 6、过滤器 7、分页 8、上传组件SmartUpload 9、监听器 10、配置Tomcat连接池 11、实用技术

    JSP/Servlet Java面试逻辑题

    1、说一说Servlet的生命周期?★★★★★ 答: servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。 这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 2、...

    servlet传参

    1. 理解servlet的生命周期 知道什么是servlet:运行在服务器端的一个单实例多线程的服务器端Java应用程序(手动的配置servlet) 2. 熟练掌握通过servlet接受参数信息

    Java web中servlet学习笔记 核心

    Java web中servlet学习笔记 核心。servlet执行过程、servlet生命周期、继承类、创建servlet、servlet线程安全、配置信息

    JSP和Servlet面试题

    Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》 方法初始化servlet,再根据不同请求调用doGet或doPost...

    java-servlet-api.doc

    一个Javaservlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。 所有的...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    Javaweb面试题.docx

    说出Servlet 的生命周期,并说出Servlet 和CGI 的区别? 【基础】 答:Web 容器加载Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其init 方法进行Servlet 的初始化,请求到达时运行其service 方法,...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    2023Java高频面试题

    Servlet与JSP:Web开发的基础知识、Servlet和JSP的基础概念、生命周期、内置对象等。 设计模式:单例模式、工厂模式、代理模式等常见的设计模式。 算法和数据结构:二叉树、排序算法、查找算法等基础知识。 在面试

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    6.4 servlet生命周期 224 6.5 servlet上下文 226 6.5.1 servletcontext接口 226 6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 ...

    方立勋Servlet开发视频课程(28讲)

    教程名称:方立勋Servlet开发视频课程(28讲)课程目录:【】01-servlet开发入门【】02-servlet的调用过程和生命周期【】03-使用eclipse开发servlet【】04-HttpServlet和一些开发细节【】05-Servlet开发的一些重要...

    Java™ Servlet 规范.

    2.3 Servlet 生命周期 .......................................................................................................................................16 2.3.1 加载和实例化 .........................

    servletapi

    Servlet API 中文参考 chm,涉及Servet资料资料、API介绍,讲述Servlets概论、生命周期、解析和载入、初始化、 Servlet处理请求、多线程和映射、Servlet的卸载、Servlet映射技术、通过类名调用Servlet、HTTP会话、...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    说明:10分虽然有点高 但东西值 重点是 我也只想搞点分数下东西 谢谢支持 目录 I 简介 1 概览 1 适合读者 1 servlet容器是如何工作的 1 catalina结构图 1 tomcat的版本4和版本5 2 章节简介 2 第1章 一个简单的Web...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    线程的创建方式与生命周期 线程核心机制,基础概念扩展 多线程并发访问,同步控制 线程间通信,等待/通知机制 锁锁机制,API详解 Fork/Join 框架机制详解 Executor线程池框架简介 面向对象 泛型机制与反射原理 ...

Global site tag (gtag.js) - Google Analytics