`
liran_java
  • 浏览: 68328 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

servlet的生存期

阅读更多

servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。

  1、加载和实例化

  容器负责加载和实例化一个servlet。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该servlet为客户请求服务的时候。

  首先容器必须先定位servlet类,在必要的情况下,容器使用通常的Java类加载工具加载该servlet,可能是从本机文件系统,也可以是从远程文件系统甚至其它的网络服务。容器加载servlet类以后,它会实例化该类的一个实例。需要注意的是可能会实例化多个实例,例如一个servlet类因为有不同的初始参数而有多个定义,或者servlet实现SingleThreadModel而导致容器为之生成一个实例池。

  2、初始化

  servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成这个过程。给它传递的这个配置对象允许servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给servlet提供了访问实现了ServletContext接口的具体对象的方法,该对象描述了servlet的运行环境。

  2.1初始化的错误处理

  在初始化期间,servlet实例可能通过抛出UnavailableException 或者 ServletException异常表明它不能进行有效服务。如果一个servlet抛出一个这样的异常,它将不会被置入有效服务并且应该被容器立即释放。在此情况下destroy方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。

  2.2、工具因素

  当工具(注:根据笔者的理解,这个工具可能是应用服务器的某些检查工具,通常是验证应用的合法性和完整性)加载和内省(introspect)一个web应用时,它可能加载和内省该应用中的类,这个行为将触发那些类的静态初始方法被执行,因此,开发者不能假定只要当servlet的init方法被调用后它才处于活动容器运行状态(active container runtime)。作为一个例子,这意味着servlet不能在它的静态(类)初始化方法被调用时试图建立数据库连接或者连接EJB容器。

  3、处理请求

  在servlet被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest类型的对象代表,而servlet使用ServletResponse回应该请求。这些对象被作为service方法的参数传递给servlet。在HTTP请求的情况下,容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创建一个servlet实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。

  3.1、多线程问题

  容器可能同时将多个客户端的请求发送给一个实例的service方法,这也就意味着开发者必须确保编写的servlet可以处理并发问题。如果开发者想防止这种缺省的行为,那么他可以让他编写的servlet实现SingleThreadModel。实现这个类可以保证一次只会有一个线程在执行service方法并且一次性执行完。容器可以通过将请求排队或者维护一个servlet实例池满足这一点。如果servlet是分布式应用的一部分,那么,那么容器可能在该应用分布的每个JVM中都维护一个实例池。如果开发者使用synchronized关键字定义service方法(或者是doGet和doPost),容器将排队处理请求,这是由底层的java运行时系统要求的。我们强烈推荐开发者不要同步service方法或者HTTPServlet的诸如doGet和doPost这样的服务方法。

  3.2、处理请求中的异常

  servlet在对请求进行服务的时候有可能抛出ServletException或者UnavailableException异常。ServletException表明在处理请求的过程中发生了错误容器应该使用合适的方法清除该请求。UnavailableException表明servlet不能对请求进行处理,可能是暂时的,也可能是永久的。如果UnavailableException指明是永久性的,那么容器必须将servlet从服务中移除,调用它的destroy方法并释放它的实例。如果指明是暂时的,那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求。在这个时间段里面被被拒绝的请求必须使用SERVICE_UNAVAILABLE (503)返回状态进行响应并且应该携带稍后重试(Retry-After)的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和永久性的不可用进行区分而全部当作永久性的并移除抛出异常的servlet。

  3.3线程安全

  开发者应该注意容器实现的请求和响应对象(注:即容器实现的HttpServletRequest和HttpServletResponese)没有被保证是线程安全的,这就意味着他们只能在请求处理线程的范围内被使用,这些对象不能被其它执行线程所引用,因为引用的行为是不确定的。

  4、服务结束

  容器没有被要求将一个加载的servlet保存多长时间,因此一个servlet实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间(但是肯定会短于容器的生存期)当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许servlet释放它正在使用的任何资源并保存任何永久状态(这个过程通过调用destroy方法达到)。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy之前)。一旦destroy方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该servlet,它必须创建新的实例。destroy方法完成后,容器必须释放servlet实例以便它能够被垃圾回收。  

分享到:
评论

相关推荐

    JSP/Servlet Java面试逻辑题

    这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 2、servlet的生命周期 答: web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。 通过调用service...

    servlet +API+实例

    Servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.Servlet.Servlet接口的init,service和destroy方法表达。

    java servlet请求转发重定向

    3. **ServletContext:** 共享对象在整个应用程序的生存期内可被访问。 **示例代码:** - **使用`HttpServletRequest`对象存储数据:** ```java request.setAttribute("score", score); int score = (Integer) ...

    Servlet Cookie基本概念和使用方法.pdf

    - **设置Cookie属性**:可以使用`setMaxAge(int seconds)`设定生存期,`setPath(String path)`定义作用路径,`setDomain(String domain)`指定适用的域名,以及`setSecure(boolean flag)`来决定是否仅在HTTPS连接中...

    JavaWeb面试题汇编.pdf

    JavaWeb面试题汇编 第四章 JSP篇 69. Forward 和 Redirect 的区别 Forward 是服务器请求资源,服务器直接访问目标地址的 URL,把...这个生存期由 javax.servlet.Servlet 接口的 init、service 和 destroy 方法表达。

    上传mvc练习题

    在这个例子中,如果用户成功登录,用户名将被存储为一个持久性Cookie(生存期较长),而学号则存储在一个会话Cookie(生存期较短,浏览器关闭时消失)。`LoginCookieServlet`会检查请求中是否有名为"username"的...

    java常见笔试题

    - `cookie`:在客户端存储数据,有限的大小和生存期。 8. **JSP和Servlet的关系**: - JSP是Servlet的简化形式,强调视图展示。 - JSP编译后成为Servlet类。 - Servlet负责控制逻辑,JSP用于呈现视图。 - JSP...

    javaweb 简历

    JavaWeb 简历系统 ...Servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。在 Servlet 生命周期中,每个 Servlet 实例都有其生命周期,包括初始化、服务和销毁三个阶段。

    jsp四种会话跟踪技术

    7. **application**:全局范围的上下文,是`javax.servlet.ServletContext`的实例,生存期与Web应用相同。 8. **config**:表示Servlet的配置信息,是`javax.servlet.ServletConfig`的实例。 9. **pageContext**:...

    J2EE知识点概括(如果哪个需要面试的 可以参考看看)

    2. **Cookie**:创建并发送Cookie,通过`setMaxAge()`设置生存期,然后在客户端通过`request.getCookies()`获取。 3. **隐藏表单域**:在HTML中使用`<input type="hidden">`元素传递数据。 4. **URL重写**:通过URL...

    Jsp面试题目.doc

    这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表示。 JDBC 连接数据库 JDBC 连接数据库的步骤包括:加载驱动程序、建立连接、创建语句、执行语句、处理结果、关闭连接。 Statement ...

    JSP编程指南(pdf)

    本书全面系统地介绍了如何运用JSP设计并构架动态web站点和web应用,阐述了JSP标签的语法和生存期以及Servlet的概念;分忻了JSP体系结构以及JSP与J2EE API的关系;更通过大量的案例分析对如何使用JSP、XML和XSLT在WAP...

    niit4嵌入式

    8. **设置Cookie有效期**:在Java中,设置Cookie的最大生存时间使用`setMaxAge(int seconds)`方法。 9. **JSP的作用**:JSP的主要用途是分离内容生成(后端逻辑)和内容展示(前端界面)。它允许开发者在HTML中嵌入...

    获得上次访问时间(cookie)

    要删除特定的Cookie,可以创建一个具有相同名称的新Cookie,但将其最大生存期设置为0,这将指示浏览器立即删除该Cookie。 ```java Cookie lastAccessCookie = new Cookie("lastAccessTime", ""); lastAccessCookie....

    2021-2022计算机二级等级考试试题及答案No.14140.docx

    12. 变量作用域和生存期: - C. 同一过程内,Dim定义的局部变量和Static定义的变量作用域不同,前者仅限过程内,后者在整个窗体级别。 13. 线性表顺序存储: - A. 线性表顺序存储时,元素的存储顺序与逻辑顺序...

    Cookie与Session机制

    - 生存期:Session默认有一定生存期,过期后会丢失数据,需谨慎设置。 **选择Cookie还是Session** 选择Cookie还是Session取决于具体需求和场景。Cookie适合存储少量、非敏感的信息,如用户首选项;而Session适用...

    JAVA struts2 框架 面试题

    Servlet 生命周期定义了 Servlet 的生存期,包括加载和实例化、初始化、处理请求以及服务结束。Servlet 被服务器实例化后,容器运行其 init 方法,请求到达时运行其 service 方法,service 方法自动派遣运行与请求...

    jsp session

    session 对象的生存期从客户首次访问服务器上的 JSP 页面时开始,直到关闭浏览器。 三、session 对象的方法 session 对象有多种方法,包括: 1. getAttribute(String attributeName):返回该会话中与指定名称绑定...

    软件开发案例复习提纲

    1. **软件工程生存期模型**: - **瀑布模型**:一种线性的开发方法,每个阶段依赖于前一阶段的完成,一旦进入下一阶段,就无法回溯。 - **V模型**:强调了测试与开发的对应关系,每个开发阶段都有对应的验证阶段,...

    FASTCGI中文手册

    而FastCGI采用长生存期应用程序的模式,一旦启动,就能持续处理多个请求,无需频繁创建和销毁进程,从而减轻服务器负担,提升效率。FastCGI的设计思想对后来的Java Servlet技术产生了影响。 FastCGI的特点包括: 1....

Global site tag (gtag.js) - Google Analytics