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实例以便它能够被垃圾回收。
Java中Error与Exception的区别:
Exceptions
1.可以是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一个由程序员导致的错误
3.应该在应用程序级被处理
Errors
1.总是 不可控制的(unchecked)
2.经常用来用于表示系统错误或低层资源的错误
3.如何可能的话,应该在系统级被捕捉
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情
进程与线程的区别:
通俗的解释
一个系统运行着很多进程,可以比喻为一条马路上有很多马车
不同的进程可以理解为不同的马车
而同一辆马车可以有很多匹马来拉----这些马就是线程
假设道路的宽度恰好可以通过一辆马车
道路可以认为是临界资源
那么马车成为分配资源的最小单位(进程)
而同一个马车被很多匹马驱动(线程)----即最小的运行单位
每辆马车马匹数>=1
所以马匹数=1的时候进程和线程没有严格界限,只存在一个概念上的区分度
马匹数>1的时候才可以严格区分进程和线程
专业的解释
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
Java的序列化接口的作用:
Serializable接口,是作为一个标记使用的,因为本身没有任何方法需要实现;
Java内部的序列化机制会检查此接口,如果有这个接口,则序列化它,否则不序列化。
典型的用途是在分布式Java编程里,比如通过RMI或者EJB,需要在网络上传输的对象,一定要实现此接口,否则程序会出错,因为在网络上传递对象需要先序列化它。
使用序列化的目的有一个两个:一个是为了persistent对象,如在Hibernate中要保存的对象必须是序列化的;第二个是为了跨平台传输,消除平台间的差异,如在JMS中,传送的消息对象都必须是序列化的.
Hibernate的三种状态以及表现形式:
objects在hibernate中的生命周期中存在3种状态:transient, persistent, detached。附件1描述的即是hibernate application中objects的生命周期。
通过new操作符生成的object是transient object,此时的object还没有和数据库中的任何数据关联,所以一旦没有被引用,就会被jvm垃圾收集。一旦通过Hibernate 的Persistence manager执行了save()方法或者被其他已经存在的Persistent objects引用,那么object的状态就会从transient转为persistent。
Persistent objects是包含在transactions中的,它们的状态是通过transactions来控制的, Persistent objects是和数据库中的表对应的,所以表示主键的属性不会为空,也就是说每一个persistent object都会有一个匹配的database identity,除非是通过new产生的新的transient object,此时object的database identity是空的,如果在transaction中对该object执行save()方法,那么在transaction成功结束的时候该 object会在数据库中新增一条对应的记录,其它已经存在的persistent objects会相应的更新数据库中的相应行。
当Hibernate中的Persistence Manager执行close()方法,也就是persistence Manager放弃对persistent objects的控制,那么persistent objects的状态就转为detached objects。这些detached objects可以在未来被新的persistence manager重新控制并使用。这种将object从transaction转向表现层然后又重新包含于新的Transaction的实现是 Hibernate的一个卖点。
在objects存在的三种状态中,处于persistent状态中object的比较是通过该object的database identity来确定的,所以这里需要override equals()来实现。其它状态中的objects就可以简单的通过java的equality来判断即可。
- 大小: 28.2 KB
分享到:
相关推荐
### 阿里巴巴面试题总结之JVM深入解析 #### 一、JVM中类的生命周期 在Java虚拟机(JVM)中,一个类从加载到卸载的整个生命周期可以分为以下七个阶段: 1. **加载(Loading)**: - 类加载器通过全名获取定义此类的...
阿里java后台开发面试题总结
以下是一些针对阿里巴巴2023年Java面试题的相关知识点: 1. **Java语言特点**: - **简单易学**:Java的设计目标是易于学习,其语法简洁,避免了C++等语言的复杂性。 - **丰富的类库**:Java拥有庞大的标准类库,...
阿里巴巴前端面试题总结.md
阿里巴巴校园招聘笔试面试题淘宝校园招聘笔试试题27个文档资料合集: 2012阿里巴巴校园招聘阿里云C++笔试试题.doc 2013年阿里巴巴校园招聘笔试试题研发工程师.doc 2014年3月阿里巴巴实习招聘笔试题及部分答案.docx ...
根据提供的信息,我们可以总结出这份文档是关于iOS面试题的一部分,特别强调了与阿里巴巴相关的面试题目。虽然原文中包含大量非可读字符,但通过整理和解析,我们能够提炼出以下关键知识点: ### dSYM 文件 1. **...
### 阿里面试总结及答案 #### 一、Java事件机制 Java事件机制是Swing框架中的核心组件之一,它允许程序响应用户输入或其他事件。该机制主要包括三个方面:事件、事件监听器以及事件源。 - **事件**:通常继承自`...
### 阿里巴巴面试题知识点解析 #### 1. 影响最深的项目及其原因 - **知识点概述**:面试官通过这个问题想要了解应聘者对于项目的理解、参与程度以及从中学到的经验。 - **解析**:回答这类问题时,应该选择一个...
### 阿里巴巴校园招聘面试试题合集总结 #### forward与redirect的区别 **1.1 地址栏显示** - **forward(转发)**:当服务器接收到客户端的请求后,通过`forward`的方式将请求交给另一个资源处理。在这个过程中,...
关于面试 面(笔)试特点 一些例题 概率(例1,2) 智力题(例3) 数据结构与算法 (例4,5, 6) 实际系统 (例7) 总结
阿里巴巴面试题leetcode 程序猿提高篇。 PDF的质量都很高,建议打印出来看 环装 或者胶装 AngularJS 中文版 - v1.0 (推荐) Java 程序员眼中的 Linux - v1.0 Learning-Linux (慕课网 linux 系列课程总结) Axure RP ...
本文将对阿里巴巴 Java 面试题进行详细的解析和总结,涵盖 Java 集合框架、Hashtable 与 HashMap 的区别、ArrayList 和 LinkedList 的区别、Properties 类的特点、线程安全、Struts2 框架、反射机制、线程池、Tomcat...
【阿里巴巴销售人员面试题详解】 阿里巴巴作为全球知名的电子商务巨头,其销售人员的面试题目旨在评估候选人的销售技巧、经验、解决问题的能力以及对公司产品和服务的理解。以下是对这些面试题目的详细解析: 1. ...
1. **阿里巴巴面试题**:作为中国领先的互联网巨头,阿里巴巴的面试通常包括技术、算法、项目经验和业务理解等多方面。17年阿里面试题可能涉及当年热门的技术和业务场景,例如云计算、大数据、分布式系统以及互联网...
【PHP程序员在阿里巴巴面试中的知识点】 1. **缓存系统对比**: - Memcached和Redis都是常用的缓存系统。Memcached是多线程的,而Redis是单线程。在CPU利用率方面,Memcached通常比Redis更高。 - Redis支持更多的...
阿里巴巴作为电商领域的领头羊,其面试题往往与数据结构和算法紧密相关。面试中可能会遇到的问题有:如何设计一个高并发的购物车系统,或者如何实现高效的推荐算法。此外,链表操作、二叉树遍历、滑动窗口等经典算法...
在总结的面试题中,还提到了如何检查表的统计信息是否更新,这是性能调优的一个关键步骤。定期使用ANALYZE命令或者DBMS_STATS包来更新统计信息,有助于CBO优化器制定出更准确的执行计划。对于小表,由于它们的统计...
阿里巴巴面试题leetcode LeetcodeTop 本仓库用于汇总互联网公司技术岗考察leetcode题目的热度:fire:,帮助同学们更加有针对性地准备面试。 总结实属不易,恳求大家给个star:star: 如果想了解部门偏爱考察的题目或按...
从提供的文件内容来看,面试题主要集中在SQL优化、Oracle优化器工作原理以及性能监控等方面。 首先,文件中提到的SQL Tuning(SQL优化)是数据库性能优化的关键环节。文件介绍了三种表的常用连接方式:NESTED LOOP...
【阿里巴巴校园招聘面试试题解析】 面试中涉及到的知识点主要包括了Web开发、Servlet、框架、数据库管理、问题解决策略等多个方面,下面将详细解读这些知识点。 1. **Forward 和 Redirect 区别** - Forward(转发...