Java学习2—理解J2EE

在学习Java的过程中,我相信最困难的莫过于专业名词一大堆,什么组件、容器、Bean之类的,看到都晕了。呵呵,这也难怪,当我们在查找资料的时候,这些专业名词,确实有点令人迷惑,但Java的精华所在也是在这些专业名词里了。而这些专业名词几乎都是来自J2EE这个平台,也是现在大多数Java学习者选择的一个方向,也是当今社会需求量最大的一个地方。

接下来,还是带着问题的态度来学习J2EE。


J2EE到底是什么?


通过"Java学习1"就可以大概的知道,Java 2平台有3个版本,它们是适用于小型设备和智能卡的Java 2平台Micro版(Java 2 Platform Micro Edition,J2ME)、适用于桌面系统的Java 2平台标准版(Java 2 Platform Standard Edition,J2SE)、适用于创建服务器应用程序和服务的Java 2平台企业版(Java 2 Platform Enterprise Edition,J2EE),而J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。就是大家平时所听到的一些XXX管理系统等。说到底,J2EE技术的基础就是核心Java平台或Java 2平台的标准版,也就是Java基础。只不过为了解决企业级的业务问题而专门封装了许多解决业务的代码集合和规范。

Java除了有J2EE这个专门为企业系统所设计的一个平台外,它还能做许多的事情,如另外两个平台J2SE和J2ME所需要解决的问题,还有当今流行的互联网系统。说到底,Java只是一个解决问题的工具,能解决同样问题的工具还有许多。换句话说,没有最好,只有最合适;没有做不到的,只有想不到的。


J2EE解决的是什么问题?


J2EE使用多层的分布式应用模型,应用逻辑按功能划分为组件,各个应用组件根据他们所在的层分布在不同的机器上。事实上,sun设计J2EE的初衷正是为了解决两层模式(client/server)的弊端,在传统模式中,客户端担当了过多的角色而显得臃肿,在这种模式中,第一次部署的时候比较容易,但难于升级或改进,可伸展性也不理想,而且经常基于某种专有的协议通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层。


什么是分布式系统?


分布式系统就是将系统的应用层,数据层或其它部分构架成分布(物理和逻辑上的都可以)状(通常是网状)。分布式系统通常是为了增强系统的可扩展性、稳定性和执行效率。比如我们平时所开发的XXX管理系统,页面层、业务层和持久层都是不同的组件,而这些组件同样能分开部署不同的服务器,这也是一种分布式系统。只不过系统规模还达不到我们要有专属的服务器去部署这些组件从而用不上这种分部署结构。所以说分布式系统更准确地说是一种系统构架概念,不是一种技术。


什么是组件?


组件是抽象的概念而已,通俗的说是一些符合某种规范的类组合在一起就构成了组件。他可以提供某些特定的功能。拿J2EE来说,有什么servlet,jsp, javabean,ejb都是组件。但实际他们都是类,只不过有他们特殊的规定。举个例子,那个JavaBean来说:JavaBean也就是个类,但你的类想成为JavaBean你必须,给你的类里的变量 (如xxx),添两个函数,getXxx()和setXxx()并且类里要有无参的构造函数。有了这些就是JavaBean了。但要问为什么要有这些规定呢,目前只能说 组件之间要想相互使用必须得有一种规范来约束。


那J2EE有那些组件呢?

 

J2EE架构模型有经典的四层:

1、运行在客户端机器上的客户层组件(客户层)
2、运行在J2EE服务器上的Web层组件(页面层)
3、运行在J2EE服务器上的业务逻辑层组件(业务逻辑层)
4、运行在EIS服务器上的企业信息系统(Enterprise information system)层软件(持久层)

◆客户层组件可以基于WEB也可以基于传统方式(客户端)

◆web层组件可以是JSP 页面或Servlets。按照J2EE规范,静态的HTML页面和Applets不算是web层组件。web层还可以包含一些JavaBean对象来处理用户的输入,并把输入发送给运在业务层上的enterprise bean来进行处理,像现在流行的一些MVC框架(如Struts)。

◆业务层组就是我们经常说到的EJB(Enterprise Java Bean)。

◆企业信息系统层处理企业信息系统软件包括企业基础建设系统例如企业资源计划 (ERP),大型机事务处理,数据库系统,和其它的遗留信息系统。例如,J2EE 应用组件可能为了数据库连接需要访问企业信息系统。说白了就是数据库服务器或者对接的外围系统。

 

什么是EJB?

 

EJB也是一个类,是用来处理一些企业级的业务。例如银行的转账业务:A出B进,而且这两个业务必须绑定在同一个事务处理。以前C/S架构的弊端就是客户端担当了过多的角色而显得臃肿,而EJB就是以前放在客户端处理业务的类,只不过现在只是拿出来,放在我们的业务层里而已。变成大白话就是,"把你编写的软件中那些需要执行制定的任务的类,不放到客户端软件上了,而是给他打成包放到一个服务器上了"。

EJB依照特性的不同,目前区分为三种,分别是 Session Bean,Entity Bean,以及Message Driven Bean 。而Session Bean又细分为无状态Session Bean(Stateless Session Bean)和有状态Session Bean(Stateful Session Bean)。

 

什么是Stateless Session Bean?

 

它并不知道客户或者请求的上下文,从而成为单一 请求/响应 应用的理想工具。客户端应用程序访问一个 Stateless Session Bean 并给其传递参数,处理结束后给客户端程序传回结果。通讯完成后,Bean不保留交互信息。因此,多个客户可以同时访问 Stateless Session Bean 去不回相互影响。说白了,Stateless Session Bean就是普通的处理业务的类。

 

什么是Stateful Session Bean?

 

它会把请求同特定的客户关联起来,在客户端和Bean之间建立一一对应关系。购物车Bean 就是一个特殊的实例。又好比web层的Session,登录一次就记录了用户的状态,这就是有状态的类。

 

什么是Entity Bean?

 

说白了,就是我们平时项目的实体,是应用数据的载体。

 

什么是Message Driven Bean?

 

Message Driven Bean从字面上的意思就是消息驱动类,跟会话类、实体类所实现业务的最大区别就是后两者是同步的,就是使用者必须调用它们的某个方法并且必须等待这个方法有返回才能继续其他的操作。而Message Driven Bean主要业务作用于队列消息的驱动(异步的)。例如,发布者有新消息放到队列,它不需要等到订阅者收到这消息才能离开,它放到队列就可以去操作其他事情了,具体向订阅者的通知是有专人干的,那就是Message Driven Bean,当发布者发布消息时就触发了Message Driven Bean,Message Driven Bean就开始去通知订阅者。

说白了,这些什么Bean都是Java类,只不过给他们的专属职能起个名字摆了,就像送快件的人叫快递员,像我们编程的人叫程序员。

EJB是运行在独立服务器上的组件,客户端是通过网络对EJB对象进行调用的。在Java中,能够实现远程对象调用的技术是RMI,而EJB技术基础正是RMI。通过RMI技术,J2EE将EJB组件创建为远程对象,客户端就可以通过网络调用EJB 对象了。

 

什么是RMI?

 

在说RMI之前,需要理解两个名词:对象的序列化、分布式计算与RPC。

对象的序列化

对象的序列化概念:对象的序列化过程就是将对象状态转换成字节流和从字节流恢复对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,或者通过网络连接将对象数据发送到另一个主机。

分布式计算与RPC

RPC并不是一个纯粹的Java概念,因为在Java诞生之前就已经有了RPC的这个概念,RPC是"Remote Procedure Call"的缩写,也就是"远程过程调用"。在Java之前的大多数编程语言,如Fortran、C、COBOL 等等,都是过程性的语言,而不是面向对象的。所以,这些编程语言很自然地用过程表示工作,如,函数或子程序,让其在网络上另一台机器上执行。说白了,就是本地计算机调用远程计算机上的一个函数。

二者结合就是RMI

RMI英文全称是"Remote Method Invocation",它的中文名称是"远程方法调用",它就是利用Java 对象序列化的机制实现分布式计算,实现远程类对象的实例化以及调用的方法。说的更清楚些,就是利用对象序列化来实现远程调用,也就是上面两个概念的结合体,利用这个方法来调用远程的类的时候,就不需要编写Socket程序了,也不需要把对象进行序列化操作,直接调用就行了非常方便。换个说法,RMI好像是Socket实现与对象序列化实现的封装。具体使用可以参考这里:http://6221123.blog.51cto.com/6211123/1112619

RMI优点

这种机制给分布计算的系统设计、编程都带来了极大的方便。只要按照RMI 规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP 和Socket 等等。任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java哈希表这样的复杂类型作为一个参数进行传递。

RMI缺点

如果是较为简单的方法调用,其执行效率也许会比本地执行慢很多,即使和远程Socket机制的简单数据返回的应用相比,也会慢一些,原因是,其在网络间需要传递的信息不仅仅包含该函数的返回值信息,还会包含该对象序列化后的字节内容。

 

说了那么多关于EJB的知识,那我们平时项目有用到吗?

 

J2EE不是必须使用EJB,像我们平时开发的系统,同样是以组件的概念开发的,如页面层、逻辑层、持久层,但几乎没有用到真正的EJB技术。如下情况尽量就不要使用EJB 了:

1、较为简单的纯Web应用开发,不需要用EJB。

2、需要与其他服务程序配合使用的应用,但调用或返回的自定义的网络协议(如webservice、http等)可以解决的应用程序,不需要使用EJB。

3、较多人并发访问的C/S 结构的应用程序,尽量不要使用EJB。


J2EE组件是如何在服务器上运行的?难道就靠JVM吗?


这种基于组件,具有平台无关性的J2EE结构使得J2EE程序的编写十分简单,因为业务逻辑被封装成可复用的组件,并且J2EE服务器以容器的形式为所有的组件类型提供后台服务. 因为你不用自己开发这种服务, 所以你可以集中精力解决手头的业务问题。

换个说法吧,例如我们要开发一个web项目,从头到尾所有程序所有实现都是自己动手的,从如何接收用户的请求、如何明确用户请求的业务、如何调用用户请求的方法、如何响应客户的请求到最后以什么样的形式展现给客户。如果整个项目给做下来,我想,花儿都化泥了。

通过以上这个说法,我想比较清楚为什么会有web容器、EJB容器、API的出现了吧。

J2EE宗旨就是简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。为此它提供了一系列的组件与规范。所以这些容器都是J2EE在其规范下的产物,J2EE应用组件可以安装部署到以下几种容器中去:

◆EJB容器管理所有J2EE应用程序中企业级bean的执行。enterprise bean和它们的容器运行在J2EE服务器上。主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。如BEA weblogic、IBM websphere,这两个中间件都集成了WEB容器和EJB容器,是商用软件,自然价格不菲。

在实际开发中,真正采用EJB的可能不多,由于EJB的执行相对其他方法效率可能有点低,所以现在学习的主要是学习它思想比较多。

◆Web容器管理所有J2EE应用程序中JSP页面和Servlet组件的执行。Web组件和它们的容器运行在J2EE 服务器上。如Tomcat。它提供了web层组件的执行环境,从而让我们不必太过关注组件与相关网络对接的细节。

◆应用程序客户端容器管理所有J2EE应用程序中应用程序客户端组件的执行。应用程序客户端和它们的容器运行在J2EE服务器上.

◆Applet容器是运行在客户端机器上的web浏览器和Java插件的结合.


最后,列出一些相关J2EE专业名词的解释及用途:


1、JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDCB对数据库的访问也具有平台无关性。相信大家都比较熟悉了。

2、JNDI(Java Name and Directory Interface): JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统,或应用服务器中的对象。因为JNDI是J2EE的一种规范,所以所有容器都实现了JNDI。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。 平时我们所用的lookup("XXXXXXX")也算是JNDI的一种应用,还有上面所说的RMI也用到JNDI。说白了,JNDI就像一张KEY/VALUE表一样的概念,需要或者VALUE就要通过KEY来获取。

3、Java IDL/CORBA: 在Java IDL的支持下,开发人员可以将Java和CORBA集成在一起。他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和旧的系统相集成。

4、JSP(Java Server Pages): JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。

5、Java Servlet: Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,当被请求时开始执行,这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。

6、XML(Extensible Markup Language): XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的,但是,它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合,您可以得到一个完美的具有平台独立性的解决方案。

7、JMS(Java Message Service): MS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域,有支持发布/订阅(publish/subscribe)类型的域,并且提供对下列类型的支持:经认可的消息传递,事务型消息的传递,一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。

8、JTA(Java Transaction Architecture): JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。

9、JTS(Java Transaction Service): JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范,并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。

10、JavaMail: JavaMail是用于存取邮件服务器的API,它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值