天天看点

J2EE与EJB——Java Web(二)1、什么是J2EE2、J2EE中常用的术语有哪些3、EJB有哪些不同的类别4、EJB与JavaBean有什么异同5、Web 服务器与Web应用服务器有什么区别6、SOAP与REST有什么区别7、数据库连接池的工作机制是怎样的8、J2EE 开发有哪些调优的方法

1、什么是J2EE

J2EE(Java2 Platform,Enterprise Edition)是Java平台企业版的简称,是用来开发与部署企业级应用的一个架构,它提供了一种统一的、开放标准的多层平台,该平台主要由构件、服务和通信3个模块构成。

构件包含客户端构件和服务器端构件两种类型,其中,客户端构件主要包含两类Applets和Application Clients,服务器端构件分为两类Web构件(Servlet与JSP)和EJBs(Enterprise Java Beans)两种。服务由J2EE平台提供商实现,分为Service API(开发时使用)和运行时服务。通信由容器提供的支持协作构件之间的通信。

从本质上来讲,J2EE只是一个行业标准,主要用来通过Java开发服务器端应用提供一个独立的、可移植的、多用户的企业级平台,从而能够简化应用程序的开发和部署。正是由于J2EE只是一个标准而不是一个成熟的产品,因此目前有很多不同类型的J2EE服务器。只要开发的应用程序符合J2EE的标准,就都可以部署在遵循了J2EE开发标准的J2EE服务器上。这种标准使得开发人员只需要专注于各种应用系统的商业逻辑与架构设计,而不用过多地考虑底层繁琐的程序编写工作,系统的开发与部署效率大幅提升。

J2EE与EJB——Java Web(二)1、什么是J2EE2、J2EE中常用的术语有哪些3、EJB有哪些不同的类别4、EJB与JavaBean有什么异同5、Web 服务器与Web应用服务器有什么区别6、SOAP与REST有什么区别7、数据库连接池的工作机制是怎样的8、J2EE 开发有哪些调优的方法

2、J2EE中常用的术语有哪些

J2EE中常用的术语有Web服务器、Web容器、EJB容器、Applet容器、Application Client容器、JNDI、JMS、JTA、JAF、RMI等。下面将分别对它们进行解释。

(1)Web服务器

Web服务器是指驻留在Internet上的计算机程序。它是一种服务程序,其主要工作是接收来自于客户端的请求,然后把对请求的处理结果返回给客户端。用户可以通过浏览器来请求所需资源,这些资源可以是HTML页面、图片、音频、视频或者PDF文档等,Web服务器接收到请求后会去查找用户请求的资源,然后把找到的资源返回给用户。需要注意的是,它是一个被动的程序,只有当收到来自客户端的请求后,才会发送响应。目前最流行的两大Web 服务器是:IIS(Internet Information Services)和Apache Htp Server(简称Apache)。

(2)Web容器

Web容器也被叫作Web应用服务器,它是一种服务程序,用来给运行在其中的程序(例如Servlet、JSP等)提供一个运行的环境。由于Web容器的存在,Servlet 只需要关注业务逻辑的处理而不用关注与客户端的交互,因为这些交互都已经由Web容器来协助完成了。常见的Web 容器有Tomcat、JBoss、WebLogic和WebSphere等。下面以Tomcat为例介绍一下Web容器主要完成了哪些工作:当Web服务器(例如Apache)接收到一个客户端对Servlet的请求后,不是直接把这些请求交给Servlet来处理,而是交给Web容器来处理,由Web容器负责给Servlet提供HTTP请求与响应对象,同时容器调用Servlet的doGet()或doPost()方法来处理用户的请求。

(3)EJB容器

EJB容器是一个服务器端容器。EJB(Enterprise JavaBean)是J2EE应用的业务层的技术标准,只要满足J2EE规范的组件就能在EJB容器中运行,这个组件就会被EJB容器高效地管理。同时,EJB容器还给运行在其中的组件提供了安全而优越的服务环境,例如事务管理、邮件服务等。

需要注意的是,EJB组件不能显式地使用EJB容器的API(Application Programming Interface,应用程序接口)来请求容器提供的中间件服务,但可以隐式地让EJB容器知道它们的需求,例如在基于XML的部署描述符中制定所需的配置信息,在Bean类中使用部署注释请求中间件服务。EJB容器为EJB组件隐式地提供中间件服务。

(4)Applet容器

Applet容器是一个客户端容器,包含的组件为Applet。Applet是一种嵌入在浏览器中的轻量级客户端,一般而言,只有当使用Web页面无法充分地表现数据或应用界面时,才会使用它。Applet是一种替代Web页面的手段,开发人员只能够使用J2SE开发Applet,出于安全性的考虑,Applet 无法使用J2EE的各种 Service和API。

(5)Application Client容器

Application Client容器是一个客户端容器,包含的组件为Application Client。相对Applet而言,Application Client是一种较重量级的客户端,它能够使用J2EE的大多数Service和API。

(6)JNDI JNDI全称为Java Naming and Directory Interface,译为Java命名和目录接口。

它提供了一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可使用名称来访问对象。

通过使用JNDI,一方面实现了快速查找和定位分布式应用程序的功能,另一方面使得程序有了更好的可扩展性。由于JNDI是独立于目录协议的,因此应用还可以使用JNDI访问各种特定的目录服务,例如轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)、网络数据服务(Network Data Service,NDS)和域名系统(Domain Name System,DNS)等。

(7)JMS JMS全称为Java Message Service,译为Java消息服务。

它是一个Java平台中面向消息中间件的API,主要实现各个应用程序之间进行异步通信,包括创建、发送、接收、读取消息等。通过使用JMS,能够最大限度地提升消息应用的可移植性。JMS既支持点对点的消息通信,也支持发布/订阅式的消息通信。

(8)JTA JTA全称为Java Transaction API,译为Java事务服务。

它提供各种分布式事务服务(在多个网络计算机上进行数据访问和更新),为J2EE实现分布式事务处理提供了重要的支撑。

(9)JAF JAF的全称为JavaBeans Activation Framework,译为JavaBeans 激活框架。

它是一个专用的数据处理框架,提供了一种统一处理不同数据格式的方法。

(10)RMI RMI全称为Remote Method Invocation,

译为远程方法调用,它主要用于远程调用服务,通过它,可以像调用本地函数一样调用另外一台计算机上运行的程序,而不需要关心远程计算机所使用的系统或所使用的语言,也就是说,只要满足一定的规范,就可以实现在不同的计算机上进行函数调用。

J2EE与EJB——Java Web(二)1、什么是J2EE2、J2EE中常用的术语有哪些3、EJB有哪些不同的类别4、EJB与JavaBean有什么异同5、Web 服务器与Web应用服务器有什么区别6、SOAP与REST有什么区别7、数据库连接池的工作机制是怎样的8、J2EE 开发有哪些调优的方法

3、EJB有哪些不同的类别

EJB是Enterprise JavaBean的简称,相当于分布式组件对象模型(Distributed Component Object Model,DCOM),它是一种服务器端组件体系结构,用于开发和部署多层的、分布式的以及面向对象的应用系统的跨平台体系结构。EJB简化了Java开发企业级的分布式组件应用程序的过程,它定义了一组可重用的组件——Enterprise Beans,开发人员可以利用这些组件,像搭积木一样建立各种分布式应用。所以,使用EJB可以写出可扩展的、健壮的、安全的应用程序,而不需要开发人员自己去编写复杂的分布式组件框架。依据特性的不同,EJB可以分为以下3种类型:Session Bean(会话Bean),Entity Bean(实体Bean)和Message Driven Bean(消息驱动Bean)。下面将分别对这3种Bean进行介绍。

(1)Session Bean

Session Bean用来实现服务器端的业务逻辑,同时协调Bean之间的交互。Session Bean仅存在于客户应用与服务器交互的时间段内,Session Bean中的数据是不保存在数据库中的。根据Session Bean 是否有状态又可以分为两种类型:Stateless Session Bean(无状态的Session Bean)和Stateful Session Bean(有状态的Session Bean)。

Stateless Session Bean 在方法调用期间不维护任何状态,所有事务处理都是在一个方法中处理完成,因此一个Stateless Session Bean可以被多个客户共享,即一个Stateless Session Bean可以同时处理多个客户应用的请求;而Stateful Session Bean则不同,它可以记录客户应用请求的状态,例如在线购物系统中,每个客户都拥有购物车(StatefulBean),而装载的货物和货物的数量在Session Bean中通过方法来操作,因此每个Stateful Session Bean只能处理一个客户的请求。与Stateless Session Bean相比,Stateful Session Bean的优点是能够记录客户应用的状态,其缺点是它不能被共享,开销较大,性能逊于Stateless Bean,因此当请求用户数量比较多时会消耗更多的内存。

(2)Entity Bean

Entity Bean 主要是资料组件,代表数据库中的记录,因此它与数据库中的数据有着相同的生存周期,也就是说,只要数据库中的数据存在,Entity bean 就一直存在。此外,Entity Bean还可以被多个客户应用共享。Entity有两种对数据持久化的处理方式:①CMP(Container Managed Persistence,容器管理的持续性)。构件的相关数据库操作由容器自动完成,不需要在bean 中编写数据库操作的代码。②BMP(Bean Managed Persistence,Bean管理的持续性)。构件的相关数据库操作由开发人员在代码中通过JDBC编程来实现。这两种Entity Bean的形态不同,但目的相同,二者的主要区别在于维护资料的角色,CMP是由EJBContainer来维护,而BMP则是由Bean自行维护资料的一致性。

Entity Bean一共有3种状态:no-state、pooled和ready。其中,no-state状态表示Bean实例还没有被创建;pooled状态表示Bean实例已经被创建,但还没有和一个EJBObject关联起来;ready 状态表示与EJB Object 关联起来,若断开关联,则回到pooled 状态。

(3)Message Driver Bean

Message Driver Bean用来处理异步消息,一般不是由用户来调用的。它的调用方式为:当有异步消息发送到某个Message Driver Bean后,容器会负责调用Message Driver Bean的OnMes-sage()方法来处理这个异步请求。

4、EJB与JavaBean有什么异同

EJB是基于Java的远程方法调用(Remote Method Invocation,RMI)技术,可以被远程访问(跨进程、跨计算机),但它必须被部署在Webspere、WebLogic等容器中。EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。

Java Bean是可复用的组件,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器(例如Tomcat)所创建的,因此Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,是不能被跨进程访问的。

EJB与JavaBean都是基于Java语言的构件模型。在开发应用时,既可以选择使用EJB模型,也可以选择使用JavaBean模型。尽管如此,二者也并非完全通用,其主要区别见表5-3。

J2EE与EJB——Java Web(二)1、什么是J2EE2、J2EE中常用的术语有哪些3、EJB有哪些不同的类别4、EJB与JavaBean有什么异同5、Web 服务器与Web应用服务器有什么区别6、SOAP与REST有什么区别7、数据库连接池的工作机制是怎样的8、J2EE 开发有哪些调优的方法

5、Web 服务器与Web应用服务器有什么区别

Web服务器是可以向发出请求的浏览器提供文档的程序。其主要功能是提供网上信息浏览服务;即接收浏览器的请求并把处理结果传回浏览器进行显示。Web服务器支持以HTTP的方式来访问,当Web服务器接收到一个HTTP请求时,它同样会以HTTP格式返回一个响应,这个响应可以是一个静态的HTML页面,也可以是结果处理的一个动态的页面,还可以是音频、视频等信息。为了处理一个请求,Web服务器可以做出一个响应,并进行页面跳转,或者把动态响应的产生委托给一些其他程序,例如CGI脚本、JSP、Servlet或者一些其他的服务器端程序。Web服务器一般都使用了一些特有的机制(例如容错机制)来保证Web服务器有较好的扩展性,并能提供不间断的服务。常见的Web服务器有IS和Apache。

应用服务器提供访问业务逻辑的途径以供客户端应用程序使用。具体而言,它通过HTTP、TCP/IP、IIOP(Internet Inter-ORB Protocol,互联网内部对象请求代理协议)或JRMP(Java Remote Method Protocol,Java远程方法协议)等协议来提供业务逻辑接口。为了系统的可靠性,同样使用了一些可扩展性和容错机制。除此之外,它还为应用的开发提供了许多服务,例如事务管理、安全管理、对象生命周期管理等。常见的应用服务器有BEAWebLogic Server,IBM WebSphere Application Server,IPlanet Application Server,Oracle9i Application Server,JBoss和Tomcat等。

Web服务器一般是通用的,而应用服务器一般是专用的,例如Tomcat只处理Java应用程序而不能处理ASPX或PHP。需要注意的是,Web服务器与应用服务器是并列关系,二者不存在相互包容关系。在使用时,如果访问的页面只有HTML,用Web服务器就足够了,但是如果是JSP,此时就需要应用服务器了,因为只有应用服务器才能解析JSP里的Java代码,并将解析结果以HTML的格式返回给用户。

6、SOAP与REST有什么区别

SOAP是一个严格定义的信息交换协议,用于在Web Service中把远程调用和返回封装成机器可读的格式化数据,SOAP数据使用XML数据格式,定义了一整套复杂的标签,来描述调用的远程过程、参数、返回值和出错信息等内容。

REST(Representational State Transfer,表述性状态转移)形式上为客户端通过申请资源来实现状态的转换,可以被看作一台虚拟的状态机。需要注意的是,它只是一种软件架构风格,而不是一个具体的协议或标准,而且,它是面向资源的,甚至连服务也会被抽象成资源。

表5-5为SOAP与REST的对比。

J2EE与EJB——Java Web(二)1、什么是J2EE2、J2EE中常用的术语有哪些3、EJB有哪些不同的类别4、EJB与JavaBean有什么异同5、Web 服务器与Web应用服务器有什么区别6、SOAP与REST有什么区别7、数据库连接池的工作机制是怎样的8、J2EE 开发有哪些调优的方法

7、数据库连接池的工作机制是怎样的

数据库连接是一种非常珍贵且有限的资源,尤其在多用户的网络应用环境中更是如此。对数据库连接管理的好坏会直接影响整个系统的性能:一是建立与数据库的连接是一个耗时的操作,在页面应用中,如果每次用户的请求都需要建立新的数据库连接,那么响应时间就会很长,会严重影响用户的体验;二是数据库的连接个数是有限制的,如果管理不好,用户经常建立与数据库的连接却忘记释放,运行时间久了,数据库的连接资源就会耗尽,当再有新的用户需要访问数据库时,就需要等待很长一段时间,直到有用户释放连接资源才能访问数据,这对系统的可用性有着严重的影响。因此,管理好数据库的连接资源对应用系统尤其是页面应用系统是非常重要的。

数据库连接池负责分配、管理并释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个新的数据库连接,同时,它还负责释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接遗漏。

在J2EE中,服务器在启动时会创建一定数量的池连接,并一直维持不少于此数目的连接池。当客户程序需要访问数据库时,就可以直接从池中获取与数据库的连接(获取一个空闲的连接),而不用去创建一个新的连接,同时将该连接标记为忙状态。当使用完毕后再把该连接标记为空闲状态,这样其他用户就可以使用这个连接了。如果当前没有空闲的连接,那么服务器就会根据配置参数在池中创建一定数量的连接。采用这种方法对数据库连接进行管理后可以大幅缩短用户的响应时间,提高运行效率。另一方面,为了提高数据库操作的性能,数据库连接池会释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

8、J2EE 开发有哪些调优的方法

当使用J2EE开发Web应用程序时,若只是考虑功能实现,一般都不存在什么问题,但由于Web应用的分布式特性,在很多特定的场合下,并发数据量会变得非常大,如何能够保证此时系统还能够高效地运转,而且能够快速地响应用户的请求呢?

下面介绍一些常用的方法。

1)优化设计,例如,小心使用继承。

继承会导致递归,同时由于父类的构造器将会被遍历,继承嵌套得过深,会产生巨大的创建开销,因此推荐尽量使用组合方式来代替继承方式。除此之外,还有很多其他的方法:封装和重用常用的业务方法以及相关工具,避免在其他类中重复编写;简化类结构;面向接口编程;尽量使用主要类型;避免对象的过度使用,例如,不要为了使用一个方法就创建对象,应尽可能地使用静态方法或是使用将业务组件实例化后共享的方法等。

2)尽可能使用数据库连接池。

建立数据库的连接是一项必须但又非常耗时的工作,如果频繁地建立与数据库的连接将会导致系统性能的急剧下降。因此,在实际开发系统时,经常使用数据库连接池来提高系统性能。具体而言,就是使应用服务器维护着数据库连接池,这样就不需要在每个事务处理开始时就创建一个连接了。此外,由于PreparedStatement有缓存功能,这使其具有较高的效率,因此,在使用JDBC的方式访问数据库时,应尽可能使用PreparedStatement。

3)给Web容器配置合理的线程数量来处理客户端的HTTP请求。

一般而言,最小的线程数量设置为容器处理请求的平均数(平均负载),最大值设置为系统在高峰期处理的请求数,同时Web容器中线程的个数最好不要多于Web服务器中线程的个数。

4)根据实际情况设置Java虚拟机中堆空间的大小。

合理地设置堆空间的大小能够使得垃圾回收器运行的时间间隔被控制在一个合理的范围内,从而减少许多不必要的系统开销。具体设置堆空间大小的方法可参考专用资料。

5)使用框架(例如Hibernate)来提高系统的效率。

6)把一些经常被访问的Servlet或JSP缓存起来,能够减少响应时间和提高系统的性能。

但需要注意的是,缓存并非越多越好,无规则地使用缓存也可能会导致系统的崩溃。

7)当在系统中使用EJB时,由于对EJB的调用是采用对象请求代理(Object Request Bro-ker,ORB)的方式来完成,而ORB使用了线程来处理对EJB的请求,因此,应当合理配置线程池的大小以便它能够在平均负载和高峰期都能够很好地处理EJB的请求。

8)优化IV0性能。

IVO使用不当将会造成资源竞争,降低系统性能。所以,在实际应用时,尽可能少使用System.out打印调试信息,推荐使用缓冲。

9)优化查询。

在模型设计时就应考虑冗余相对不会变化的数据,如果设计大数据量,最好能够考虑分区设计。

10)对sesion进行合理管理与设置。

根据实际情况对内存中可能存在的session的个数设置一个合适的值。注意:尽量减少session的大小,以降低其对内存的使用。而且,除非是在必须的情况下,否则尽量不要启用对session的持久化。同时,通过对session设置一个合理的超时时间来回收较长时间不使用的session,也可以有效地提高系统的效率。