??xml version="1.0" encoding="utf-8" standalone="yes"?>
关于.NET技术与Sun公司的Java2企业版(J2EETMQ相比较Q许多客户都想了(jin)解Microsoft公司的观炏V由于以下的几个原因Q?NET和JEE的比较有Ҏ(gu)手:(x)
1) 一般来_(d)W(xu)indows .NET Framework是Microsoft的Windowspȝ中经q精?j)定义的技术部分,而J2EE则是一个书面的协议。如果不局限于学术斚w的讨论,换句话说Q就是在几个应用q_上讨个话题的商业价|那么仅仅比较J2EE和一个实际应用的工具是没有意义的?br />
q样实际应用的工具如QIBM公司的WebSphere应用服务QBEA的WebLogic服务或是其它cM的应用服务?br />
要想得到令h满意的分析,只有q行产品之间的比较,例如比较开发效率。用J2EEQ开发者需要创?个组件来建立一个单一的EJB。表面上看来Q这只不q是为开发效率付出的一点代仯(g)已。但是Java的一些开发工具隐藏了(jin)一些开发技巧,降低?jin)效率。另一个例子,J2EE的部|体pd分复杂难解,cd入JARQ而JAR嵌入WARQW(xu)AR又嵌入EAR。但是在一定程度上Q有些工兯自动完成部vq程。上q情况导致决定一个应用服务商业h(hun)值的关键因素开发效率因不同的销售商而有差异Q这主要取决于开发工L(fng)效率?br />
2) 关于“J2EE全明星队伍”的问题。当比较.NET和J2EE所有组件的集合Ӟq个问题׃生了(jin)。例如,分析者考虑开发效率时可能到下列问题QA公司的品, B公司的应用服务程序, C公司的安全规则, D公司便安装, E公司军_h。所有这些都可能和J2EE有关。集合上q这些特征属性,J2EE工具看v来还行:(x)h便宜Q安装简便,速度快,安全性高Q有高速缓存,q且有好的开发工P{等。但q些都无关痛痒—因Z可能同时获得所有的q些Ҏ(gu)。事实上Q一ơ只能得C个准的Ҏ(gu)。因些品来自不同的公司Q它们不可能合作无间。例如,IBM公司的工具不能和BEA公司的WebLogic服务同时工作Q因为后者是用的Oracle公司的缓存引擎,而Oracle的引擎不能用Iona的h(hun)D得,{等诸如此类。h们有时候会(x)误将“J2EE的所有特性集合”作为比较的基础Q但q是不合理的。客户需要的是知道一对一Q品对产品的比较?br />
3Q比?NET和J2EE而忽视其它应用^台是十分重要的。J2EE是仅x(chng)应用E序服务器的规范。但是绝大多数客户对下列q些感兴:(x)应用E序服务器,端口Q商业服务器和分析工P数据库,分离数据和流动性,信息代理Q应用程序集合,定w理Q智能客L(fng){等。作为对客户要求的回应,q些因素应该l一工作Q所有的主要销售商应该推行整合的^台。例如Microsoft的^収ͼ包括Windowspȝ的客L(fng)和服务器QW(xu)indows .NET FrameworkQVisual Studio.NET FrameworkQ和Microsoft企业服务器)(j)QBEA的WebLogicq_QIBM公司的WebSphereq_QOracle的^収ͼq有Sun公司的一个^台。将_֊集中在这些^台的一个难题(应用服务器)(j)上将?x)导致一个类似“树(wi)林和林”关pȝ问题。这L(fng)一个比Ҏ(gu)合适的Q但是它应该被考虑C个更qKq_的一部分?br />
从Microsoft的角度来看,和那些不常见的警告相比,q些是Windows .NET Framework和基于J2EE的品的关键性的异同炏V?br />
怼?br />
1Q?Windows .NET Framework和Java都有一个受控的q行时环境,它不但将源代码{换成中间语言Q而且这些中间语a~译成本地的可执行代码。两个环境都支持片整理、动态类加蝲和异常处理等?br />
2Q?.NET和Java都倡导和支持基于组件的设计、多态性、(h)承和接口{,也提供基cd来执行I/O、XML处理、带有连接池的数据库接入、文本操作与|页脚本~写{?br />
3Q?两者都l过Ҏ(gu)的销售商的品进行发布。J2EE规范自己是“销售中立”的Q但实际上那些遵从规范的产品都必d现规范外的特性,例如理Ҏ(gu)或是展开Ҏ(gu)。因此,q些产品必须是对应特定的销售商。例如Microsoft公司的Windows?NETpȝ?br />
4Q?Windows .NET Framework和基于J2EE的品都和第三方的品一起工作。例如,在后端数据库领域Q?NET和基于J2EE的应用程序能讉K储存在Microsoft的SQL服务器、IBM的DB2、OracleQInformix、Sybase{服务器里面的数据。再举一个例子,.NET和基于J2EE的系l能讉K?hu)行的信息中间设备,如Microsoft的MSMQ或是IBM的MQSeries。同P也包括文件系l,W三方开发工P代码版本pȝQ防火墙{?br />
不同?br />
1Q?原理
J2EE是一个单一语言的^収ͼx(chng)跨^台的可移植性。这意味着Q要利用J2EEQ设计方案能使用多个操作pȝ其中的一个,但开发者必L受关于Java的培训。Microsoft提供?NET构架作ؓ(f)Windowspȝ的一部分。开发者能使用多种语言Qƈ且效率很高而不用进行一U新语言的重新训l。但.NET Framework是Windowspȝ的一部分?br />
2Q?宽度和广?br />
a. .NET包括代码、品、工具和构架Q来利用|络上全部的计算资源Q包括设备、个人电(sh)脑和服务器等?NET使所有的q些讑֤能经q标准通讯协议全部q接在一Px(chng)谓的“XML WEB服务”。(.NET应用E序可以和Q何一个系l连接,无论pȝ用什么语a和^収ͼ甚至是J2EE。只要目标系l遵照XML WEB服务标准。)(j).NET模型是广泛的分布式计,它和许多代码互相通讯q交换信息?br />
b. J2EE是面向服务器的模型,它ƈ不开发网l上的智能和计算功能。ȝ来说Q基于J2EE的品只支持服务器端的应用程序。J2EE一般把PC只看作是一个HTML的浏览器Q而将q些讑֤认ؓ(f)是哑l端。至于XML WEB服务Q现有的协议标准支持分布式的计算Q现有版本的J2EE规范q没有提到XML WEB服务的问题,但是ZJ2EE的品在d?jin)附加装|后也可以支持XML Web服务。然而,d附加装置也就意味着有严格的限制。例如,q(sh)清楚现有的规范是否允许EJB调用Web服务Q虽然Web服务的组件能调用一些EJBE序?br />
3Q?~程模型的一致?br />
Windows .NET Framework提供?jin)一个跨服务器、PC和其它设备的一致的、面向组件的模型。而J2EE提供EJB作ؓ(f)服务器端的组件模型;为客L(fng)或是本地lg建立开攄完全用Java~写的APIQؓ(f)用户界面提供servletQ也为移动设备提供另一U不同的模型。甚臛_EJB内部也有臛_3U明显不同的子模型,每一U子模型都有不同的语a定义?br />
Microsoft?NET~程模型与Javaq_相比较,在各U服务器和客L(fng)上有更好的一致性。J2SE是基于开攄完全用Java~写的APIQ而J2EE是基于Java servlet和EJB?br />
DH Brown, 2002q??br />
4Q?功能
a. Windows .NET Framework提供一个能识别版本的类加蝲器,q就意味着应用E序的开发者能保他们开发的应用E序在一部分代码已经更新的情况下仍能q行。而Java和J2EEQ现有的Q没有版本识别的cd载器Q这意味着开发者和理员(sh)能保证代码被执行时是正确的。或是说Q开发者只能靠q气来保证这一炏V?br />
b. Windows .NET Framework昄?jin)语a层面上的cd性—这׃得编E更加简单。例如,在源代码中只用一个简单的属性就能把.NETlg标志为处理模式。或者说Q一?NETlg和XML的串行化可以在一个属性中被定义。这个机制大大简化了(jin)许多~程d。而Java不显Ca层上的类属性,虽然Sun公司考虑到要修改Java语言来改变现状。这U变化估计在两三q内才能W一ơ实现?br />
c. .NETq支持分L据访问,q主要用于在Ud讑֤或是偶尔联网的场合里q行的应用程序。数据能被脱机操作,接着再和起始数据重新同步。而不论是J2EEq是J2SE现阶D都不支持分L据访问,需要这功能的J2EE开发者必自己写“plumbing code”?br />
d. 为徏立基于网l的用户界面QW(xu)indows .NET Framework提供Z事g的模型,q些模型cM于流行的Visual Basic中的客户端模型。ASP .NET模型使得建立、发布和l护一个基于网l的用户界面变得更加Ҏ(gu)。与之Ş成对比的是,J2EE在JSP中不支持q样的模型。有一些第三方的扩展程序部分I补了(jin)q些功能Q但是它们的实用性和便性不能和ASP .NET相比。作Z个推荐的J2EE附加E序QJava Server Faces可能做到q一炏V但q个附加E序q没有包括在J2EE?.4版本以前。而要获得销售商的支持,则又需臛_一q的旉?br />
e. J2EE支持一个对象相关的数据映像模型Q它被称作EJB Entity Beans。这hZ(jin)允许开发者更Ҏ(gu)C一个相关的数据库徏立对象模型。然而,实际上把q个x(chng)~程实现却要面对下列问题Q?br />
?易用性:(x)当那些熟知的、正规定义的、被q泛支持的结构化查询语言QSQLQ和开发者的数据怺作用Ӟ开发者不得不攑ּ它们Q而用一个被UCؓ(f)EJBQL的弱定义查询语言。和SQL相类|EJBQL的功能ƈ不强大(例如Q在现有的规范中Q它没有ORDER BY的语句,q样开发者就没法使用特定数据库的SQL扩展Q,而它的语义也没有被正规定义。还有,在对象间建立联系和附属关pd分困难,而且在对象间和XML以及(qing)后端之间的数据翻译是手动控制的?br />
?性能Q基于EJBpȝ的性能仍是一个未知数。没有提供公开的基准。客户反映,得到的性能q远偏离?jin)Entity BeansQƈ且{向一个更直接的数据访问策略。这是EJB Entity Beans没有被广泛用的一个关键因素?br />
在Windows .NET Framework中,数据讉K是基于数据集比较的。数据集保存?sh)(jin)相x(chng)据的一个子集,它由一个或多个SQL查询语句描述。数据集中的数据可能保存关键的联p,q且开发者能直接Ҏ(gu)据进行操作,能将数据转换成XML格式和上ơ操作的cdQ能使用标准的SQLqo(h)数据{。总而言之,相对于EJB Entity BeansQ?NET的数据集模型提供一个更丰富而且单熟(zhn)的途径?br />
5Q?便?br />
aQ?配置Q对于J2EEQ配|是由部|描qC息获得的XML格式的文Ӟ它们和实际执行的商用逻辑代码有明昑别。这U方法有很多问题。第一Q考虑到特定类的元数据Q有些代码中的改变和元数据中的改变是怺依赖的。两个独立文件的同步性要求有可能产生错误。第二,考虑到应用程序层的元数据Q在J2EE中,没有可以从一个程序(h)承元数据到另一个程序的途径。与J2EE不同QW(xu)indows?NET构架包括?jin)这个功能,使得可以在源代码中直接向cL加属性,q样׃?x)生第一个问题。Windows .NET中的元数据模型允许客戯己添加扩展程序,q样开发者就可以~写和用自q属性。ؓ(f)?jin)在Windows?NET构架中配|外部元数据Q这个功能被包括在配|文件的分pȝ中,它能从父pȝ中(h)承属性,q样每个文g?x)很,它只记录改变的设定。这避免了(jin)J2EE模型的第二个问题
bQ?数据库连接池Windows .NET Framework中,是根据需要自动徏立和理q些池的。而在J2EE模型中,q接池必被明确配置和管理?br />
cQ?XML Web服务Q在.NET中徏立一个XML Web服务像在类中添加一个属性那L(fng)单。有些基于J2EE的品也惛_Java中模拟这个功能,.NET提供更简单的Ҏ(gu)来徏立和使用可由双方共同操作?XML Web服务?br />
dQ?部vQ在.NET中,要部|一个应用程序,理员只需要拷贝文件。而在J2EE中,理员必d很多~译文g和JAR、WAR以及(qing)EARl定Q然后在一个特定的服务器部|工具中解开q运行它们,接着拯l果档案。这个多步部|过E意味着典型的编?~译/调试循环被大大g长了(jin)。此外,׃动态加载类q程中的一些变化,更新一个简单的cd帔R要重新启动基于J2EE的服务器?br />
虽然许多公司选择Java作ؓ(f)企业发展的策略^収ͼ但它们的使用却由于J2EE的复杂性而受到阻。Meta GroupQ??br />
6Q?成本
aQ?Z(jin)部vQ运行在Windows .NET Framework之外~写的服务器端的应用E序需要一个Windows Server的许可,q比三个遵从J2EE的商业服务器中的M一个许可都便宜很多。包括四个网l服务器的系l部|费用的差别可达到数十万元。例如,Microsoft Windows Server 2003Q企业版Q的一个四机器pȝQ每个有四个pcQ的许可费用不超q?6Q?00元Q这考虑?jin)零售因素?j)。而W(xu)ebSphere Application Server 5.0在同L(fng)pȝ中每台pc的许可费用达12Q?00元Q这p192Q?00元。这个比率是12?。大多数ZJ2EE的商业应用程序服务器的h(hun)格都和这cM。(q假定了(jin)性能相等。然而实际上Middleware公司2002q?0月的报告昄Q一个徏立在Windows .NET Framework上的应用E序的效率是建立在同h行的ZJ2EE的服务器上的E序?-4倍。所以实际上h的优势远高(sh)12?Q有很多免费的,ZJ2EE的开放源应用服务器,但是它们q没有J2EE-compliant的商标。还有关于文件和产品的问题:(x)需要品之间的比较来讨论采许可费用?br />
bQ?为Windows .NET Framework开发工L(fng)费用也更加低廉。Visual Studio .NET?NET的整合开发工P它的许可费用大大低于商业化的J2EE销售商制定的开发工L(fng)费用。ƈ且在业界QVisual Studio .NET作ؓ(f)最?jng)_发工兯得了(jin)一pd的大奖。评估过Visual Studio .NET和其竞争Ҏ(gu)的客户都_(d)相对于最好的Java工具QVisual Studio .NET开发效率更高(See GigaQ?002q?月)(j)?br />
cQ?使用Windows .NET Framework的开发和l护费用更低。专家认可费用ƈ不是一个项目的最大开支。典型的软g开发和l护占项目总费用的50-80%QGlassQ?002QKemererQ?995QGartnerQ?001Q。Middleware公司2002q?0月的研究表明Q在Windows .NET Framework上一个给定的应用E序开发相对于J2EEQ只需?/3的代码。代码越就意味着l护更加单?br />
ȝ
显而易见:(x)正确的品选择决策不可能不评估实际的品。对比Microsoft Windows Server?qing)Windows .NET Framework和J2EEQSun公司的规范)(j)是有价值的Q但是这L(fng)努力~少实际产品的评估。然而,q是可以从中得出一些结论:(x)
1Q?J2EE展现?jin)一个以服务器ؓ(f)中心(j)的原则,q将重心(j)攑֜EJB和解决“相兛_象的映像问题”上。J2EE在支持XML和W(xu)eb服务上已l落后了(jin)。Windows .NET Framework的原则则是通过协议标准和XML、充分利用服务器、接口和讑֤的的大规模分布式计算?br />
2Q?相对于编写在Windows .NET Framework上的E序QJ2EE应用E序需要更多的代码来执行相同的d?br />
3Q?J2EE的管理和部v模型更像是一个主机模型,它关注保护和限制E有的计算资源Q按比率使用。而W(xu)indows .NET Framework展现出的原则是计资源是廉h(hun)的,而且更加廉P但是部v能力保持大部分昂贵的资源?br />
MQ如果一个项目要求必M几个操作pȝ中选择一个作为部|^収ͼ而不考虑开发成本;强制Qƈ且重新培训训l)(j)开发者用单一的编E语a来执行这个项目,从而代码的版本问题׃再重要;重要的是配给和限制相对便宜的计算资源Q这样用昂贵复杂的开发和l护工具显得顺理成章;而编写更多的代码也有其优?- J2EE也许是一个不错的选择?br />
然而,如果商业目标昄最优化的开发效率是重要的;低廉的性h(hun)比更W合要求Q通过通讯协议的标准获得的可相互操作性有较高?sh)|大量支持Z界面的应用程序和Ud的应用程序是重要的;更感兴趣的是易扩展性—这L(fng)话,建立一个Windows .NET Framework上的Windows Server应用E序是正的选择?img src ="http://www.tkk7.com/aawanghuan/aggbug/83843.html" width = "1" height = "1" />
]]>
(tng) 跨^台的Ҏ(gu)一直是J2EE (tng) 的最大特点,它通过Java (tng) 的虚拟机技术屏蔽了(jin)底层操作pȝ的细节。从而实C(jin)所~写的代码可以在Windows (tng) q_上用,也能够在Unix (tng) q_上用。即所谓“一ơ编写,处处可用”。在J2EE (tng) 规范里面又通过JDBC、JNDI (tng) {技术屏蔽了(jin)诸如数据库、目录访问等|络l节。可以这么说Q目前用J2EE (tng) 技术实现的企业U应用可以运行在大机、Unix、windows、linux{各U操作系l上Q后台可以连接Oracle、DB2、Informix (tng) {等数据库,q且效率斚w没有太多的区别。在各系l连接方面,J2EE (tng) 也提Z(jin)很多很好的解x(chng)案,例如J2CA——J2EE (tng) 联接器体pȝ构,是J2EE (tng) 规范规定的如何用Java? (tng)
(tng) 技术与所谓遗留系l如ERP、CRM (tng) {的q接Ҏ(gu)。当然J2EE (tng) 现在也提倡用Web (tng) Service (tng) {技术来q行pȝ互联。M而言QJ2EE (tng) 技术是一套标准,它由诸多公司一h持,所以技术的通用性和标准性比较高Q目前基本上成ؓ(f)企业U解x(chng)案的事实标准? (tng)
(tng) .Net (tng) 从本质上来讲不是一套标准,而是微Y一pd产品的集合,所以,选择.Net (tng) 技术,基本上就选定?jin)微软^台。也是_(d)操作pȝ只能使用WindowsQ甚至低层硬件只能选择Intel (tng) 的系列芯片。而不能在大机、Unix (tng) 以及(qing)Linux (tng) {系l上使用。在数据库方面,.Net (tng) 在自w的Microsoft (tng) SQL (tng) Server (tng) 上也?x)比其他数据库运行得好。在pȝ互联斚wQ?Net (tng) 提倡用Web (tng) ServiceQ这个技术目前还比较斎ͼq没有太多的成熟可靠的解x(chng)案? (tng)
(tng) MQ在多系l整合和pȝ延展性方面,基本上是J2EE (tng) 的特点,目前而言Q?Net (tng) 技术还很难望其背? (tng)
(tng) Q?QI/O (tng) 处理和线E调? (tng)
(tng) 在这个方面,从应用的层面看,两者都能够辑ֈ企业U应用的需求。但是I/O处理和线E调度从本质上来讲应该由底层g和操作系l来解决。J2EE (tng) 支持众多的硬件和操作pȝQ单从这Ҏ(gu)Ԍ都比.Net (tng) 技术有优势得多。别的不_(d)大型计算机的I/O (tng) 处理能力和线E调度能力是其他M机种所无法企及(qing)的。而大Z目前只能q行J2EEQ不能运?Net。光q一点,p明了(jin)在这个方面J2EE (tng) 优(sh).Net (tng) 技术? (tng)
(tng) Q?Q稳定性和安全? (tng)
(tng) E_性和安全性方面可以用很多方式d现和补偿Q问题的关键是看投入的成本和l护的费用是多少Q昂늚资金投入昄是不合适的。所以,我们去讨论那些Yg的补偿方法没有太多的意义Q我们把讨论集中在操作系l和g芯片U别的比较? (tng)
(tng) .Net (tng) 技术进军高端应用市(jng)场,靠的是Windows (tng) Data (tng) Center (tng) 之类的操作系l,靠的是Intel (tng) 的安腾芯片。Windows (tng) 操作pȝ的稳定性和安全性与Unix (tng) 乃至S/390{操作系l相比较Q其l果不言而喻。Windows (tng) 是最通用的桌面系l,也是最大的病毒温床。众多的病毒困扰着Windows (tng) 的用者。目前,利用Microsoft (tng) (tng) SQL (tng) Server (tng) 的漏z的病毒正在肆虐是一个明证。而Unix、Linux (tng) 和大型机操作pȝ的病毒就较少Q安全别也比Windows (tng) 高? (tng)
(tng) 再来看看.Net (tng) 所能够q行的硬件^収ͼ一般而言只有Intel (tng) 公司的芯片,Intel公司的志片一般我们认为它只是个部门别服务器的芯片。Intel (tng) 公司Cq入高端服务器市(jng)场的是Intel (tng) 公司与HP (tng) 公司共同研发?4 (tng) 位芯片安腾。安腄列目前最新的是安?。尽在其发布会(x)上英特尔展示?jin)安? (tng) 处理器与Sun (tng) 公司UltraSPARCⅢ的性能Ҏ(gu)资料Q但q?dng)ƈ没有展示更多的基于系l的安全性、稳定性及(qing)兼容性能的对比评,而这些是高端应用的关键所在,而安?与现有应用Y件的兼容则更是不甚明?jin)的二进制兼宏V因此,我们可以说安?要在高端?jng)场占领一定的Cq需要一些时日和改进? (tng)
(tng) 所以,.Net (tng) 技术在高端的企业应用?jng)场q比较缺乏案例支持? (tng)
(tng) Q?Q品成熟度{其他因? (tng)
(tng) J2EE (tng) ?999 (tng) qŞ成了(jin)其成熟的架构Qƈ且到今天已经有相当成熟的l过(g)验的企业应用pȝ。?Net (tng) I其渊源是源自微软以前开发企业应用程序的q_DNA (tng) Q? (tng) Distributed (tng) NetworkArchitectureQ,其中包括?jin)许多已l被证实的技术,q且q些技术已l在产品中得到实玎ͼ包括微Y的事务服务器、COM+、消息队列、SQL (tng) Server (tng) 数据库等。而对于扩展性,qؓ(f)业界接受的事实是.NET (tng) q_的扩展思想是基于Y件的横向扩展Q而J2EE (tng) q_的扩展思想则是Zg的纵向扩展。这也符合微软和Sun各自的品利益。但是我们还需要细看这个问题,.Net (tng) 技术源于DNA (tng) 技术。众所周知QDNA技术可能能够解决部门应用的问题,但是在大型企业应用中׃是那么适合?jin)。其实,从微软这家公司的历史背景可以看?gu)个问题,微Y从来不是一个老牌的企业解决Ҏ(gu)的提供者,它是从DOS、Windows (tng) {桌面操作系lv家的Q在购买?jin)一个企业操作pȝ开发出Windows (tng) NT (tng) 后才开始进入企业解决Ҏ(gu)?jng)场。与IBM、HP、Sun (tng) {一直从事企业应用的提供商相比Q其技术和支持力量q显得稚嫩。尚没有大多的成功案例和解决Ҏ(gu)。而J2EE (tng) 却是q些企业U解x(chng)案的提供商所力推的,所以J2EE (tng) 在企业中有大量的成功案例和解x(chng)案。这些可以从世界各种大企业的IT (tng) 应用pȝ的实际情况可以看出。世界上大多C业的IT (tng) pȝ中,使用J2EE (tng) 技术的q远大于. (tng) Net。可以这么说Q?Net技术尚没有太多比较成功的实施案例。?tng)?
Ruby on Rails 是一?Web 应用E序框架Q它的目标是为应用程序开发提供一条易行道。实际上Q框架的支持者们声称 Ruby on Rails 开发h员的生率最多是使用传统 J2EE 框架?10 倍。(请阅诠ZRolling with Ruby on Rails”一文,以获得关于这一声明的更多内容;请参? 参考资?/font> Q。虽然这句话造成?Rails ?J2EE C相当大的争议Q但争论中却很少谈及(qing)如何比较 Rails ?J2EE 架构。本文将使用企业应用E序中常见的开源工P?Rails 框架和典型的 J2EE 实现q行比较?/font>
要想扑ֈ用一句话描述 Rails 的简单说明,只需查看目? 主页 卛_Q?/font>
Rails 是一个用 Ruby ~写的全栈的Qfull-stackQ、开源的 Web 框架Q可以用它来轻杄写实际的应用E序Q所需的代码也要比大多数框架花在处?XML 上的代码?
虽然我不能保证框架确实会(x)提供它所承诺的轻村ֿ乐,但是上面q句话确实很好地ȝ?Rails 的品质。全栈包括:(x)Web 服务器、处?HTTP h和响应的框架Q以?qing)方便地把数据持久存储到关系数据库的框架。Rails 通过消除复杂?XML 配置文gQ?Ruby 语言的动态性质Q帮助把?rn)态类型语a中常见的许多重复代码减少到最,努力使开发工作变得更Ҏ(gu)?/font>
?1 比较?Rails 堆栈和典型的 J2EE Web 堆栈Q包?Tomcat servlet 容器、Struts Web 应用E序框架?Hibernate 持久性框Ӟ(j)?/font>
可以看到QRails 堆栈和构成普通的Z J2EE ?Web 应用E序的组件之间的基本区别很小。两者都有用来执行应用程序代码的容器Q都有帮助分d用程序的模型、视囑֒控g?MVC 框架Q以?qing)持久存储数据的机制?/font>
![]() |
|
Struts ?DispatchServlet
都是前端控制器模式的例子Q所以,它们提供?jin)相同的功能。它们接?HTTP hQ解?URLQ把h的处理{发给适当的动作。在 Struts 中,动作是扩展自 ActionController
的类。两个前端控制器之间的主要区别是它们如何军_处理具体h的动作?/font>
使用 StrutsQ开发h员需要把特定h的映外部化?XML 配置文g中的 ActionServlet
Ӟ它将解析q个文gQƈ准备接受h。根据约定,?ActionServlet
Q由 ActionServlet 分派到适当??2
?XML 是一个典型的映射。它告诉
deleteOrder.do
的请求{发到 Rails 采用?jin)不同的方式。它没有依赖配置文g把请求映到某一个动作,而是Ҏ(gu)h?URL 发现适当的动作。从?2 可以看到QURL
OrderController
实例上的 4
作ؓ(f)可用的实例变量。Rails _聪明Q知?find
Ҏ(gu)Q那么只要用 delete
Q就可以调用q个Ҏ(gu)?/font>
?Rails ?Struts 中,动作用来充当前端控制器和模型之间的桥梁。开发h员提供动作的现实Q从而提供特定于应用E序的请求处理。前端控制器负责接受hQƈ把请求传递到特定动作。图 3 演示?Rails ?Struts 基本的动作层ơ结构?/font>
![]() |
|
Struts 要求开发h员扩?execute()
Q以处理h。通常Q每??3
演示?jin)三个特定动作?x)
包含映射的配|信息,像
?2
?XML 所描述的那栗?/font>
DeleteOrderAction
?execute()
Ҏ(gu)Q传递给它许多有用的对象Q其中包?HTTP h和响应对象?code>ActionMapping
ActionForward
对象QStruts 用这个对象来定对请求(h)l进行处理的lg。一般来_(d)q个lg是一?JSP 面Q但?Action
的单一实例Qƈ允许多个U程调用它的 Action
实例。但是因为可以在多个U程之间׃n单一对象Q所以必遵守适当的线E注意事,因ؓ(f)其他U程可能?x)破坏在q个动作中保持状态的实例变量?/font>
?Rails 中,必须扩展 ActionController
的实例池化;相反Q它为每个请求创建新的实例。虽然这Ҏ(gu)能可能有负面媄(jing)响,但是它可以让开发变得更Ҏ(gu)。开发h员(sh)需要关?Struts 中存在的U程问题Q因此,?x)话、请求、标题和参数都可以作?ActionController
q是一个将特定域逻辑的所有处理组合在一L(fng)合理场所。Struts ?ActionController
则是_粒度的Q它?yu)具体的工作单元模拟Z些方法?/font>
清单 1 ? 清单 2 分别演示?jin)典型?Struts 动作和典型的 Rails 动作
?1 提供?jin)对两种?gu)的逻辑程的比较,q演CZ(jin)清单
1
和清?
2
的特定行中发生的事情。研I?execute()
Ҏ(gu)?delete
Ҏ(gu)Q可以看出它们基本上是相同的?/font>
步骤 | Struts | Rails | |
框架调用动作 |
?03Q?/b>
?07Q?/b>
|
?06-07Q?/b>从请求对象中取出 | ?08Q?/b>从所有参数的实例哈希中取?/font> |
从数据库删除订单记录 |
?09?4-24Q?/b>调用
?09Q?/b>?ActiveRecord 删除记录
|
||
重定向到列出剩余订单 |
?11Q?/b>??2
中的 XML 映射昄Q?code>/listOrders Q这是另一?
?10Q?/b>用将调用的下一动作的哈希来调用 |
![]() ![]() |
![]()
|
持久性框?/i> 用来在应用程序层和数据库之间来回Ud数据。Hibernate ?Rails 的持久性框架可以归cMؓ(f)对象/关系映射QORMQ工Pq意味着它们接受数据的对象视图,q将该视图映到关系数据库内的表中。用两U框架的目的都是Z(jin)减少与关pL据库有关的开发时间。但是, ?4 演示?jin)两者在设计和配|上的一些根本区别?
Hibernate Z Data Mapper 模式Q在q种模式中,特定的映器c?
Wikipedia 中(请参?
参考资?/font>
Q简要地?反射 定义为“程序在q行的时候检查和修改光U结构的能力”。在那里Q还?元编E?/i> 定义为“编写那些能够编写和操作其他其他E序Q或它们自己Q,其他程序作q数据的程序,或者编写那些完成其他程序在q行时所做的部分工作的程序。?/font>
以下代码实现反:(x)
q个代码实现元~程Q?/font>
Rails ?ORM 框架叫作 Active RecordQ它Z同名的设计模式。Martin Fowler ?Active Record 描述为“包装数据库表或视图中数据行的对象,装数据库访问,在数据上d域逻辑”。在 Rails 中,每个域对象都扩展提?CRUD 操作?
清单 5
昄?
?
清单 5
那样~码?
虽然 Ruby on Rails 是一个非常新、o(h)人兴奋的框架Qƈ且在 Web C中已l引起了(jin)Z相当的兴,但是它的核心(j)架构仍然遵@?J2EE 中发现的基本模式。开发把两个框架分开?Web 应用E序是一U合理的Ҏ(gu)。Rails 更喜Ƣ清楚的代码而不是配|文Ӟ?Ruby 语言的动态性质在运行时生成?jin)大部?i>道 代码。大多数 Rails 框架都是作ؓ(f)独立目创徏的,而且应用E序开发能够从一l同cȝ件受益。相比之下,典型?J2EE 堆栈們于构建在通常独立开发的最好的lg之上Q常常用 XML q行配置q将lgl合在一赗?/font>
那么Q是否应该考虑对下一?Web 应用E序使用 Rails 呢?嗯,Z么不呢?它是~写得很好的lg堆栈Q它们彼此之间工作得很好Qƈ且基于行业接受的企业模式。Ruby 语言支持快速开发,q过生大多数应用程序管道来d到框架。熟(zhn)?Java 世界中的 MVC ?ORM 框架的h们在?Rails 表达自己的思想时没有Q何困难?/font>
?J2EE 一起分发会(x)不会(x)有利?RailsQ绝对不要。J2EE 是一个已l设|好的标准,有许多固定的实现Q而且Q最重要的是Q它是一个经q验证的技术。我(zhn)下载一?Rails 的副本,q开始自己钻研它。许多可用的教程都是介绍性的Q这些教E可以让(zhn)立卛_始?Rails。再ơ声明,我ƈ不能保证(zhn)会(x)通过使用 Rails 得到快乐Q但是我敢打赌?zhn)会(x)感到满意?/font>
清单 3
昄?Hibernate 映射文g的一个实例?code>Order
对象映射?models.Item
的一对多关系?/font>
清单 4
昄?
清单 3. Order.hbm.xml
...
01 <hibernate-mapping>
02 <class name="models.Order" table="ORDERS"
03 dynamic-update="true" dynamic-insert="false"
04 discriminator-value="null">
05
06 <id name="id" column="id" type="java.lang.Long"
07 unsaved-value="null">
08 <generator class="identity"/>
09 </id>
10
11 <set name="items" lazy="false" inverse="false"
12 cascade="none" sort="unsorted">
13 <key column="id"/>
14 <one-to-many class="models.Item"/>
15 </set>
16
17 <property name="name" type="java.lang.String"
18 update="true" insert="true"
19 access="property" column="name"/>
20 </class>
21 </hibernate-mapping>
清单 4. Order.java
01 public class Order {
02 private Set items;
03 private String name;
04 private Long id;
05
06 public Long getId() { return id;}
07
08 public void setId(Long id) { this.id = id;}
09
10 public Set getItems() { return items;}
11
12 public void setItems(Set items) { this.items = items; }
13
14 public String getName() { return name; }
15
16 public void setName(String name) { this.name = name; }
17 }
反射和元~程
01 obj = "some_string"
02 if obj.respond_to?('length'):
03 puts "obj length = #{obj.length}"
03 end
>> obj length = 5
01 class SomeClass
02 end
03 newMethod = %q{def msg() puts "A message!" end}
04 SomeClass.class_eval(newMethod)
05 aClass = SomeClass.new
06 aClass.msg
>> A message!
?Hibernate 一PActive Record 不需要映文Ӟ实际上,使用 Active Record 的开发h员(sh)需要对 getter ?setter、甚至类的属性进行编码。通过一些漂亮的词汇分析QActive Record 能够判断出,
ORDERS
表。?Ruby 反射和元~程的组合,表的列可以变成对象的属性。访问器和调整器也添加了(jin)q来?/font>
Order
cM中有一行代码定义了(jin)它与 has_many
是一个静(rn)态方法调用,W号 :items
发现 Item
对象映射回数据库中的
清单 5. order.rb
01 class Order < ActiveRecord::Base
02 has_many :items
03 end
Order
上用的操作和属性的部分列表Q?
?2. ?Order 上可用的属性和操作
cL?/font>
实例Ҏ(gu)
属?/font>
...
回页?/font>
]]>
一个正则表辑ּ是由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W?/em>Q组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符丌Ӏ正则表辑ּ作ؓ(f)一个模板,某个字W模式与所搜烦(ch)的字W串q行匚w?/p>
q里有一些可能会(x)遇到的正则表辑ּCZQ?/p>
下表是元字符?qing)其在正则表辑ּ上下文中的行为的一个完整列表:(x)
JScript
VBScript
匚w
/^\[ \t]*$/
"^\[ \t]*$"
匚w一个空白行?/td>
/\d{2}-\d{5}/
"\d{2}-\d{5}"
验证一个ID L(fng)是否׃?位数字,一个连字符以及(qing)一?位数字组成?/td>
/<(.*)>.*<\/\1>/
"<(.*)>.*<\/\1>"
匚w一?HTML 标记?/td>
字符
描述
\
下一个字W标Cؓ(f)一个特D字W、或一个原义字W、或一?向后引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\\' 匚w "\" ?"\(" 则匹?"("?/td>
^
匚w输入字符串的开始位|。如果设|了(jin) RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?/td>
$
匚w输入字符串的l束位置。如果设|了(jin)RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?/td>
*
匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及(qing) "zoo"? {h(hun)于{0,}?/td>
+
匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及(qing) "zoo"Q但不能匚w "z"? {h(hun)?{1,}?/td>
?
匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h(hun)?{0,1}?/td>
{n}
n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?/td>
{n,}
n 是一个非负整数。至匹?em>n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h(hun)?'o+'?o{0,}' 则等价于 'o*'?/td>
{n,m}
m ?n 均ؓ(f)非负整数Q其?em>n <= m。最匹?n ơ且最多匹?m ơ。例如,"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h(hun)?'o?'。请注意在逗号和两个数之间不能有空根{?/td>
?
当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦(ch)的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦(ch)的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?/td>
.
匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?/td>
(pattern)
匚w pattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 $0?strong>$9 属性。要匚w圆括号字W,请?'\(' ?'\)'?/td>
(?:pattern)
匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?/td>
(?=pattern)
正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦(ch)Q而不是从包含预查的字W之后开始?/td>
(?!pattern)
负向预查Q在M不匹?pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_(d)该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦(ch)Q而不是从包含预查的字W之后开?
x|y
匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?/td>
[xyz]
字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?/td>
[^xyz]
负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?/td>
[a-z]
字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?/td>
[^a-z]
负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?/td>
\b
匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?/td>
\B
匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?/td>
\cx
匚w?x 指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?em>x 的值必Mؓ(f) A-Z ?a-z 之一。否则,?c 视ؓ(f)一个原义的 'c' 字符?/td>
\d
匚w一个数字字W。等价于 [0-9]?/td>
\D
匚w一个非数字字符。等价于 [^0-9]?/td>
\f
匚w一个换늬。等价于 \x0c ?\cL?/td>
\n
匚w一个换行符。等价于 \x0a ?\cJ?/td>
\r
匚w一个回车符。等价于 \x0d ?\cM?/td>
\s
匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ (tng)\f\n\r\t\v]?/td>
\S
匚wM非空白字W。等价于 [^ (tng)\f\n\r\t\v]?/td>
\t
匚w一个制表符。等价于 \x09 ?\cI?/td>
\v
匚w一个垂直制表符。等价于 \x0b ?\cK?/td>
\w
匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?/td>
\W
匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?/td>
\xn
匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ(f)定的两个数字长。例如,'\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num
匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匚w两个q箋(hu)的相同字W?/td>
\n
标识一个八q制转义值或一个向后引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为向后引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?/td>
\nm
标识一个八q制转义值或一个向后引用。如?\nm 之前臛_?nm 个获得子表达式,?nm 为向后引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的向后引用。如果前面的条g都不满Q若 n ?m 均ؓ(f)八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?/td>
\nml
如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ(f)八进制数?(0-7)Q则匚w八进制{义?nml?/em>
\un
匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如, \u00A9 匚w版权W号 (©)?/td>
Q简U?/span>SVN作ؓ(f)跨^台的多h协作使用Ҏ(gu)。在多个E序员管理同一D代码的q程中,版本的管理显得尤为重要,使用SVN 仓库、用户名?qing)其权限Qƈ通知相关人员SVN仓库负责人?/span>
SVN讄?/span>1属性中Q进?/span>SubversionQ确保复选框recursive按钮把它的D?/span>1
l (tng) (tng) (tng) (tng) (tng) (tng) (tng) ?/span> [Setting] ?/span> 讄需要忽略的文g以便忽略掉一些(f)时的、无用的文g 常被忽略的文件有 *.opt *.ncb *.suo *.plg *.pch *.idb *.pdb *.scc *.obj Debug Release *.o *.bin *.out *.ilk *.aps debug release *.clw *.bak ?/span>Tornado
q能在特定的目录中指定需要忽略的文g。忽略文件支持通配W?/span>
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
中可以选择用来合ƈ的工P强烈推荐?/span>Araxis Merge中填?/span>"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe"的选项中,填入"C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe" %theirs %mine %merged 分别?/span>..
SVN
?/span>doc主要用来攄先期的文档,code
?/span>trunk目录下直接存攑ַE文件?/span>branch
仓库中取Z码时
不要把整个仓库取出来
而应该只取出
trunk
Q?/span>
下的某个分支目录
如上图中?/span>
svn:\\code\branch\xw_051206
?/span>
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
卛_到第一?/span>
)
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
?/span>lzjQ其q个工程的主q的SVN
xb分别?/span>onlytest?/span>lz_051115
姓名~写_6_可?/span>)]Q?/span>xb_051212
分支目录
?/span>lzj
E序到达一个比较稳定的阶段Q就需要把分支合ƈCq上Q下面讲qC下合q的程?/span>
仓库讲解?/span>
Q?/span>
是空文档?/span>
?/span>
lzj
Q?/span>
分别如下两图所C?/span>
分支下的
test_SVN.txt
分支下的
test_SVN.txt
xb
到本地。然后在d的目录上右键
Q弹出如下窗口:(x)
合ƈ对话?/span>
指定的分支版本到To
。版本号的选定Ҏ(gu)是点?/span>FromQ在Log键,点击选择”made a copy?span style="FONT-FAMILY: ?hu)?>之上的那个版本,以及(qing)最上的那个版本,?/span>所C。然后点ȝ定回C图中的对话框Q会(x)自动填写From中的Revision
2
.
10
q行合ƈQ你也可以通过dry run与主q合q后的结果。合q完毕之后,?/span>xb
合ƈ后,d上的
test_SVN.txt
(tng) xb要将他的分支合ƈCq上去,Ҏ(gu)同上。但是由?/span>xb工具昄的界面?/span>
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
。这样会(x)删除无用的(f)时文件?/span>
l (tng) (tng) (tng) (tng) (tng) (tng) (tng)
不同Q?/span>SVN也对目录q行版本理?/span>
之类的日期作为开_(d)(j)Q就可以通过注释来查找比较重要的目录版本P相当?/span>
CVS
中的标签?/span>
q行q些操作Q否则之前的版本信息?x)丢失?/span>
删除、移动与重命名文件夹的方法是在文?/span>/操作Q或直接在资源浏览器中用右键拖放(?x)弹?/span>SVN
版本的回退
1. (tng) (tng) (tng) (tng) (tng) (tng) (tng)
可以更新到工程的最新的版本?/span>
2. (tng) (tng) (tng) (tng) (tng) (tng) (tng)
如图
,
q没有显C出有什么冲H,q且新徏立的文g也还在,但是在这U情况下你ƈ不能直接在你回退后的版本上进行编辑,因ؓ(f)
SVN
q解军_H?/span>
3. (tng) (tng) (tng) (tng) (tng) (tng) (tng)
如图Q这L(fng)话你可以直接解决冲突q提交。不q这U方法的不是,你新建的文g都没有了(jin)Q整个工E都回退C前的版本?jin)?/span>
4. (tng) (tng) (tng) (tng) (tng) (tng) (tng)
一个你需要的版本Q然后用?/span>
export
?/span>
SVN
(tng)
(g)查,保证是一个编译没有错误的版本。当提交比较E_的版本的时候,同时要修改你的版本号?/span>
Revision
1,0,0,12 76
77
xxx @#$%^&
78
1,0,0,13 81
1,0,0,14 99 fix some bug
(tng) (tng) (tng)
(tng)
附g | 大小 |
---|---|
svn版本理教程.rar | 474.51 KB |