因为java技术的开放性,因为JCP所给予开发人员的诸多选择性,作为java的研发/爱好者,在进行项目开发的时候,必然会面对java世界中的诸多框架,struts,spring,hibernate/ibatis或者servlet,ejb等等--诸多开源的或者JCP组织所制定的标准框架,面对如此至多的框架,开发者该做何选择呢?
众所周知,在java EE5规范正式发布之前,很多开源framework都非常出名,为人们喜爱并广泛使用,如Struts、Spring、Hibernate等,这些开放源代码的作品曾经一定程度上成为Java企业级应用开发事实上的标准。然而2006年5月,随着Java EE 5规范的正式发布,随着众多厂商对java EE5规范的众多产品或者技术的支持的推出,开源与标准之间的竞争不可避免的......
Java EE 5的出现,可能是J2EE诞生以来比较重量级的一次震撼,规范发布至今已有半年之多,业界对Java EE 5的关注也变得越来越热烈,google一下“java ee”关键字,可以得到500多万条相关纪录,而从Sun网站上进行检索(http://java.sun.com/javaee/overview/compatibility.jsp),也可以看到专业厂商已经迅速跟进,除Sun公司本身外,包括全球闻名的SAP、金蝶Apusic等另三家,已经推出全面支持Java EE 5规范的应用服务器产品。
Java EE 5包含JSF 1.2、EJB 3.0及JAX-WS 2.0等新功能,试图解决Java企业级应用开发的简便性、灵活性及易用性问题。在Java EE 5出现之前,很多开源框架(Open Source Framework)如雨后春笋般涌现,尝试从某种角度或某些方面去解决“委员会”规范所未能顾及的应用开发问题,如Web开发中的关注分离问题(MVC)、业务模型实现问题(ORM)等等。很多开源framework都非常出名,为人们喜爱并广泛使用,如Struts、Spring、Hibernate等,这些“江湖派”作品曾经一定程度上成为Java企业级应用开发事实上的标准。Java EE 5的出现,是否会改变这种状况?或者说,人们在重新选择应用框架时,是否会优先考虑全新的Java EE 5技术?带着这种疑问,笔者试图进行简单的技术比较,并辅于肤浅的评论,希望能够抛砖引玉、借花献佛,以娱大众。
Struts vs. JSF
|
Struts
|
JSF
|
MVC
|
支持
|
支持
|
POJO
|
|
支持
|
页面流(Page Flow)
|
支持
|
支持
|
UI组件(UI Component)
|
|
支持
|
MVC是模型(Model)、视图(View)、控制(Controller)分层的结构,通过分层来实现关注分离,减少传统开发中常见并重复的工作。Struts和JSF均支持MVC。Struts对MVC支持的核心是Controller,通过Controller(一个共同的入口Servlet)获得HTTP请求,将HTTP参数传入ActionForm,然后将ActionForm传给Action类。Struts对HTTP请求只有一个事件处理handler,当请求过来时,由相应Action返回结果给前端Controller,并据此选择如何进行导航。JSF一般也采用一个前端Controller(有些商用JSF能够智能识别JSF请求,无需额外的controller),不过在Controller中做的工作跟Struts Controller截然不同,它负责触发JSF页面组件中的事件,用Render工具生成组件的展现,绑定来自Model的数据到组件等。可以看到,JSF在在控制层更灵活,在视图层支持Render工具的变换而生成灵活的展现,在模型层实现与框架的彻底分离,因而具有更高的灵活性。
POJO是无格式Java对象(Plain Old Java Object)。POJO与AOP结合被广泛用于快速业务模型。Struts设计的初衷主要是解决视图和控制问题,并无过多关注模型的灵活性问题。Struts中的ActionForm模型必须继承自框架类,虽然可以通过定制类库提供一些帮助类实现模型与框架无关,但本质上还是紧耦合于JSP- and HTTP-centric方法。JSF提供了对POJO天然的良好支持,并支持通过RAD工具实现快速的业务模型生成,从而具有更高的生产力。
页面导航的最大意义是帮助实现页面的可视化开发,在UI界面上快速定义页面流向。页面导航分静态导航和动态导航两种,静态导航是页面直接流向另一页面,动态导航是由特定动作或逻辑决定页面的流向。Struts和JSF均支持静态和动态页面导航。不过Struts中的导航规则是绑定到Action中的,那意味着可能需要对同一页面中不同的Action做重复性的导航规则制定,而JSF导航可以跟Action无关,可以在页面中不同组件的不同Action间共享相同的导航规则。
Struts本身并不提供UI组件机制,而JSF则提供了完整的UI组件机制。通过UI组件的定制和重用,能够极大地简化开发,提升用户体验。商业化的产品则往往更进一步,提供强大易用的开发工具,实现drag-and-drop方式所见即所得的Web UI开发。
Spring vs. EJB 3.0
|
Spring
|
EJB3
|
标准(Standard)
|
|
是,Java EE 5标准组成部分
|
持久(Persistence)
|
JDBC, Hibernate, JDO, iBatis and JPA(ongoing spring 2.0)
|
JPA
|
声明式服务(Declarative Services)
|
支持
|
支持
|
依赖注入(Dependency Injection)
|
支持
|
支持
|
集群(Cluster)
|
|
支持
|
Spring框架是一个开源项目,并不是一个标准的东西。Spring自己定义了一套XML配置文件大纲以及程序接口,从长远考虑,有很大的不确定性。Spring的主要开发者来自Interface21公司(这是帮我非常敬重的人),Interface21靠相关咨询和服务维持,作为一个商业团体其利益取向将可以完全左右Spring未来的方向。相比EJB 3出身名门正派的标准血统并有众多主流商业厂商支持,Spring的非标准性将可能带来极大的风险。
Spring框架本身不带持久实现,但它支持JDBC, Hibernate, JDO和 iBatis等持久化框架。Spring通过使用不同的DAO和Helper类以利用JDBC、Hibernate、iBatis或JDO,所以并没有实现和最终服务提供者的隔离。简单来说,就是需要重构代码才能实现持久化框架的更换。EJB 3.0的持久集成在应用服务中,通过JPA,可以在底层更换持久实现,如将Hibernate更换为Toplink。EJB 3.0的持久具有更大的灵活性,并有利于厂商进行性能优化和扩展。
Spring和EJB3.0都为企业应用提供运行时服务,(如:事务、安全、日志消息、配置服务)。由于这些服务都不是直接与应用的业务逻辑相关联,所以都不是由应用来自行管理。EJB3.0使用Java注释来配置声明式服务,Spring使用XML配置文件。在大多数情况下,EJB3.0的注释声明显得更为简单和优雅。Spring使用XML来定义属性并配置声明式服务的结果将是一个冗长而不稳定的配置文件。
依赖注入模式(DI)是在应用中实现松散耦合的最佳实践。Spring和EJB3.0都支持DI模式,但他们有着深刻的不同。Spring支持通用的(但复杂的)基于XML配置文件的依赖注入API。EJB3.0支持注入大多数服务对象(如EJB和上下文对象)和通过简单注释声明的JNDI对象。
EJB 3.0完全支持集群。部署在服务集群中的EJB3.0应用将自动获得负载均衡、分布缓存、状态复制等功能。底层的集群服务隐藏在EJB3.0编程接口后面,屏蔽了所有的复杂性。Spring没有简单的利用集群的方法。
Hibernate vs. EJB 3.0
Hibernate与EJB 3.0其实并没有很好的可比性,因Hibernate仅关注ORM,而EJB 3.0更多则更多表现为一种组件框架,其中包含ORM部分而已。EJB 3.0在设计过程中,曾经得益于Hibernate的作者Gavin King,据说EJB 3.0 EntityBean的设计理念完全来自于Hibernate。只需用将EJB 3.0 EntityBean API调用转换为Hibernate API,Hibernate就可以成为EJB 3.0中EntityBean的Implementation。
当开源framework已经成为习惯性势力,并给人们带来众多乐趣或疲惫感的时候,Java EE 5的出现会是适逢其时吗?无论如何,是继续选择开源还是拥抱Java EE 5?相信今天这并不是个容易的选择,或许,随着更多的厂商发布支持Java EE 5的产品,提供更好的工具支持,这个答案才会明朗起来。
分享到:
相关推荐
**PHP与Java之争**: - PHP更适合快速开发低成本、周期短的中小型项目,尤其是前端应用、博客和论坛。 - Java则更适用于大型、关键性的企业级应用,具备优秀的安全性和可维护性。 总结: PHP与Java各有优劣,PHP在...
同时,JAVA作为一种开放的技术,其标准规范由JCP组织共同制定,确保了JAVA开发人员不会因为某个公司的变动而失去投资价值。这两种开放技术的结合为开发者提供了广阔的发展空间。 ### 2. 下载安装RPM格式的JDK ####...
一、有些事情难以回头 开篇我先表明自己的立场:同时使用 .Net 和 JAVA,但更加偏爱.Net。原因很简单: ...这里为 .Net 说声不平,.Net开源程度更好,架构体系更成熟逻辑更严谨,开发效率更高,服务器同
在那些热闹非凡的程序员圈子和论坛社区里,围绕着.NET开源的消息,码农之间的争论已经升级到java与.NET开发者的各种恩怨情仇,甚至延伸至Linux与Windows在服务器端的优劣之争。一些积郁已久的微软死忠和以.NET为...
1. **职位需求预测框架之争**:文中提到通过分析indeed网站上的Java职位需求,可以预见到2008年Java框架的竞争情况。这反映了Java开发者对于框架选择的关注,可能涉及到Struts、Hibernate、Spring等主流框架的对比和...
- **标准之争**:Java社区的标准之争不仅影响技术的发展方向,还可能对整个行业的标准化进程产生长远影响。 - **开源文化**:Java的成功得益于开源文化的推动,但过多的标准纷争可能会阻碍技术进步和创新。 #### 三...
3. **Eclipse vs NetBeans**:对比了Eclipse 3.3与NetBeans 6.0,指出两者在Java开发环境中的优势和不足,为开发者选择IDE提供了参考。 4. **IntelliJ IDEA 8**:介绍了IntelliJ IDEA的新版本特性,可能是关于性能...
1. **Java与.NET之争**:当时,Java和.NET作为两大主流开发平台,竞争激烈。开发者们在选择编程语言时,会对比两者的性能、跨平台能力、开发工具以及社区支持。这一期可能涉及了两者的优势分析和实际应用案例。 2. ...
#### 七、Android开发技术的应用现状与未来 ##### 7.1 应用领域 - **游戏类App开发**:利用Android强大的图形处理能力和多媒体功能。 - **商业与工具类App开发**:为企业和个人提供高效的工具和解决方案。 - **...
标题“Oracle合并Sun 之争IBM”反映了2009年科技界的一件大事,即甲骨文(Oracle)公司收购了Sun Microsystems,并在此过程中与IBM展开了一场激烈的竞争。这一事件对于IT行业,尤其是数据库和企业级软件领域产生了...
1. **Java与.NET之争**:当时,Java和.NET平台的竞争尤为激烈,每一边都有其独特的优点和应用场景。读者可能在这期杂志中找到关于这两个平台的技术比较、开发工具和最佳实践的探讨。 2. **Web 2.0的兴起**:2006年...
随着技术的进步,Linux作为一种开源操作系统,正在与各种新技术结合,特别是在RIA领域,Linux的新版本在提供更丰富的网络应用体验方面展现出强劲的竞争态势。Linux的开源特性使其能够快速适应和集成新的开发框架,为...
Admin4J 是一款开源软件,专门针对Java EE应用程序设计,为开发者提供了丰富的管理功能,以增强应用的稳定性和可维护性。它包含了多个关键模块,旨在帮助开发者更好地监控和管理他们的应用程序。 首先,异常管理是...
在硬件领域,2014年的CPU和显卡市场竞争激烈,AMD与Intel的处理器之争、NVIDIA与AMD的显卡之战可能会有详尽的报道和评测,帮助读者了解当时最新的硬件性能和性价比。同时,存储技术也在不断发展,SSD固态硬盘逐渐...
### 一、编程语言之争 #### PHP是最好的语言? 在描述中提到“对于程序员而言,语言之争永无止境,php是最好的语言。”这句话反映了程序员群体中的一种普遍现象:不同的编程语言会有各自的拥趸者。PHP作为一种广泛...
安装这个更新可能有助于提升Web服务处理能力,解决潜在的技术问题,并确保系统与最新的Java标准保持一致。对于开发者来说,理解这个组件的作用以及如何正确地将其集成到Tomcat和Axis环境中是非常关键的。
x264是针对H.264/AVC视频标准的高效开源编码器,它是目前最广泛采用的H.264编码实现之一。x264采用了多项优化技术,如多线程、快速搜索算法、上下文自适应二进制算术编码( CABAC )等,能够实现高质量、低码率的...
#### C#与Java之争 在选择C#还是Java时,关键在于理解和运用编程的核心思想——严密的逻辑思维。无论哪种语言,编程的本质都是相同的,即通过严谨的逻辑实现问题的解决。因此,学习多种语言有助于拓宽思路,增强...
DropboxMQ是一个开源项目,它实现了Java Message Service(JMS)API,并且创新性地利用了共享文件系统作为其核心消息存储和分发机制。在深入探讨DropboxMQ之前,我们先来了解一下JMS和消息队列的基本概念。 Java ...