认识J2EE, 解析J2EE中servlet标准, 理解web容器,java容器

也许你会纠结J2SEJ2EE的区别,或者说“什么是J2EE?”。本文从另一个角度来说明一下J2EE是什么。并且阐述一下J2EE的其中一类标准ServletJ2EE框架中的位置和实质。随便会说明一下像tomcat这样的web服务器与J2EE有什么关系,最后说一下java容器的一般概念。我的说法不一定标准,但是对整个J2EE的理解会有一定的帮助(自己认为的)。

 

J2EE另一个角度的认识

标准的说法是J2SE是用于开发桌面程序的框架和标准。其实你可以理解成这个样的。

J2SE=JAVA2+开发桌面程序标准

J2EE=JAVA2+开发企业级软件的标准。

JAVA2是有关Java语言的一种版本标准。我们之前提到过,编程语言到软件系统的距离在于,变成语言作为各种其它外设系统的黏合剂。而这种黏合剂与外设系统的接口就是我们通常说说的硬件驱动、库。(编程语言实现一些逻辑,通过驱动、库来管理外设系统,形成一个有机的整体。直白的意思就是编程语言在遵守本身语言标准的基础上,通过操作驱动、库来管理外设。将键盘、显示器、数据库、传感器等外设联合起来形成一个可工作得系统。)

那么,J2SEJ2EE区别就在于JAVA2标准之后的一系列的系统开发标准了。

何谓标准,标准是为了交流而产生的,由了标准我们你写的程序我能看懂,能使用,大家可以互相交流提高软件领域的开发效率。

网络领域中的一类标准叫着网络协议,而网络协议面向编程者的最终实现是驱动、是软件库。类似的标准在图型库、数据库等等领域中得到了相同的推理。

所以,不管是J2SE还是J2EE,他们都为了在Java这个编程语言中,为了合理利用软件开发的公用复用的原则,而订制的一系列的标准,而通常这些标准又会以一系列的软件库的形式存在(同一个标准可以有多个实现)。所以你进一步又可以这么理解。J2SEJ2EE就是分别为java领域的桌面程序和企业软件开发提供的一系列的软件库,供大家使用。这里的软件库,有框架的,也有驱动库等等。所以从本质上讲,J2SEJ2EE之间是没有本质区别的,它们的区别可能只是在于,由于面向开发的软件目标的复杂度不同的,所涉及的领域不同,而给出的一系列的库。

说到这里,我们再申明软件领域的一个我认为的意思,“语言,相对于该语言周边的各种库来说,几乎是微不足道的”。语言的只是一种思维表达的规则而已,它本身的所蕴藏的智慧是非常有限的,库(软件)是由一代又一代人的计算机人结合各种学科的智慧、逻辑、经验所不断锻造出来的。

从复杂度来说,J2EE是远远高于J2SE的,甚至你直接理解为,J2EEJ2SE的一个超集J2SE只是,基本的Java标准加上简单的常用库而已。

那么J2EE,在Java2的基础上,到底加入了多少标准、框架、库呢?官方的资料显示。以Java2为基础,围绕开发企业级软件系统的目标,J2EE提出了13种标准技术,用于支撑简化这种开发。

从前面我们对编程语言、软件开发以及语言库之间的关系,我们理解。即使一个公司完全不按照J2EE所规定的那些标准(以及标准的实现库)来开发。也是可以形成一个优秀的企业级软件的。但是这种概念下的开发代价是非常高的。并且,当你耗费巨额的代价开发出一套系统之后,你们开发这一套系统过程的一些经验、成果是很难被其它人利用起来的,甚至你自己也很难利用起来。软件领域想要向前发展就必须相互合作,这种合作体现在对软件开发经验、成果的共享,而这种共享往往就是以形成一系列的标准为标志的,事实上,现在流行的各种编程语言也是在这种模式下诞生的。

J2EE13关键技术(标准)

我们来看看J2EE13种关键技术。

J2EE平台由一整套服务Services)、应用程序接口APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持,下面对J2EE中的13种技术规范进行简单的描述(限于篇幅,这里只能进行简单的描述):

JDBC(Java Database Connectivity)

  JDBC API为访问不同的数据库提供了一种统一的途径,象ODBC一样,JDBC对开发者屏蔽了一些细节问题,另外,JDBC对数据库的访问也具有平台无关性。

JNDI(Java Name and Directory Interface)

  JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNSLDAP,本地文件系统,或应用服务器中的对象。

EJB( Enterprise JavaBean)

  J2EE技术之所以赢得媒体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑,由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性,使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。

RMI(Remote Method Invoke)

  正如其名字所表示的那样,RMI协议调用远程对象上的方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。

Java IDL/CORBA

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

JSP(Java Server Pages)

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

Java Servlet

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

XML(Extensible Markup Language)

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

JMS(Java Message Service)

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

JTA(Java Transaction Architecture)

  JTA定义了一种标准的API,应用系统由此可以访问各种事务监控。

JTS(Java Transaction Service):

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

JavaMail

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

JAF(JavaBeans Activation Framework)

JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者转换自Java对象。大多数应用都可以不需要直接使用JAF

Servlet技术的理解

可以看到,这13种技术中,有我们非常熟悉的数据库访问库(告诉你访问数据库,就用这个库),有用来控制事务的框架等等。13种技术包含开发一个高效、稳定、有用的企业级软件系统 提供了支持。当你遵守这些标准技术开发,你会发现,你的这个系统会得到很多人的支持(因为他们也是支持这个标准的),例如JDBC,你也可以不用这个,用一个你自己写的数据库访问接口,但是有可能当你需要换一个数据库的时候,你会发现你没有办法让你的程序访问数据库。

再如jspservlet,这是J2EE对网站开发的最直接支持。事实上,我们知道,jsp就是servlet,只是用jsp写网页给为直观、方便。而servlet又是java程序。所以jsp并不是一种全新的技术,而是一种依附与java的专门为开发网页程序扩展

并且我们进一步发现,要想实现网站访问,在J2EE要让web服务器jspservlet等这样的扩展进行支持。也就是说,servlet这种技术虽然会有一些java库作为体现。但是更重要的是像tomcat等的web容器需要对他们进行支持。这也就是遵守j2ee标准开发的重要性的一个体现。试想,如果你不遵守jsp或者servlet开发网页程序。原理上是可以的。你完全不用继承servlet有关基类进行编写一些相应网络http请求的类。你完全可以自己写这样的类,要你遵守相关的网络协议就可以。

事实上,你只需要适用java程序开辟socket服务端口,接收请求,解析http请求,做相应的解析、相应,然后组装http reponse协议报,通过socket返回,这就可以实现一个网页应用。接着随着网络应用变得越来越复杂。你需要维护页面方面之间的联系(通过session或者cookies),你想做一些Filter等等。这些你都需要通过java自行编写。

那么servlet标准提供给我们什么了。它提供给我们一个统一接收和解析http协议的库。我们只需要在编写有关网页应用的时候,继承该库就可以了。那些通用的事情有这些库来完成,我们只需要加入一些于业务逻辑相关的东西,而不需要理会太多有关网络传输、包解析等等事情,并且servlet还集成了一系列的web开发经验(像FilterListener等等),你不需要自己实现,就可以加入这些功能。

Web容器( tomcat) 扮演什么角色

理论上讲,servlet标准的实现只需要像web应用程序提供相应的库就可以了。那些功能都集成到库里面。那么就不需要像tomcat这样的web容器的存在了。事实上,web应用程序中web容器tomcat)并不是必须的。她的所有功能都可以集成到java程序本身上去。但是加入web容器的概念,我认为最大的优点就是集中完成那些复杂的web应用的支撑功能。由于支撑功能一般是一致的,所以有了web容器,就可以只在软件中开发业务相关的东西,减少软件的代码量。试想如果将所有的web相关的支持功能都以库的形式实现在软件中,程序该是如何的庞大。

那么,从这个角度上讲,从servlet标准实现的角度讲,这个标准一方面规定了web程序员在开发web应用程序的时候继承、实现给定的类或接口;另一方面它规定了各种web容器的实现。只有两方面都遵守同一个标准。当两者结合起来的时候(程序发布到容器中)才能很好的结合web程序业务逻辑和web程序支撑功能。

这就是J2EEservletjsp给我们带来的影响。它不仅是提供了一些库给我们用,还规定了web容器厂商的容器实现。就像JDBC标准一样,不仅提供了库给我用,用于访问数据库,同时也规定了数据库厂商的实现行为。

通过上面的例子,我们发现。要想开发一个复杂的软件系统,遵守标准是指关重要的。而标准的制定与发展是软件领域进步的一个重大标志。

java容器,或者是web容器,java服务器。

按照前面的例子我们对web服务器/web容器有了一定的认识。似乎他们就是为实现web应用,而从一般的web软件中抽出来的有关网络传输等通用功能的东西

容器,我们可以理解成用于执行某个东西的环境。你办软件部署在我这里面,我为你提供一个执行的相关环境。事实上,java程序的最基本的容器就是jreJava执行环境。但是jre太基础了,它几乎就是用户支持java者们预言本身的容器(就是说java程序只有在我的环境下才能运行),加上一些基本的库。就没有其它东西了。当然理论上讲,如果我们的软件将所有的功能都自己干(像前面讨论的servlet将所有的功能,包括基本的网络传输通信的功能都自己干),那么有jre也就够了。但是我们就不是怎么做的。例如tomcat,我们就是将一些有关web应用的通用功能继承到这里。那么按照标准开发出来的web应用程序,只要在我的环境里就可以得到正确的执行。有关web容器,就是在jre容器的基础上加了对应用程序的支持。但是原理上,他们是没有本质的区别的。Web服务器通常是指web容器上面装上了相应的web应用软件

那么可以合理推论java容器就是一个更为广阔的概念,相对web容器,他可能是为了支持其它的应用得一种容器

这也就是glassfish号称比tomcat的优势。“我不只是web容器,除了作为web容器以外,我还是一个java容器,我可以支持除web应用的其它应用。”

所以,java面,容器的概念其实没有那么晦涩。他就是用于来跑java的环境。最基本的程序只需要jre这个环境就可以了,有关web应用只需要comcat这样的容器就可以了。Java有关容器概念这么重要,主要是它是一个有虚拟机的语言。而C/C++这样的语言,使直接编译成机器指令的。所以有关容器的概念在这种语言中是不流行的。

再一次的提醒,容器不是必要的。但是容器却是非常值得推广和重视的。容器的一个核心思想是“将通用的功能东西一次实现”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值