进击的巨人让的声优:关注 Enhydra

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 02:29:12
宿宝臣 (linuxman@263.net), 软件工程师
简介: 本文介绍了Enhydra的概念和核心技术,试图从历史和纵横向的比较中多角度地认识Enhydra,以抛砖引玉,为Enhydra的发展尽绵薄之力。
本文的标签:  java_技术, on_demand_business, 开放源码
标记本文!
发布日期: 2002 年 11 月 10 日
级别: 初级
访问情况 488 次浏览
建议: 0 (添加评论)
 平均分 (共 0 个评分 )
Enhydra最初由Lutris公司创建于7年前。Lutris公司一直从事IT咨询开发工作,在长期的IT实践中积累了丰富的WEB开发经验,逐渐形成了一套独特而有效的开发策略和工具,这就是Enhydra。实际上,Enhydra的核心--XMLC技术,甚至早于SUN的JSP技术而诞生。即使今天看来,XMLC也比JSP有很大的优势。关于XMLC和JSP的比较,请参考 A Friendly Game of Tug of War: XMLC vs. JSP
1.2 Enhydra的特点
Enhydra是Lutris公司在长期的IT咨询和开发实践中提炼而出,并与1999年1月15日宣布加入Open Source大家族。此后,Enhydra在成千上万的开发人员的帮助下,更加趋于完善,形成了如下的特点:
开放源代码。Enhydra的版权许可为EPL(Enhydra Public Licence),类似于MPL(Mozilla Public Licence),相对比较宽松,简单的说就是:
对Enhydra核心的修改必须回馈enhydra.org,以帮助Enhydra更加完善和强壮。
Enhydra中有几项Lutris公司所创造的专有技术,但是只要是和Enhydra Application Server一起使用,对这些专有技术的使用就没有任何的限制。
高度的可扩展性和灵活性。Enhydra是100%纯Java应用程序,保证了在各个平台下的可移植性。Enhydra在设计中,还充分考虑了用户需求的多样性和多变性,在结构上保证了可以适用不同用户的需求。
胜任各个层面的开发工作。无论是小型的WEB应用开发还是大型的WEB工程,都是Enhydra大显身手的地方。这得益于Enhydra天然地支持3层的WEB应用程序结构,因此enhydra具有非常好的的伸缩性。
回页首
早期的Enhdra使用一种叫做JDDI的技术(类似于JSP,但是比JSP出现得要早),在页面中嵌入Java代码来生成动态的页面。自然,JDDI有和JSP一样的缺陷,这催生了XMLC,一种革命性的表示技术。
2.1.1 工作原理
XMLC,顾名思义就是把标记语言页面,比如HTML,XML,WML等等编译生成一个相应的Java类。这个Java类包含了页面的完整的DOM树结构及其操作方法,因而可以处理页面上的任何元素及其属性。更重要的是,在XMLC中,巧妙地把动态内容和HTML中的id元素联系起来并在Java类中生成相应的操作方法,比如改变文本的内容和元素的属性等等。不同于JSP,XMLC没有引进任何额外的HTML/XML标记元素,只是重用了ID元素。因而,XMLC实际上可以处理任何的标记语言,不仅仅限于XML,HTML等。
XMLC通过3个步骤处理标记语言页面,如下图所示:
Figure 1.XMLC原理示意
其工作过程为:
校验输入文档(HTML,XML等)是否有效,标记是否合法完整。
产生一个DOM树(Document Object Model),即Java类代表输入文档(页面)。在实际应用中,创建一个这个类的实例,如图中的salesApp,使用这个类的实例就可以操纵页面的DOM树。
产生处理动态内容的Java方法,如图中的setTextName。动态内容只需要用ID标记出来即可。可以看出,这种方法极大的简化Java开发人员处理页面动态内容的工作量。
2.1.2 一流的表示技术
XMLC的简洁和强悍,奠定了它在表示技术中的领先地位。
使用Enhdyra XMLC,界面设计人员和后台程序开发人员可以很好地分工协作。界面设计人员几乎可以任意修改用户界面而不会影响后台程序开发人员,反之亦然。
使用Enhydra XMLC,界面设计人员和后台程序开发人员只需要在项目开始时一起商定需要动态修改的元素及其ID值,其后就几乎不需要相互碰头了,分头去实现就可以。
使用Enhydra XMLC,界面设计人员不需要任何的Java知识,只需要专注于界面设计即可。
使用Enhydra XMLC,后台程序人员只需要极少的HTML等标记语言知识,只需要专注于动态内容的显示控制和业务流程的设计即可。
使用Enhydra XMLC,可以使用任何你熟悉的HTML编辑软件,因为XMLC没有引入任何额外的标记元素。Enhydra XMLC中所重用的ID元素,是HTML 4.0及其以上版本的标准元素。
Enhydra XMLC把页面(HTML,XML,WML等)转换有对等的Java类(DOM树),就意味着可以从面向对象的角度来操纵整个页面。
使用Enhydra XMLC,使得同时支持WML,XHTML,cHTML/i-mode,voiceXML,J2ME变的非常简单。
2.1.3 效率
自然,经过XMLC的转换后,要损失一点执行效率。但是,Enhydra XMLC已经经过了很好的性能调整,而且采用了独特的 Lazy DOM技术,使得XMLC的性能有了显著提高。相信在硬件发展日新月异的今天,效率和速度的少许损失,却能够换来上面如许多的优势,这笔帐还是非常划得来的。
XMLC的更多信息,以及和其他表示技术的比较,请参见 XMLC的老家
Enhydra DODS是Enhydra对数据库管理的重要工具,它可以实现数据库(表)到Java类的对应转换,封装对数据库的操作,屏蔽各种数据库间的差异,并且提供了一个图形界面的数据库设计工具,自动生成关于数据库操作的Java类。
下图是DODS运行时画面:
Figure 2.DODS运行画面

DODS目前支持以下类型的数据库:
标准数据库,比如MySQL
Sybase
Oracle
Infomix
Microsoft SQL Server
Postgresql
Hsqldb
IBM DB2
2.2.1 简单实例
在传统的JSP程序设计中,涉及到数据库的访问大致需要有如下的程序片断:
<%@ page import="java.sql.*" %> <% String connectionURL = "jdbc:mysql://localhost:3306/mydatabase?user=username;password=password"; Connection connection = null; Statement statement = null; ResultSet rs = null; %> <% Class.forName("org.gjt.mm.mysql.Driver").newInstance(); connection = DriverManager.getConnection(connectionURL, "", ""); statement = connection.createStatement(); rs = statement.executeQuery("SELECT address FROM user_tbl WHERE name='username'"); out.println(rs.getString("address")+"
"); rs.close(); %>
在Enhydra中,同样的功能使用DODS后逻辑上就清楚多了,步骤如下:
1 创建一个HTML页面,比如user.html如下:

address is Beijing, China

2 在Enhydra的business层中,创建一个java文件UserFactory.java,如下所示:
package simpleapp.business;import simpleapp.data.*;import java.util.*;import com.lutris.dods.builder.generator.query.*;public class UserFactory { public static String getAddress(String username) { try { UserQuery dquery = new UserQuery(); dquery.setQueryName(usename); UserDO uDO = dquery.getNextDO(); if(uDO != null) return uDO.getAddress(); } catch (Exception e) { e.printStackTrace(); } return null; } }
3 这样就可以在主文件中调用getAddress方法了:
String addr = UserFactory.getAddress("li");
page.setTextAddress(addr);
看起来似乎绕了不少的圈子,但是这是一个真正的3层结构的程序,而且,数据库的设置、管理、连接和缓冲等的功能,DODS都已经为你准备好了,你只要象上面所示的,使用DODS产生的数据库操作类就行了,比如UserQuery等。
2.2.2 DODS的特点
图形化的数据库设计界面。
自动产生数据表操作类和方法。
针对不同的数据库,只需要重新产生相应的类代码,不需要改动表示层(presentation layer)和事务处理层(business layer)的任何代码。
自动维护支持数据库连接缓冲。
自动维护数据表列的序列号(oid)。
Director作为WEB服务器的插件,主要实现了如下功能:
负载均衡 可以使用Director构造Enhydra的集群环境。
访问导向 可以将WEB服务器上的某个虚拟目录影射到某个Enhydra应用程序上,这样对虚拟目录的访问实际上将变为对这个Enhydra应用程序的访问。客观上起到了去掉Enhydra应用程序端口号这个“小尾巴”的作用。
2.4.1 WEB应用程序开发模型简述
WEB应用程序的开发先后经历了以下几种模式:
单层应用程序模型 在这种模型中,WEB应用中的三个重要元素是紧密结合在一起的,彼此混合起来的。早期的WEB应用程序比较简单,从设计到开发都是直线型的,是这种应用模型的必然结果。这种应用模型目前还很容易看到,比如一些简单的聊天室软件,表单处理软件等。
两层应用程序模型 即通常所说的客户/服务器模型。 在这种模型中,从逻辑上看,服务器端通常提供需要进行复杂运算或者大量数据处理的能力,而客户端通常负责发出处理请求并显示服务器传送过来的处理结果。HTTP协议就可以看做是客户/服务器模型的典型。
多层应用程序模型 多为3层应用程序模型。在3层WEB应用程序模型中,一般的层次划分为:表示层、事务逻辑层、数据存取层,彼此相互隔离,可以单独由不同的人或者部门完成。这种模型给应用的设计、开发和维护都带来了很多好处,Enhydra对3层WEB应用程序的开发提供很好的支持。
2.4.2 Enhydra应用程序的3层体系结构
如下图所示:
Figure 3.Enhydra体系结构
Enhydra开发环境不但支持基于3层模式的WEB应用程序开发,而且是作为强烈建议提出的。实际上,Enhydra的核心技术中,XMLC即为Presentation Logic的核心,DODS即为Data Logic的核心。而Enhydra核心中的应用程序管理器,则把Presentation Manager, Session Manager, Database Manager有机的结合起来,构成了Enhydra的应用程序的运行环境。
所谓Enhydra应用程序框架(Enhydra Application Framework)是指Enhydra提供的一系列Java类,这些类提供了Enhydra应用程序运行时需要的支持环境。 也就是说,您的Enhydra应用程序可以而且应当通过这些预先设计的Java类来减轻你的编程工作量和增加应用程序的稳定性,因为这个应用程序框架已经为您实现了很多功能,主要是以下三点:
1 Presentation Manager
Presentation Manager负责处理Enhydra应用程序中presentation object的加载和执行,具体的说,就是把某个URL影射为相应的PO(Presentation Ojbect),并且调用PO的run()方法。这里的PO实质上就是处理相应的URL的Java类,比如处理Login.html文件的PO可以定义为Login.java,在Login.java中验证用户的身份,并将用户引导到相应的页面中去。
每一个Enhydra应用程序都有一个presentation manager的实例。为了提高运行效率,presentation manager会尽量缓存PO及其相关文件(比如图片等)。另外,presentation manager还负责发放(产生)session manager所需要的key,session manager依靠这个key来确定和这个页面(用户)相关的session对象(SessionData)。
每一个Presentation Manager都是类\newline com.lutris.appserver.server.httpPresentation.HttpPresentationManager的一个实例。在包com.lutris.appserver.server.httpPresentation中包含了presentation manager和PO都会用到的一些类和接口。
2 Session Manager
所谓session是指在一段时间范围内,某个用户所保持的状态,比如是否已经登录,已经购买了哪些商品等。当用户初次访问一个Enhydra应用程序时,Session Manager会自动为这个用户产生一个session对象,以保存用户的状态。在应用程序定义的时间间隔内,这个session对象一直存在,直到超过了规定的时间或者用户在规定的时间间隔内没有动作,session manager会自动删除这个用户的session对象。
Enhdydra session manager很灵活。通过创建复杂的session对象,你可以对用户的行为有更多的控制和了解。
3 Database Manager
Enhydra的Database manager提供了控制和优化Enhydra应用程序和数据库的连接,主要是通过以下两点完成的:
使用logical database。实际上是通过JDBC屏蔽了用户在操作不同数据库时的差异。
通过DODS产生的数据库库操作类,Database manager可以进一步控制对特定的数据表是否缓存等来优化数据库的操作。
Multiserver是Enhydra应用程序运行环境管理器。随同Multiserver一起提供的是Admin Console,可以方便的部署Enhydra应用程序,可以动态的加载和停止Enhydra应用程序,可以设置Enhydra应用程序的配制和运行参数,甚至可以通过WEB调试Enhydra应用程序。
回页首
我们从下面的表格中大致可以了解Enhydra和其他厂商的应用服务器在表示层功能上的差别:
Enhydra 3.5WebLogicWebSphereOracle 9i
VoiceXML是 via Voice是
CHTML/iMode设备是部分支持
WML/WAP是是是是
MIDp/J2ME-HTTP是
XML Schema Architechture是  是
XHTML/WAP2/iMode3是
Open-source是
目前大约有40家应用服务器提供商,我们先看一下商业的封闭源代码的应用服务器的特点:
费用高昂 封闭源代码的应用程序服务器都是相当昂贵的,一般都要US$10,000/CPU以上。
紧耦合的实现方式 所有封闭源代码的应用服务器的实现都是紧耦合的,是一个不可分割的整体。这样的坏处是,即使你有更好的关于某一功能的实现,你也没有办法替换原来的旧实现,只能被动等待提供商的升级。
开发和部署的复杂度高 一般封闭源代码的应用服务器都需要专门的培训才能够入门使用,学习和开发部署的难度都比较大。看一看他们昂贵的培训费用就知道了。
专有的编程模式 封闭源代码的应用服务器一般采用专有的,缺乏灵活性的开发模式,必须经过专门培训学习这个专有的编程模式。而且,封闭源代码的应用服务器一般都有历史包袱,这是产生专有结构的重要原因之一。比如著名的应用服务器提供商ATG,他的产品中就遗留了一些老的落后的结构。
隐性的“欺诈” 当你购买Sun的iPlanet的时候,你也许不知道,你同时购买了永远都用不到的一些过时的功能。这是Sun在融合自己的产品NetDynamics和Netscape的Kiva时留下的“后遗症”。
实际有限的技术支持 封闭源代码的应用服务器厂商尽管声称提供完善的技术支持,但是看看网络上BEA的用户的表现吧,随处可见BEA的用户在寻求BEA平台上碰到的开发问题。他们为什么不去寻求BEA的技术支持呢?两个原因:一是他们无法从BEA那里得到及时有效的技术支持;二是BEA的平台不是一个易用的平台。
有限的无线开发支持 很多封闭源代码的应用服务器要有倚赖第三方的软件提供无线开发的支持。
让我们再看看Enhydra是如何解决以上的问题的:
Enhydra 3的可扩展性和灵活性是极佳的。几乎所有的模块都可以根据实际的需要扩展或者替换。
Enhydra在设计时充分考虑到了开发环境的多样性,并且可以配合多种集成的开发环境一起工作,比如JBuilder, Jdeveloper, SunONE Studio等。实际上,Enhydra几乎可以和你熟悉的任何环境一起工作。
Enhydra的培训费用很低。Enhydra的特有(专有)概念很少,你在Enhydra中学到的几乎所有知识都可以用于其他的标准开发环境,反之亦然。
Enhydra3 支持Tomcat 3。2(Servlet 2。2 和 JSP 1。1),Enhdyra应用程序的可移植性非常好。
Enhydra是Open Source的,即使你分销基于Enhydra的应用程序,也不需要支付相对于商业的、封闭源代码的应用服务器那样的昂贵的许可费用。
Enhydra的结构和设计是合理和优美的,来自于实践的总结,没有任何的历史包袱。
Enhydra鼓励使用3层的应用程序设计。但是,如果要写一个简化了的两层,甚至单层的应用程序也同样是支持的,具有很好的灵活性。
你已经拥有了源代码! 这样,可以通过阅读、察看源代码直接解决一些深层次的问题,也可以在调试程序时借助于源代码更快的抓住“臭虫”。
Enhydra支持应用程序的“热”部署,即不需要停止整个Multiserver,就可以任意停止或者启动某个Enhydra应用程序。
Enhydra提供了appwizard可以自动产生标准的应用程序框架,开发人员只需要遵照这个框架扩充以适合自己的需要即可,容易上手。
Enhydra是目前无线应用开发的最佳武器,由XMLC提供了最佳的技术保证和支持。
这大概是最经常被问到的问题了:“Enhydra和WebLogic相比怎样?”。
更好的性能。Enhydra是轻量级的应用服务器。测试标明,Enhydra在吞吐性能、响应时间等多方面是BEA WebLogic的9-15倍之多!
更友好的项目管理。Enhydra的资源文件可以放到单独的目录中,HTML设计人员和Java开发人员可以独立工作,使得项目管理清晰和容易。
更容易配置和部署。BEA WebLogic需要复杂的描述文件和重新编译,而Enhydra只需要一个简单的文本文件即可,不需要重新编译,而且任何程序都可以单独停止和运行,而不会影响其他Enhydra应用程序。
内建的无线开发支持和J2ME支持。Enhydra内建支持HTML,WML(WAP),cHTML(i-mode),XHTML,VoiceXML和J2ME,还有Flash 5 客户端。而WebLogic必须倚赖第三方软件的支持。
更容易使用新技术。Enhydra受益于开放源代码社区,可以很快的采用和接纳最新的技术并纳入到Enhyhdra的体系结构中去。BEA Weblogic做不到这一点。
更低的培训费用。学习Enhydra并不困难,而WebLogic的重点是J2EE的开发,学习和设计的难度大大增加,培训的费用也很高。
Enhydra XMLC。XMLC是Enhydra的灵魂和核心,是领先的表示技术的代表。而WebLogic没有这种领先的技术。
回页首
从上面和商业的应用服务器的比较中我们也可以看出Enhydra的优势来,下面简单总结一下:
得益于开放源代码策略,受惠于开放源代码社区。Enhydra自从开放源代码后,发生了很大的变化,比如率先支持了无线开发,修正了若干的Bug,而且在Lutris公司内部发生了巨大的变化时产生了接手Enhydra项目的合适团队。
灵活的可扩展性。由于是开放源代码的系统,其中的每一个模块你都可以只有替换和扩展。Enhydra 6.0的目标就是彻底拆开enhydra.jar,使Enhydra只保留一个核心包,其他的工具包均可以单独置换。
最好的无线开发支持。
低的总拥有成本。Enhydra Public Licence允许你开发基于Enhydra的应用,甚至在Enhyra基础上构造自己的应用服务器而不需要支付昂贵的许可费用,因而显著降低了开发商的总拥有成本。
丰富的文档资料。Enhydra提供了非常好的“Getting Started with Enhydra”等文档资料,并且邮件列表本身也是Enhydra的宝库之一。
源代码!
回页首
应该说,虽然相对于掌握WebLogic而言,Enhydra的学习难度大为降低,但是熟练掌握Enhydra也不是非常容易的事情,尤其是对于没有很多的WEB开发概念和经验的开发者更是这样,所以Enhydra的初始学习曲线仍然有些陡峭。但是,只要理解了Enhydra应用程序的基本结构和熟悉了Enhydra提供的API函数,则使用Enhdyra开发WEB应用就变成了一种享受和必然!
目前Enhydra仍然使用Tomcat 3.2,将来的Enydyra6.0将实现Enhyra体系结构的完全松耦合,使得模块的独立性更强,可以随时更新Tomcat的版本以及其他相关模块。
EPL的限制简单说就是:
如果你改动了Enhydra的核心,则必须将改动的情况汇报Enhydra.org,以使得Enhydra日趋完善。
你可以任意使用Enhydra的所有专有技术(比如XMLC),只要是和Enhydra应用服务器一起使用即可。实际上,这条限制已经形同虚设,因为象XMLC等Enhdyra的专有技术现在大都已经独立出来了,意味着XMLC等可以独立使用,不受Enhydra本身的限制。
可以看出,EPL实际上还是相当宽松的。
回页首
非常遗憾的是,由于各种原因,Enhydra的发明者Lutris公司不得不于去年底宣布放弃Enhdyra的继续开发,专注于Enhydra Enterprise的开发和销售和技术支持。然而,似乎Lutris并没有取得预期的业绩,经营上出现了一些困难。
然而, Enhydra并没有就此止步! ObjectWeb(www.objectweb.org)接过了enhydra.org站点,法国电信无偿提供了T1级别的线路链接和服务器,@Together公司接过了Enhydra的继续开发,Enhydra继续前进中......
目前,Enhydra已经推出Enhydra 5.0,新特性如下:
融合Tomcat 4.0和大量的补丁。
对原来的enhydra.jar进行了分拆,使得各个模块可以独立撤换。
加强了的session管理。
加强了DODS对数据库的支持能力。
采用了最新的xmlc。
更全面的文档。
Enhydra作为开发动态网站和电子商务的利器,已经得到了广泛的应用。这里有一个列表,列出了一些使用enhydra技术构建的站点: http://enhydra.enhydra.org/community/caseStudies/index.html。
回页首
我们有理由相信,Enhydra在开放源代码社区的帮助下,在良好的架构设计基础上,会随着IT技术的发展而进步。让我们展望一下Enhydra的未来吧:
实际上,Lutris公司已经实现了Enhydra和J2EE的融合,但是由于Lutris公司的现状,使得这项工作可能不得不重新开始。可以这样设想,在Enhydra的3层架构基础上,借助于XMLC和DODS,再融合一个开放源代码的J2EE服务器,比如JBoss(版权为LGPL),应该可以构造一个极且竞争力的J2EE应用服务器产品。我相信,这是一个非常有前途的产品方向,只是融合的技术难度也是比较大的。
Web Service是分布式应用的未来,如何将Web Service和Enhydra有机地结合在一起,是一个富有挑战性的课题。如果Web Service能够融入Enhydra之中,或者如果说Enhydra也可以作为Web Service的容器,则Enhydra的应用开发领域将更加广泛,开发思路将更加开阔。
目前Enhydra在Kelp(kelp.enhydra.org)的帮助下,已经可以配合JBuilder,JDeveloper,SunONE Studio等IDE环境进行开发工作,这固然是个不错的策略,但是在以下方面还有欠缺:
appwizard还有很大的改进余地。
DODS将来的版本可以生成business layer的模板代码。
对eclipse的支持正在开发中。
前面我们讲过,Enhydra 6.0将演变为Enhydra Application Framework,使得Enhydra的模块间的耦合度更低,这样更换某个模块将更加方便,系统的灵活性将得到更大的提高,对于Enhydra的继续发展也是非常有利的。
Enhydra从实践中来,经过了4年实践的检验,经过3年开放源代码社区的培育,已经成熟了,长大为业界领先的应用服务器,已经形成了自己的风格和稳定的用户群,得到了广大用户的支持和爱戴,相信不管IT风云如何变幻,Enhydra将乘风破浪,直挂云帆济沧海!
回页首
Enhydra作为优秀的、一流的、开放源代码的应用服务器,自然给我们带来了无限的商机,关键是如何把握机会:
Enhydra具有设计良好的架构,规范的代码文档,对于系统开发商而言,是一个非常好的参照系统。这里有两方面的含义:
站在“Enhydra的肩膀上”,开发你自己的应用服务器。应用服务器被誉为“Internet上的操作系统”,可见其重要性和商机所在。前面所说的融合Enhydra和JBoss等,也有这方面的意思。作为系统开发商,Enhydra正好提供了一个合适的和高的起点。当然,在开发过程中要遵守Enhydra的版权协议EPL。
开发基于Enhydra的各种解决方案。Enhydra本身的特点决定了Enhydra在这个领域是大有作为的。
Enhydra天然支持3层WEB应用程序开发,这对于开发大型的WEB应用非常有利,有利于系统设计和团队的合作,也有利于较好的控制开发进度和开发质量,有利于提高项目开发成功的概率。
回页首
Enhydra作为领先的开放源代码的应用服务器和应用程序框架,其前途是光明的,感谢Lutris公司开发人员的卓越设计和对开放源代码社区的贡献!
实际上,Lutris公司的初创者和开放源代码社区原本就有很深的渊源,一直保持着和开放源代码社区良好的合作关系。相信在开放源代码社区的呵护下,在开放源代码社区无处不在的仁人志士的帮助下,Enhydra将继续保持业界领先地位!
让我们拭目以待。
Participate in the discussion forumon this article by clicking Discuss at the top or bottom of the article.
http://www.enhydra.org ,Enhydra的老家
http://www.webdocwf.org,@Together接手Enhydra后创建的Enhydra的新家
JSP 技术 - 是友还是敌?关于jsp技术的精彩剖析和论述。
Enhydra FAQ 
The Enhydra Competitive White Paper, David H. Young
A Friendly Game of Tug of War: XMLC vs. JSP, David H. Young
共创软件杂志创刊号,走近Enhydra , 周冰梅
共创软件杂志创刊号,Enhydra体系结构及开发 , 宿宝臣
作者一直致力于Java在WEB开发领域的研究,尤其对Enhydra,JBoss,Eclipse非常有兴趣,您可以通过 linuxman@263.net和作者联系,欢迎批评指正!