全部博文(626)
分类: Java
2013-09-22 09:34:41
J2EE Architecture(6)
1、企业解决方案
很多企业在发展过程中,购置或自行开发了多种应用软件,这些软件,可能基于不同的硬件,使用互不兼容的操作系统,经专用协议与其它应用程序交流信息。
为了满足这些应用程序的异步通信要求,一批中间件解决方案应运而生。如IBM的MQ系列、TIBCO公司的TIBCO、微软的MSMQ,但这些方案带来了其它的问题。因为无论是否使用了中间件,这些解决方案都缺少规范约束,企业也不愿接受这种思维。
注:MSMQ(Microsoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。其实现原理是:消息的发送者把自己想要发送的消息放入一个容器中(称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。
J2EE是很好的企业解决方案。在J2EE上,可以快捷地开发和部署企业应用程序,可将应用程序部署为“组件”,并在“容器”环境中部署这些组件。
2、J2EE规范
J2EE规范本质上是文档记录,详细描述一些约束企业平台行为的规则和条件。J2EE规范主要面向一下两类专业人员:
1)J2EE平台和解决方案厂商
2)企业应用程序架构师和开发人员
3、Servlet规范
1)Servlet是运行在Web服务器上的Java程序,用于响应客户请求。
Servlet是Java组件,部署在Web服务器上,能在请求/响应通信模式下有效工作。
2)GenericServlet是独立于协议的Servlet。按照需要扩展GenericServlet后可以实现与协议相关的Servlet。HttpServlet就是一个典型例子,它扩展了GenericServlet,并将HTTP作为通信协议。
3)Servlet2.3文档的Servlet规范
4、Servlet规范详解
1)Servlet接口
可使用两种方式之一创建Servlet:
(1)实现Servlet接口
(2)扩展的GenericServlet类或javax.servlet.http.HttpServlet类
在创建Servlet后,还要描述Servlet细节,以及在运行时环境中,Servlet及Web应用程序中其它关联Web组件的附加信息。
规范将XML文档中嵌入的这些信息称为部署描述符,供Web容器在部署组件时使用。在创建和部署Servlet后,Servlet成为Web服务器“容器”中的“实例”。
Web组件设计人员可按照设计标准,选择创建一下两类Servlet:
(1)单线程Servlet
(2)多线程Servlet
多线程Servlet是Web服务器“容器”的“单个实例”,Web容器将所有客户请求转发给一个实例。规范也允许创建多个Servlet实例,以便为各个客户请求提供服务。此时的Servlet类需要实现SingleThreadModel接口。
Servlet容器厂商需要确保合理地加载和实例化Servlet。
第一种方法是在部署期间,在启动容器本身时,由Servlet引擎加载和实例化Servlet;
第二种方法是在第一个客户请求到达容器时,加载和实例化Servlet。
2)Servlet生命期
Web容器的Servlet组件的生命期可分为3个阶段:
(1)Servlet开始
Servlet会经历一个简单的生命历程。init()方法使Servlet进入“就绪”状态;之后,Servlet可接收服务请求;当容器决定销毁Servlet时,将调用destroy()方法。
在初始化过程中,init()方法使用ServletConfig对象。它包含Servlet需要的初始化参数的名-值对。通常,目录、文件路径及其它资源信息将写入这个对象。
未初始化的Servlet由容器卸载,不经历通常定义的Servlet生命期。
未初始化的Servlet不能接收客户端的任何请求,也不能对它运行destroy()方法。
(2)Servlet服务
Servlet容器可能通过Servlet的service()方法发送多个并发请求,故在设计service()方法时,需要考虑并发处理多个线程,还要注意灵活地“同步”全部或部分service()方法,尽量避免性能的大幅下降。
在Servlet生命期,服务线程的执行可能引发异常。
出现异常时,Servlet会变得临时不可用,或长期不可用。如长期不可用,则容器需要运行Servlet的destroy()方法,并释放资源。如果Servlet是临时不可用,容器将异常返回客户端,并显示消息,要求在一定时间后重试。
(3)Servlet结束
容器可在任意长的时间内使用一个Servlet实例,或SingleThreadModelServlet的多个实例。Servlet实例可一直延续到Servlet容器本身的生命期结束为止。
当容器认定不再需要某个Servlet时,可以调用Servlet的destroy()方法,释放Servlet占用的所有容器资源。
注意:容器不能调用活动的Servlet的destroy()方法,在调用Servlet的destroy()方法前,容器需要确保以下两点:
一是阻塞更多新请求;
二是完成所有待处理请求。