用于创建和提供多层联网服务的方法和系统的制作方法

文档序号:1357745阅读:452来源:国知局

专利名称::用于创建和提供多层联网服务的方法和系统的制作方法
技术领域
:本发明涉及一种用于创建和提供多层联网服务的方法和系统。
背景技术
:基于客户应用程序的用于传递联网服务的互联网或者网络一般具有两个主要组件。第一个是客户应用程序的“查看和感知(lookandfeel)”组件。第二个组件是客户应用程序的功能性。“查看和感知”通常是具有准备和创建应用程序的表示元素的必要能力的网络设计者的权限。通常由创建、执行、和汇编客户应用程序的功能元素的网络开发者来管理客户应用程序的功能性。客户应用程序的表示和功能元素通常合并在相同的应用文件中,这样的结果就是设计者和开发者在相同的文件上工作。使用这种方法存在几个潜在的缺点。例如,如果客户应用程序的任意元素(表示或功能)改变,则整个客户应用程序客户将不得不重新编译。同样,可能还存在涉及版本控制(versioncontrol)、工作复制、和客户应用程序可扩展性的潜在问题。Java和JavaServerPage的出现解决了一部分这些问题。与JavaBeans或者企业版JavaBeans结合的JavaServerPage允许许多客户应用程序的功能元素与表示元素分离,从而当将JavaServerPage的表示元素释放给网络设计者时,允许开发者创建并修改功能单元(例如,JavaBeans)。然而,这种方法仍然存在许多与传统客户应用程序相同的缺点。如果表示或功能元素改变,则可能需要修正并可能重新创建JavaServerPage。因为JavaServerPage仍然包括功能和表示元素,因此也遗留了版本控制和工作复制的潜在问题。本发明的目的在于提供一种多层应用程序,以至少消除或减轻一部分上述缺点。
发明内容客户应用程序的表示和功能元素通常合并在相同的应用文件中,这样的结果就是设计者和开发者在相同的文件上工作。使用这种方法存在几个潜在的缺点。例如,如果客户应用程序的任意元素(表示或功能)改变,则整个客户应用程序客户将不得不重新编译。同样,还存在可能涉及版本控制、工作复制、和客户应用程序可扩展性的潜在问题。与现有客户应用程序相反,提供与用户界面(例如,PC或PDA上的浏览器)相互作用的多层应用程序。应用程序包括表示层(presentationtier)(例如,具有JSP/Servlet引擎的网络服务器)以及业务逻辑层(businesslogictier)(例如,应用程序服务器),以在用户界面上处理用于后续表示的数据。引导模块具有多个互联的方向,包括功能方向用于引导相应的功能组件,以使用业务逻辑层执行数据处理功能并提供数据处理输出;以及表示方向,用于引导相应的表示组件,以当数据处理输出可应用时将其结合到表示模板(template),以生成用于用户界面的表示元素。功能组件和表示组件彼此独立并且分离,功能组件的连接产生数据,并且表示组件使用输出数据。表示组件是普通种类表示元素的抽象表现,具有其布局和格式(例如,置标语言)的每个特定的表示元素存储在不同表示模板中,并且可以在操作时间内在表示层上确定对用于表示组件的特定表示模板的引用。根据本发明,提供一种用于托管在网络上与用户界面相互作用的计算机可执行多层应用程序的方法,该应用程序包括应用程序表示层。该方法包括以下步骤选择第一表示模板,第一模板包括用于定义相应的第一表示元素的第一表示指令;选择用于处理第一表示指令的应用程序表示层的第一表示组件;以及将第一表示组件连接到第一模板,其中在执行用于随后传递到用户界面的多层应用程序时,第一组件处理第一表示指令并生成第一表示元素。该方法包括如下附加步骤选择包括用于定义相应的第二表示元素的第二表示指令的第二表示模板;选择用于处理第二表示指令的第一表示组件;以及将第一组件连接到第二模板;其中在执行用于随后传递到用户界面的多层应用程序时,第一组件处理第二表示指令并生成第二表示元素。在优选实施例中,表示模板是文件系统的计算机可读文件,并且从包括第一表示元素的布局、字体、以及格式的组中选择表示指令。在另一实施例中,将表示指令写入从包括HTML、HDML、和WML的组中选择的置标语言中。第一表示组件是计算机可执行文件。在优选实施例中,计算机可执行文件是JavaBean。该方法还可以包括应用程序逻辑层,并且附加步骤如下选择输入数据;选择用于处理输入数据的应用程序逻辑层的第一功能组件;将输入数据连接到第一功能组件,其中在执行多层应用程序时,第一功能组件处理输入数据并生成输出数据;引导第一表示组件,以处理用于进一步将对应第一表示元素定义为包括输出数据的输出数据表示指令,其中在执行多层应用程序时,第一表示组件处理输出数据表示指令并生成结合输出数据的第一表示元素。第一功能组件是计算机可执行文件。在优选实施例中,计算机可执行文件是JavaBean。本发明还提供一种用于托管在互联网上与用户界面相互作用的计算机可执行多层应用程序的系统,应用程序包括应用程序表示层。该系统包括第一表示模板,第一模板包括用于定义相应的第一表示元素的第一表示指令;应用程序表示层的第一表示组件,用于处理第一表示指令;以及第一引方向元素,用于将第一表示组件连接到第一模板,其中,在执行用于随后传递到用户界面的多层应用程序时,第一组件处理第一表示指令并生成第一表示元素。该系统还可以包括第二表示模板,第二模板包括用于定义相应的第二表示元素的第二表示指令,以及第二方向元素,用于将第一组件连接到第二模板,其中,在执行用于随后传递到用户界面的多层式应用程序时,第一组件处理第二表示指令并生成第二表示元素。该系统还可以包括用于处理输入数据的应用程序逻辑层的第一功能组件;以及第一方向元素,进一步将输入数据连接到第一功能组件,其中,在执行多层应用程序时,第一功能组件处理输入数据并生成输出数据。输出数据表示指令进一步将对应第一表示元素定义为包括输出数据。通过以下参考附图的详细描述,本发明优选实施例的这些和其他特点将变得显而易见,其中图1是根据本发明实施例的系统的示意图;图2是图1的系统的扩展示意图;图3是根据本发明实施例在处理请求的资源步骤中的示意图;图4是根据本发明实施例在多层应用程序的每一层内的元素的示意图;图5是图1系统的替换实施例的示意图;图6(a)是JavaServerPage的示意图;图6(b)是根据本发明实施例的JavaServerPage的示意图;图7是根据本发明实施例的功能组件的逻辑图;图8(a)是根据本发明实施例的静态表示组件的示意图;图8(b)是根据本发明实施例的动态表示组件的示意图;图9是根据本发明实施例的处理JavaServerPage的输出的示意图;图10是根据本发明实施例的使用JavaServerPage的客户应用程序的逻辑图;图11是根据本发明的客户应用程序的处理步骤的逻辑图;图12是根据本发明实施例的客户应用程序的处理步骤的输出的示意图;图13是根据本发明实施例示出的客户应用程序的系统和处理输出的扩展示意图;图14是根据本发明实施例的客户应用程序元素和对应系统的示意图;图15是示出根据本发明实施例的方法中步骤的流程图;图16是示出根据本发明实施例的图15中的方法进一步步骤的流程图;图17是示出根据本发明实施例的图15中的方法的替换的进一步步骤的流程图;以及图18是示出根据本发明实施例的图17中的方法的进一步步骤的流程图。具体实施例方式参考图1,示出系统10的示意图。系统10是本领域技术人员熟知的计算网络。操作网络终端11的个体可以通过通信网络13访问远程定位的资源。通信网络13可以是互联网、环球网(WorldWideWeb)、LAN、WAN、VPN。网络终端11可以是本领域技术人员所知的任意网络设备,其包括通过通信网络13与远程定位的资源进行通信的装置以及传输请求的装置,包括个人电脑、笔记本电脑、掌上电脑、手持设备、和无线文本传呼蜂窝式电话等。远程定位的资源可以是位于网络服务器15上的网页,或位于数据库17中的数据,通过连接到网络服务器15(或与网络服务器15进行通信)的应用程序服务器19(通过数据库服务器119)访问该资源。可选地,可以不需要网络服务器15,直接通过通信网络13访问应用程序服务器19和关联的数据库17。例如,如果个人计算机包括用于通过网络13(例如,调制解调器)进行通信的装置和用于向资源主机发送资源请求的可执行软件,则操作个人计算机(即,终端11)的个体可以通过因特网(即,通信网络13)访问远程定位的资源。远程定位的资源可以象静态HTML文档一样简单。可选地,请求的资源可包括大量服务的一小部分,例如完成要求产生特别对给定的用户当前对话期的几个响应的在线事项。包括在这些事项中的数据是动态而不是静态的,即,它们响应于用户的特定请求而生成。请求数据可以存放在数据库17中,由应用程序服务器19通过数据库服务器119访问。用户可以简单地请求原始数据,或者可以处理数据并将处理结果结合以响应用户的请求。存在几种可以处理请求数据和/或将数据结合在响应中的方法。参考图2,系统10的扩展示意图示出一种可以使用Java网络服务器(JavaWebServer)和Java服务器页(JavaServerPage)(JSP)技术处理请求的方法。网络服务器15包括Java服务器页引擎21和小服务程序引擎23,它们一起处理请求的资源(即,JSP25)并生成返回到终端11的响应。图3示意性示出请求的资源25和生成的响应,数据输出27的扩展视图。操作终端11的用户通过通信网络13请求远程定位的资源(Java服务器页25)。运行JSP引擎21的网络服务器15接收资源请求并恢复请求的Java服务器页25,读取它并将JSP元素翻译成Java代码29(.Java)。然后,使用本领域技术人员熟知的标准编译器将Java代码译文29编译到Java小服务程序31(.class)中。接下来,使用标准API(例如,小服务程序引擎23)执行小服务程序31。当小服务程序运行时,它处理输入数据33并生成数据输出27,即,它处理请求并生成响应。然后,通过网络13将输出27引导至终端11。参考图4和图13,根据本发明的优选实施例示出用于托管在网络上与用户界面11上与关联的元素相互作用的计算机可执行多层应用程序191的系统,该应用程序包括应用程序表示层171和应用程序逻辑层181。该系统包括第一表示模板65,第一模板包括用于定义对应第一表示元素或输出79的第一表示指令;应用程序表示层171的第一表示组件161,用于处理第一表示指令;以及第一方向元素61,用于将第一表示组件161连接到第一模板65,其中,在执行用于随后传递到用户界面11的多层应用程序时,第一组件161处理第一表示指令并生成第一表示元素。在优选实施例中,该系统包括第二表示模板67,第二模板67包括用于定义相应的第二表示元素或输出79的第二表示指令;以及第二方向元素,用于将第一表示组件161连接到第二模板67,其中,在执行用于随后传递到用户界面11的多层应用程序时,第一组件161处理第二表示指令并生成第二表示元素或输出79。在又一实施例中,该系统包括应用程序逻辑层181的第一功能组件59,用于处理输入数据33;以及第一方向元素,进一步将输入数据33连接到第一功能组件59,其中,在执行多层应用程序时,第一功能组件处理输入数据33并生成输出数据27。输出数据表示指令进一步将相应的第一表示元素或输出定义为包括输出数据27。参考图4和图15,根据本发明的优选实施例示出用于托管在互联网上与用户界面相互作用的计算机可执行多层应用程序191的方法的流程图,其中,应用程序191包括应用程序表示层171。该方法包括以下步骤选择第一表示模板65,第一模板65包括用于定义相应的第一表示元素的第一表示指令(步骤100);选择用于处理第一表示指令的应用程序表示层171的第一表示组件161(步骤200);以及将第一表示组件连接到第一模板65(步骤300),其中,在执行用于随后传递到用户界面的多层应用程序时,第一组件161处理第一表示指令并生成第一表示元素或输出79。参考图4和图16,示出图15的方法附加步骤的流程图。步骤还包括选择第二表示模版67,第二表示模版包括用于定义相应的第二表示元素或输出79的第二表示指令(步骤101);选择用于处理第二表示指令的第一表示组件161(步骤201);以及将第一组件161连接到第二模板67(步骤301),其中,在执行用于随后传递到用户界面的多层应用程序191时,第一组件161处理第二表示指令并生成第二表示元素或输出79。在优选实施例中,表示模板65、67是文件系统的计算机可读文件,以及表示指令是例如但不限于第一表示元素的布局、字体、以及格式。在另一实施例中,表示指令写入从包括例如但不限于HTML、HDML、和WML的组中选择的置标语言中。第一表示组件161是计算机可执行文件。在优选实施例中,计算机可执行文件是JavaBean。第一表示组件161通过方向元素57连接到第一表示模板65。引导组元素57指定第一表示模板65的位置并将第一表示组件161引导至指定位置。在优选实施例中,方向元素57是例如但不限于页面标签、控制标签、属性标签、制作页面标签、清零标签、和消息拦截标签的第一表示组件标签57。将第一表示组件标签57作为执行多层应用程序的方向模块的指令来表示。在优选实施例中,方向模块是Java服务器页49。参考图4和图17,示出图15的方法附加步骤的流程图,其中,多层应用程序191还包括应用程序逻辑层181。步骤还包括选择输入数据33(步骤102);选择用于处理输入数据33的应用程序逻辑层181的第一功能组件59(步骤202);将输入数据33连接到第一功能组件59(步骤302),其中,在执行多层应用程序191时,第一功能组件59处理输入数据33并生成输出数据27。参考图4和图18,示出图17的方法附加步骤的流程图,其中,第一模板还包括用于进一步将相应的第一表示元素定义为包括输出数据27的输出数据表示指令。该方法包括以下附加步骤引导第一表示组件161,以处理输出数据表示指令(步骤403),其中,在执行多层应用程序191时,第一表示组件161处理输出数据表示指令并生成结合了输出数据33的第一表示元素或输出79。在优选实施例中,输出数据表示指令定义控件,其中,显示例如但不限于文本字段、密码字段、隐含字段、文本区、表格、列表框、复选框、单选按钮、图像、按钮、图像按钮、提交按钮、复位按钮、链路、和取值范围的输出数据。第一功能组件59是计算机可执行文件。在优选实施例中,计算机可执行文件是JavaBean。第一功能组件59通过方向元素55连接到输入数据33。方向元素55指出输入数据33的位置并将第一功能组件引导至指定位置。在优选实施例中,方向元素55是例如但不限于初始化标签、调用标签、前提标签、调试标签、错误标签、赋值标签、条件标签的第一功能组件标签55。在优选实施例中,将第一功能组件标签55表示为方向模块的指令,放下模块执行多层应用程序。方向模块是Java服务器页49。参考图5,示意性地示出系统100的另一替换实施例作为应用程序服务器小服务程序系统200。JSP引擎21位于应用程序服务器19上。在Java服务器页25的翻译、编译、和执行中,小服务程序引擎23与JSP引擎21合作。在系统200中的远程定位的资源可以包括位于本地数据库17上的数据,其可以由应用程序服务器19通过数据库服务器119直接访问并由小服务程序31处理。在这种情况下的输出通过其他机构(例如,电子邮件)返回给用户。参考图6(a),示出本领域技术人员熟知的Java服务器页JSP39的示意图。JSP39是包括静态模板数据(可以由基于例如HTML、WML、和XML格式的任意文本的来表示)和JSP元素(通过JSP引擎21解释)的文本文档。通过使用置标(ML)语句43写入JSP39的这些部分以创建定义处理的输出的查看和感知的静态内容。例如,如果选择HTML作为ML,则使用HTML语句和语法编写JSP的模板部分。通过访问Java编程语言对象属性创建动态内容。JSP39的动态元素通常包括JSP指令41,将信息传递到JSP引擎21;JSP标签45,可以以用于例如初始化服务器上的JavaBean的标准标签或者自定义标签来实现;以及脚本小程序47,其是执行标签不支持的功能的Java代码的小脚本。JSP指令41可以包括page_directives(传达页面的特定信息,例如,缓冲器和线程信息或错误操作)、language_directives(指定JSP脚本语言)、include_directives(可以用于包括页面中的外部文档)、以及taglib_directives(指出页面可以调用的自定义标签库)。JSP标签45负责执行大部分的JSP处理。这包括许多标准标签(例如,useBean,setProperty,和getProperty)。也可以为了特定目的来设计和执行自定义标签。参考图6(b),示出根据本发明优选实施例的JSP49。在本发明的优选实施例中,JSP49不包括任意置标语言(ML)语句43,也不包括Java脚本小程序47。分别将全部操作或者JSP49的功能和表示元素保存为离散的功能组件和表示组件。通过各个自定义功能组件标签扩展55和表示组件标签扩展57访问组件59和61,分别使用功能组件taglib_directive51和表示组件taglib_directive53依次指定自定义功能组件标签扩展55和表示组件标签扩展57。因此,在小服务程序客户应用程序的结构中,根据本发明汇编的Java服务器页49只包括JSP指令和自定义标签扩展55和57。JSP指令JSP49指令为以下格式<%@directiveNameattribute=“value”%>其中directiveName是指定指令名称attribute是该指定指令的属性一个指令可以具有0个或多个属性。Value是用于指定属性的特定值一个属性可以恰好具有一个值。JSP49页面指令在优选的实施例中,所有JSP处理页49均以下述页面指令开始<%@pagesession=“true”buffer=“buffersizekb”autoFlush=“true”1isThreadSafe=“true”errorPage=“…/errorPage.jsp”%>其中…/errorPage.jsp是如果处于未获取的运行时间异常,则将调用另一JSP页的URL如果是错误JSP页,则随后的属性将包括在页面指令isErrorPage=“true”中。JSP49taglib指令taglib指令指定自定义标签扩展。下列标签库指令是在所有JSP处理页49中(权限在page指令之后)指定的<%@tagliburi=“/servlet/FCTagsClient.jar”prefix=“FC”%><%@tagliburi=“/servlet/PCTagsClient.jar”prefix=“PC”%>JSP49include指令包括指令可以用于插入、内嵌其他JSP处理页49的内容<%@includefile=“…/otherPage.jsp”%>其中…/otherPage.jsp是将包括的另一JSP页的路径功能组件(FC)参考图7,示出功能组件59的逻辑图。功能组件59是业务功能性清晰、独立的部分。每个功能组件59接收一组前提数据33,使用接收的数据33执行处理功能,并且返回一组结果数据27。在优选的实施例中,每个功能组件59作为基于一般基类(genericbaseclass)的Java类存在。当客户应用程序请求功能组件59时,使用基于功能组件59的逻辑名称的Java反射简单地初始化。功能组件59符合JavaBean的规范。公共抽象类FC(PublicAbstractClassFC)是用于所有功能组件59的一般定义。所有指定功能组件59类均扩展这一基类。该抽象类提供通过所有功能组件59类继承的一组内置功能性,并且定义必须在功能组件59类自身中明确执行的一组功能性。公共类{ApplicationCategory}{Function}通过扩展功能组件59类的指定类,进一步定义任意给定的功能组件59。在优选实施例中,用于特定功能组件59类的命名规范是{ApplicationCategory}{Function},其中●{ApplicationCategory}是指出功能组件59所属应用程序范畴(例如,用于Net*Order应用程序类型的Order、用于Net*Track应用程序类型的Track、或用于General应用程序类型的General)的简易格式。●{Function}是表示该特定功能组件59功能的简短但描述的短语(例如,用于实际上执行类型的搜索并返回一系列结果的功能组件59的PerformProductSearch)。功能组件实例利用功能组件59实例名初始化功能组件59,使得可以唯一地命名多个实例。在优选实施例中,功能组件59实例名是{ApplicationCategory}{Function}_{InstanceDescription}其中{InstanceDescription}是用于功能组件59的该特定实例的简短描述引用,例如,OrderPerformProductSearch_OrderEntry公共方法setInstanceDescription()该方法用于设置对功能组件59的实例描述。通常在初始化功能组件59之后立即调用该方法。公共方法getInstanceDescription()该方法返回对功能组件59的实例描述。公共方法getInstanceName()该方法返回对功能组件59的实例名称。前提数据33和返回的结果数据27在优选实施例中,将全部的前提数据33和返回的结果数据27储存为实例变量。实例变量的名称是前提数据元素本身的名称。此外,这是用于每个使用相同命名规范的这些实例变量中的设置和得到方法。允许通过使用Java反射外部地引用前提数据33。例如,如果功能组件59具有称为userID的前提数据组件33,则存在使用名为setUserID()的公共方法外部地设置名为setUserID的实例变量。在同样是返回的结果数据27元素的情况下,则使用公共方法setUserID()返回数据27。在返回的结果数据元素的情况下,存在公共得到方法。保护方法validate()在实际执行功能组件59的任意处理逻辑之前,在execut()方法中调用validate()方法。如果存在任意遗漏或不正确地设置前提数据33,则返回FC_EXCEPTION_PrerequisiteDataFCException异常。公共方法execute()execute()方法提供功能组件59的内部处理逻辑。在执行任意指定处理之前,证实所有的前提数据33。当产生返回结果数据27时,它被存储到各个实例变量中。如果在执行处理逻辑的时候产生错误,则返回适当的FCException异常。公共类FCException该类表示在前提数据33的证实期间或者功能组件59的处理逻辑执行期间产生的错误。公共FC_EXCEPTION_PrequisiteData该异常表示前提数据33不符合由功能组件59定义(definition)定义的要求。通常由对功能组件59的特定调用中的错误产生这种异常。公共FC_EXCEPTION_FCInternal该异常表示在功能组件59的内部处理逻辑期间的意外错误。通常由在功能组件59逻辑自身内的错误产生这种异常。公共FC_EXCEPTION_ServerInternal该异常表示在涉及调用服务器的功能组件59的内部处理逻辑期间的意外错误。通常由在功能组件59逻辑自身内或者服务器逻辑内的错误产生这种异常。公共FC_EXCEPTION_Exception该异常表示尝试返回无效功能组件异常。FCException自身可以只返回该异常。由在功能组件59逻辑自身内的错误产生这种异常。公开FC_EXCEPTION_Assertion此异常表示断言失败。其他异常功能组件59自身可以通过在构造功能组件异常时指定其自身异常标识码来定义其自身的功能组件异常。由功能组件59定义异常的具体含义。公共方法getExceptionID()该方法返回异常的标识符。公共方法getFailureReason()该方法返回故障原因。公共方法toString()该方法返回异常的可打印版本。功能组件(FC)标签扩展使用一组功能组件标签扩展55调用功能组件59。Functioncomponentinit标签该标签初始化用于功能组件59处理的页面。在优选实施例中,该标签是用于功能组件自定义标签55的每一页面上的第一功能组件自定义标签。该标签具有如下格式[<functioncomponentinitclasspath=“classpath”scope=“scope”/>]其中classpath是初始化功能组件59时用于搜索的类途径。scope是用于在JSP49上初始化的功能组件59的存储的缺省作用域。该作用域可以是下列值的任意一个应用程序、对话、或请求。如果没有指定该作用域,则缺省作用域为session。例如,sessionclasspath属性和scope属性是可选的。functionComponentcall标签该标签55定义将调用特定功能组件59。该标签具有如下格式<functionComponentcallname=“functionComponentInstanceName”debugLevel=“debugLevel”>dontResetAllData=“yes”scope=“scope”conditionalExecution=“true”>functionComponent-body</functionComponentcall>其中functionComponentInstanceName是用于调用的功能组件59实例。如果在当前执行的功能中已经调用该功能组件59实例,则重用该功能组件59的实例。此外,创建该功能组件59实例。例如,OrderGet_OrderEntrydebugLevel是用于该指定功能组件59调用的调试等级,指定为高、中、或低。dontResetAllData表示将不调用功能组件59的resetAllData()方法。通常总是在设置用于该功能组件调用的任意前提数据33之前将调用功能组件59的resetAllData()方法。resetAllData()方法可以与简单地使用全部前提数据33上的空属性产生不同的效果。对于数值,使用空属性将这些值设置成0,然而resetAllData()方法实际上可以使得这些值被设置为一些除0之外的缺省值。功能组件59定义resetAllData()方法的特定状态。当功能组件59具有多个可选的前提数据33元素,并且功能组件59在对话中使用一次以上时,期望在随后的调用中重设全部前提数据33。然而,可以是不期望状态的情况。可以使用dontResetAllData属性覆盖这些状态。scope是用于存储该功能组件59的作用域(覆盖用于在functionComponentinit标签中定义的页面的设置)。作用域可以为下列值中的任意一个功能、对话、或请求。如果没有指定,则通过functionComponentinit标签定义作用域。例如,sessionconditionalExecution=“true”该属性表示根据当前具有true值的封闭functionComponentif标签有条件地执行标签55。在请求时,该标签55具有包括functionComponentprerequisite和functionComponenterror标签的主体。只有name属性是强制的。通过dataReference规范可访问返回的结果数据27。functionComponentprerequisite标签该标签55定义用于功能组件59的一个前提数据元素33。该标签55必须定义在functionComponentcall标签的主体之内。该标签55具有如下格式<functionComponentprerequisitetarget=“prerequisiteDataReference”value=“literalValue”source=“dataReference”optsource=“dataReference”empty=“booleanValue”/>其中prerequisiteDataReference是功能组件59的前提数据元素33的简名或者是对功能组件的前提数据元素的数据元素的引用。在优选实施例中,前提数据引用以对功能组件59的前提数据元素33的引用开始。如果标签只是前提数据元素33本身,则引用只是数据元素的名称(例如,ordered)。如果前提数据元素33是结构体,则引用是数据元素结构的名称、点(‘.’)、和结构的元素名称。(如果元素是结构体本身,则它也可以被进一步定义。)(例如,userAttributes.firstName)。literalValue是硬编码的文字值。dataReference是对动态数据的引用,对动态数据的引用与定义用于控制标签的数据引用值使用相同的规范。booleanValue是true或false。在优选实施例中,所有属性是强制的,除非指定value、source、optSource、或empty中唯一的一个。如果指定optSource,则dataReference可以是不存在的数据引用。如果指定empty=“true”,则将适当的值传给设置方法。对于string属性,则传输空串(即,“”)。对于numeric属性,则传输零(即,“0”)。对于object属性,则传输空值(即,null)。funetionComponentdebug标签该标签55定义各种有助于调试JSP页的调试信息。在优选实施例中,标签55具有如下格式<functionComponentdebugdebugLevel=“debugLevel”debugFile=“debugFile”value=“literalValue”source=“dataReference”/>其中debugLevel是用于全部功能组件59的缺省调试等级,指定为高、中、或低。debugFile是到将用于调试输出的文件的路径。(在优选实施例中,第一次遇到调试文件规范,打开该文件用于追加。忽略所有后序的调试文件事件。如果没有指定调试文件,则调试输出转到System.out流)literalValue是硬编码的文字值。dataReference是对动态数据的引用,对动态数据的引用与定义对控制权标签的数据引用值使用相同的规范。所有的属性都是可选的,然而,可以只能指定一个value或source。优先顺序由随后的值规定。functionComponenterror标签该标签定义用于对功能组件59的一种类型错误的处理。该标签必须定义在functionComponentcall标签主体内。该标签具有以下格式<functionComponenterrorname=“errorDescriptor”page=“…/errorPage.jsp”/>其中errorDescriptor是识别特定功能组件异常的串,例如,PasswordMismatch。功能组件59本身定义指定功能组件异常的含义。“*”的特定值表示任意异常(即,缺省异常处理程序)。…/errorPage.jsp是如果发生特定的运行时间错误,则将调用的另一个JSP页49的URL。在错误页面内的脚本变量functionComponentException中出现异常。如果将错误页面指定为特定值“ignore”,则忽略异常。错误页面可以是特定值或数据引用。对动态数据的引用使用与定义对控制标签的数据引用值相同的规范。在优选实施例中,所有属性是强制的。functionComponentgetValue标签该标签用于设置具有功能组件的返回结果数据元素值的脚本变量。该标签具有以下格式<functionComponentgetValuesource=“dataReference”optSource=“dataReference”/>其中DataReference是对动态数据的引用。对动态数据的引用与定义对控制标签的数据引用值使用相同的规范。在优选实施例中,所有属性是强制的,除了可指定source和optSource中唯一的一个。如果指定optSource,则dataReference可以是不存在的数据引用。将脚本变量resultValue设置成具有指定返回结果数据元素的值。functionComponentif标签该标签用于条件地执行其他标签调用并条件地生成ML输出。该标签具有以下格式<functionComponentif>conditional-functionComponent-body</functionComponentif>该标签作为IF-THEN块。如果在块的末端functionComponentif块的值是ture,则只包括由在该块内的标签中生成的ML输出。在块的开始,将块的值初始化为false。通过调用下述Java方法设置块的值functionComponentIfTag.setIfValue<PageContextpageContext,BooleanifValue>通常从通过在functionComponentif标签的块内的functionComponentcall标签调用功能组件的execute()方法中调用setIfValue()方法。可以在相同的块内多次调用setIfValue()方法。然而,最后一次调用确定用于块的最终设置,用于判断在块内产生的ML输出是否应该包括在生成的输出页面内。此外,可以条件地执行functionComponentif块内的各种标签。如果标签包括属性conditionalExecute=“true”,则该标签只在functionComponentif块的当前值为true的时候执行。随后的标签55支持conditionalExecute属性functionComponentcall、presentationcontrol、presentationproducePage。在请求的时候可以将conditionalExecute属性添加到其他标签中。可以使用conditionalExecute属性构建用于functionComponentif块的逻辑“AND”条件。假设称为“SelfValueFunctionComponent”的功能组件59获得前提数据33并确定是否调用functionComponentIfTag.setIfValue()方法。可以在functionComponentif块的开始使用functionComponentcall标签调用该功能组件两次。在第二个functionComponentcall上,其包括conditionalExecute属性。这样有效地使得functionComponentif块的值成为第一SelfValueFunctionComponent调用的值与第二SelfValueFunctionComponent调用的值取“AND”。表示模板(PT)参考图8(a)、图8(b)、和图9,根据本发明优选实施例示意性地示出显示模板(PT)61。一组PT61文件定义客户应用程序的“查看和感知”,每个PT61包括定义表示元素的模板、或用于客户应用程序的输出页面79、或一部分输出页面79的一系列ML语句。用于客户应用程序的PT61文件组具有特定的语言(例如,法语、英语)或格式(例如,THML、HDML)。在优选实施例中,PT61文件采用两种格式中的一种。参考图8(a),示出第一或者静态PT65。静态PT65只包括定义输出页面79或其一部分的表示元素的ML语句。在处理JSP49时,静态PT65的ML语句用于定义输出页面79的静态部分,例如页眉或页脚,即,对客户应用程序的所有输出页面公用的输出页面79的这些部分。参考图7和图8(b),示出第二或动态PT67。动态PT67包括定义输出页面79或输出页面79一部分的表示元素的ML语句。它还包括至少一个控件63,其提供到由FC59生成的数据输出27的连接。当处理JSP49的时候,动态PT67的ML语句定义合并了FC59的数据输出27的输出。例如,输出页面79或其一部分可以在表格中显示订单的定购细节(例如,定购项目的列表)。FC59的数据输出可以是定购项目的列表,其显示在具有由PT67定义的表示格式的HTML表格(即,控件63)中。在优选实施例中,明确的分级文件结构用于表示模板文件的使用。该级包括下列级别,顺序为应用程序根段—为用于该指定应用程序级的根段。格式—该级别通过格式(例如,html,hdml部)组织文件。语言—该级别通过语言地区(例如,en_US、en_CA、fr_CA部)组织文件。应用程序指定级别—这(这些)级别可以定义为对具体应用程序的请求。如果指定单个的表示模板文件61,则其位于应用程序指定级内而不是位于语言级内。在优选实施例中,将“查看和感知”的共同元素分割成单独的表示模板文件61。例如,如果应用程序的所有页面均具有公共页眉和公共页脚,则这些部分的每一个将分别从它们本身的文件中抽取出来,使得他们可以由引用“包括”而不是具有在应用程序的所有页面中复制的它们的内容。因此,认识到可以重新使用信使模板文件61(couriertemplatefile)以及结合的FC标签59和PC标签57,以生成应用程序页面。例如,模板61之一可以表示多行表格中的一行,该表格具有引导用于行模板61的每个调用的插入的表格内容的适当的PC标签57和FC标签59。使用这个文件组织模式,可以确定到MLPT61文件的物理路径,该文件给定包括任意应用程序指定级的适当根段路径、文件格式、语言、和文件名。例如,应用程序可以具有定义成如下部分common、orderEntry、和orderHistory的一个应用程序指定级。应用程序自身具有与进行插入和处理命令有关的一系列页面49,以及具有与进行选择和察看命令历史有关的另一系列页面49。ML表示模板文件61组可以以如下方法组织.../orderApplication/html/en_CA/common/header.html.../orderApplication/html/en_CA/common/footer.html.../orderApplication/html/en_CA/orderEntry/search.html.../orderApplication/html/en_CA/orderEntry/entry.html.../orderApplication/html/en_CA/orderEntry/submit.html.../orderApplication/html/en_CA/orderHistory/search.html.../orderApplication/html/en_CA/orderHistory/display.html具有另一组文件,如下.../orderApplication/html/fr_CA/....../orderApplication/hdml/en_CA/....../orderApplication/hdml/fr_CA/...可以使用适当的WYSIWYG编辑器(例如,由SanFrancisco,CA的Macromedia开发的用于HTML文件的HomeSite)设计各个ML表示模板文件61。可以使用本领域技术人员熟知的任意其他适合的编辑器。ML表示模板文件61自身包括“纯”置标语言(例如,HTML)。MLPT文件61表示可以包括动态内容(例如,MLPT67)的页面。任意动态内容必须定位在位于页面上的控件63内。每种置标语言都具有其自身的一组控件。每个控件63具有定义将插入控件63中的动态内容顺序的标示符(即,在HTML中,id=“idvalue”)关键字。在ML文件中,控件可以具有空数据。该空数据在ML文件的设计阶段被用于显示。然而,当在控件中插入动态数据时,自动去除该空数据。在基于ML表示模板动态文件67的HTML的情况下,只要每个控件具有用作标示符关键字(即,id=“idvalue”)的唯一值,则下列控件的任意一个将被认为是动态数据插入文本字段、密码字段、隐含字段、文本区、表格、列表框、复选框、单选按钮、图像、按钮、图像按钮、提交按钮、复位按钮、链路、和取值范围。在替换实施例中,ML文件可以包括本领域技术人员熟知的任意其他置标语言,例如,HDML或WML。表示组件(PC)参考图4,示意性地示出表示组件(PC)161。PC161是表示功能性的明确、独立的部分。每个表示组件161处理相应的表示元素。在优选实施例中,每个表示组件161作为基于一般基类的Java类存在。当客户应用程序请求表示组件161时,基于表示组件161的逻辑名称使用Java反射简单地初始化。表示组件161符合JavaBean的规范。表示组件(PC)标签扩展表示组件文件161包括使用一组表示组件标签扩展57。表示组件文件自定义标签扩展57提供在表示文件67中的控件63、动态数据27、以及JSP页49中的表示组件161之间的联接。此外,这些扩展57还提供生成后序显示页面79的能力。presentationpage标签该标签定义指定表示组件文件161将用于当前处理页面49中。该标签具有如下格式<presentationpagename=“presentationName”root=“rootPath”source=“fileName”value=“fileName”format=“presentationFormat”language=“languageSpecification”absolute=“true”/>其中presentationName是将由处理页面49中引用的该表示页面的唯一名称。rootPath(可选的)是文件的根路径。fileName是包括任意应用程序指定级名称的文件名。presentationFormat是表示文件61的格式,其必须是下述值之一html、hdml、或wml。languageSpecification(可选的)是表示文件61内容的语言,如果指定,则必须是下述值之一en_CA、fr_CA等。在优选实施例中,name和format属性是强制的。必须明确指定source或value属性之一。可以直接将除了value之外的每个属性指定为值,否则可以对动态数据引用(即,dataReference)。除非将absolute属性指定为ture,到表示文件的路径均被认为是相关的。presentationcontrol标签该标签连接从动态表示模板文件67到控制动态数据和表示组件161的资源的控件63。当动态表示模板文件67的特定格式支持控件63的类型时,使用该标签。在优选实施例中,该标签具有如下格式<presentationcontrolname=“controlName”type=“controlType”parentPresentation=“parentName”value=“literalValue”source=“dateReference”optSource=“dateReference”empty=“booleanValue”id=“identifier”conditionalExecution=“true”/>其中controlName是将被引用该控件的唯一名称。controlType是控件的具体类型。如果HTML是选择的ML,则HTML控件包括input(要求属性type,设置用于文本字段的text,设置用于密码字段的password,设置用于隐含字段的hidden,设置用于按钮的button,设置用于图形按钮的image,设置用于提交按钮的submit,设置用于复位按钮的reset,设置用于复选框的checkbox,设置用于单选按钮的radio)、textarea、table、select(列表框)、img(图像)、(链接)或取值范围。parentName是包括为表示页面或其他页面的该控件的双亲段的名称。如果控件被指定直接地包括在页面中,则值为表示名称、点(‘.’)、和控件名称。如果控件被指定在直接地包括在页面中的其他控件中,则值为表示名称、点(‘.’)、直接控件名称、点(‘.’)、和控件名称。这不限于在控件内的控件嵌入。literalValue是硬编码的文字值。dataReference是对动态数据的引用。由该属性引用的数据类型必须与控件类型一致。动态数据引用可以是对用于定义该处理页面或小服务程序请求定义的关键字-值成对数据的引用或者是对从应用程序组件返回的结果数据的引用。如果关键字-值成对数据的值是简单值,则该引用是简单地引用关键字本身。例如,orderNumber如果关键字-值成对数据的值是结构,则该引用是关键字、点(‘.’)、和结构的元素名称。(如果元素本身是结构,则其还可以进一步定义)例如,orderHeaderAttr.orderStatus返回的结果数据引用包括功能组件59实例名称、点(‘.’)、和返回结果数据元素名称。例如,orderGet_orderEntry.orderID如果返回的结果数据元素是结构,并且期望的动态数据27是结构的元素,则通过点(‘.’)和元素名称定义返回的结果数据。(如果元素本身是结构,则其还可以进一步定义)例如,orderGet_orderEntry.orderHeaderAttr.orderStatus如果以字符@开始动态数据引用,则其为隐含间接引用。在这种情况下,一旦确定返回结果数据元素,则其自身被认为是通过应用上述规则重新估计的动态数据引用。(如果随后认为是动态数据引用的返回结果数据元素也以字符@开始,则其也为隐含间接引用,并且估计处理全部重新开始。)booleanValue是true或false。Identifier(可选的)是在表示文件中的控件的标识符。在动态表示文件67中的控件必须具有等同的id=“identifier”属性。如果在presentationcontrol标签中没有指定标识符,则具有名称id的标识符必须设置为presentationattribute标签中的值identifier。conditionalExecution=“true”该属性表示该标签的执行是以当前具有true值的附带applicationcomponentif标签为条件的。name、type、和parentPresentation属性是强制的。仅可以指定value、source、或者optSource之中的一个。如果指定optSource,则dataReference可以是不存在的数据引用。指定的属性提供用于ML文件中控件的主体内容。如果未指定这些属性,则在ML文件中没有主体内容被替代。presentationattribute标签该标签指定用于特定控件63的特定标签。该标签必须在presentationcontrol标签的主体内定义。该标签具有如下格式<presentationattributename=“attributeName”value=“literalValue”source=“dateReference”optSource=“dateReference”empty=“booleanValue”/>其中attributeName是设置的属性名称。literalValue是硬编码的文字值。dataReference是对动态数据的引用。booleanValue是true或false。除了只可以指定value、source、optSource、或者empty之中的一个,全部属性是强制的。如果指定optSounce,则dataReference可以是不存在的数据引用。presentationproducePage标签该标签定义在首先将全部动态内容移到PT中之后,基于指定的表示模板文件61将产生用于显示页面的输出。在处理文件49中碰到该标签时(即,在执行多层应用程序期间)产生输出。如果碰到多个producePage标签,则产生的显示页面79将包括以在处理页面49中碰到的顺序从每个producePage标签中输出的拼接。该标签具有以下格式<presentationproducePagepage=“PresentationPageName”conditionalExecution=“true”/>其中PresentationPageName是表示文件61的名称,以生成用于预先必须通过presentationpage标签定义的表示文件61的输出。conditionalExecution=“true”该属性表示该标签的执行是以当前具有true值的附带applicationcomponentif标签为条件的。页面属性是强制的。presentationclear标签该标签清除JSP49的输出缓冲器。通常用于在生成任意内容之前清除JSP服务器在XML标签周围插入的空行。在HTML中,忽略该数据,但是纯文本文档没有这些附加行。该标签没有属性。presentationinterceptor标签该标签是截取其主体的输出并将其插入到resultValue页面变量中,以及可选地将其复制到页面输出的主体标签。该标签具有以下格式<presentationinterceptorinterceptEnabled=“booleanValue”duplicateOutput=“booleanValue”/>其中interceptEnabled是表达式,如果为真,则可以截取。duplicateOutput是表达式,如果为真,则将截取的输出复制到所附页面。interceptEnabled属性是强制的,duplicateOutput属性是可选的。使用处理文件定义用于小服务程序客户应用程序的处理逻辑参考图4、图6(a)、图6(b)、图7、图8(a)、图8(b)、和图9,根据本发明优选实施例示意性地示出了小服务程序客户应用程序中的JSP49的处理逻辑。在一组JSP49处理文件中定义用于小服务程序客户的处理逻辑。处理文件执行两个明确的处理任务。首先,处理文件49提供调用执行指定处理功能性的功能组件59的能力。指定处理功能性包括处理输入数据33和提供输出数据27。处理文件49还定义在动态表示模板文件67定义的控件63和动态数据本身之间的连接69。在完成用于具体输出页面79的全部指定处理功能性,并生成全部动态数据27之后,可以通过将动态数据移入动态表示文件67中以及生成具有表示组件161的表示元素来产生下一显示页面79。在优选实施例中,使用JavaServerPage(JSP)执行处理文件49。为了使处理文件用户界面更友好,引入两组用自定义JSP标签扩展。功能组件(FC)自定义标签55提供调用功能组件59的能力。表示文件自定义标签61提供动态数据和表示文件中控件63之间的连接,还提供生成具有表示组件161的显示页面79的能力。客户应用程序基础架构(infrastructure)97定义执行同时构成客户应用程序71的功能框架的自定义JSPFC标签扩展55和PC标签扩展57库的类。该类支持客户应用程序功能组件59和表示组件161。基础架构97提供功能组件59和指定应用程序用户之间的界面。还提供用于小服务程序GUI、容器(applet)GUI、以及直接可编程界面的合适的连接点。基础架构还提供一组类,其实现用于支持客户应用程序的表示组件161的自定义JSP扩展库。参考图10和图11,示出根据本发明优选实施例组合的客户应用程序71的逻辑图。为了示例的目的,描述小服务程序客户应用程序。通过从终端11上的浏览器内输入应用程序71开始JSP49的URL的用户调用小服务程序引擎23。小服务程序客户程序71逻辑上包括一系列Java服务器页49,其中每一页均定义客户应用程序71的处理逻辑的一部分。每个页面49具有一个或多个提供页面的“查看和感知”的关联的表示模板61。每个页面49还具有一个或多个提供其处理逻辑的关联的功能组件59和提供其表示逻辑的表示组件161。在客户应用程序71的执行中的任意指定点处,用户操作端11在本地浏览器窗口中浏览页面并与其相互作用。用户键入信息,然后使得(例如,通过“推”按钮)来自页面的数据与指向客户应用程序71下一页面49的指针一起返回网络服务器15。用户数据以一组关键字值对73的形式返回到网络服务器15。在这一点,处理客户应用程序71的下一页面49,将通过PC161生成并用于生成新的浏览页面79的输出数据27退回到终端11上的用户浏览器窗口,并且整个循环再次开始。总的来说,小服务程序客户应用程序71的每个页面49·接收一组关键字值的成对数据73作为输入·执行处理步骤77·生成新显示页面79,用于包含所有请求的嵌入程序结构用户操作终端11,以改变到下一页面的控制流的方向并将关键字值的成对数据73返回到下一页面。在替换实施例中,可以组合容器客户程序93或直接可编程界面客户程序95。(图13)容器客户程序93是针对在终端11上运行的客户应用程序71的基于JavaSwing的界面。在本地运行的时候,终端11上的用户直接与应用程序互相作用。客户应用程序71经由CORBA界面97通信通过网络13(例如,因特网)与Net*Suite服务器通信。使用JavaSwingGUI组件将响应直接写到屏幕。直接可编程界面是使用应用程序的另一机构。直接可编程界面客户程序95是指定的一组Java代码。直接客户程序95示出一组功能组件59,以提供用于客户应用程序71的处理逻辑。直接客户程序95适当地设置前提数据33,调用execute()方法,并且得到用于每个功能组件59实例的返回数据27。如果被请求,使用直接可编程界面的客户程序提供其自身的GUI。功能组件59的连接是在客户程序逻辑本身内的“硬编码”,以定义应用程序。示例参考图12,通过根据本发明优选实施例的实例示出FC标签库指令51、FC标签55、FC59、PC标签库指令53、PC标签57、和PC161的使用,以生成输出页面79。在此实例中,有包括管理步骤的指令输入应用程序,以批准指令,在这种情况下,在指令被批准之后提交指令。对于该实例,假设先前的JSP49选择指令,并且指令标识符(orderID)FC59作为来自于在先前JSP49上执行的orderSelectFC59的返回结果是可用的。当前JSP49是orderSubmit页面。用于该页面的处理逻辑包括调用将检索用于选择的指令的指令细节83的FC59(orderGet)。在这种情况下,将要返回至用户浏览器窗口的结果输出页面79将显示指令序号81和指令细节83。如果指令细节83不可用,则FC59返回FC_EXCEPTION_1异常。在这种情况下,应用程序将跳转到错误JSP(noOrderError.jsp)。通过转发一般的错误JSP页面(error.jsp)处理任意其他异常。定义用于输出页面79布局的PT61利用在该应用程序中的所有页面中共有的PT页眉85(orderApplicationHeader.html)和PT页脚87(orderApplicationFooter.html)(以HTML格式)。没有插入到PT页眉85和PT页脚87内的动态数据,它们是静态表示模板65的实例。当前页面的PT主体89来自于orderSubmitHTML文件。该文件包括将显示指令序号81的文本字段(只读)。该控件通过id=orderNumField标记。将使用表格控件以表格格式显示指令细节83。表格控件通过id=orderDetail标记。最后,在页面上具有提交按钮91,其将调用将实际上提交该指令的随后的JSP页面(submit.jsp)。PT主体89是动态PT67的实例。PTHTML文件85、87、和89提供用于由JSP49生成的显示页面79的布局模板,该布局模板由PC161生成。用于应用程序这部分的JSP49如下2<!--*************************3Thispageisusedbyanadministratortosubmitanorder.4**************************-->56<%@pagesession=“true”buffer=“64kb”autoFlush=“true”7  isThreadSafe=“true”errorPage=“.../errorPage.jsp”%><%@tagliburi=“/servlet/FunctionComponentTagsClient.jar”<!--SIPO<DPn="39">--><dpn="d39"/>prefix=“applicationcomponent”%>8<%@tagliburi=“/servlet/PresentationComponentTagsClient.jar”prefix=“presentation”%>9<functionComponentinit>10<!--CreateandOrderGetfunctioncomponentandexecuteitusingtheresultsfromafunctioncomponent(OrderSelect)executedonapreviousJSPpage.!-->11<functionComponentcallname=“OrderGet_OrderEntry”>12<functionComponentprerequisitetarget=“Ordered”13Source=“OrderSelect_OrderEntry.orderID”/>14<functionComponenterrorname=“NoOrder”page=“NoOrderError.jsp”/>15</functionComponentcall>16<!--Definetheheaderpresentation.Thereisnodynamicdataintheheaderpresentation.!-->17<functionComponentpagename=“header”source=“OrderApplicationHeader”18language=“en_CA”format=“html”/>19<!--SIPO<DPn="40">--><dpn="d40"/>20<!--Definethebodypresentation.Thispresentationcontainsdynamicdata.Thedynamicdatamustbeconnectedtothepresentation.-->21<presentationpagename=“body”Source=“OrderSubmit”22language=“en_CA”format=“html”/>23<presentationcontrolname=“OrderNumField”type=“span”id=“OrderNumField”24parentPresentation=“body”source=“OrderGet_OrderEntry.orderNum”/>25<presentationcontrolname=“OrderDetails”type=“table”id=“OrderDetail”26parentPresentation=“body”source=“OrderGet_OrderEntry.orderDetailTable”/>2728<!--Definethefooterpresentation.Thereisnodynamicdatainthefooterpresentation.-->29<presentationpagename=“footer”source=“OrderApplicationFooter”30language=“en_CA”format=“html”/>3132<!--Nowthatalltheelementsofthepageareavailable,<!--SIPO<DPn="41">--><dpn="d41"/>33thepageitselfcanbeproduced.-->34<presentationproducePagepage=header/>35<presentationproducePagepage=“body”/>36<presentationproducePagepage=“footer”/>参考图13,根据本发明优选实施例示出了系统10和客户应用程序71的处理输出的扩展示意图。操作网络终端11的网络用户通过网络13请求远程定位资源(JSP49)。JSP49包括FC标签库指令51,其当处理用户请求时,指定可以由小服务程序引擎23使用的自定义FC标签55;和PC标签库指令53,其当汇编在终端11处返回给用户的输出页面79时,指定可以由小服务程序引擎23使用的自定义PC标签57。JSP49还包括用于调用其相应的FC59的FC标签55和提供到PC161的连接的PC标签57。FC标签55可以用于调用其相应的FC59。其通过指定将要被调用(通过“name”)的FC59实现。FC标签55进一步定义前提或输入数据33,并对输入数据33的“source”提供引用101。在此实例中,输入数据33位于数据库17中,其由应用程序服务器19通过数据库服务器119被访问。因此,当执行FC59时,通过应用程序服务器19请求并接收来自数据库17的输入数据33。然后,通过FC59处理该数据并生成数据输出27。PC标签可以用于调用其相应的PC161。通过指定将要被调用(通过“name”)的PC161实现。也对PT61的“source”提供引用。因此,当执行PC161时,在表示模板61中执行表示指令并生成相应的表示元素或输出79。PC标签57可以引用两种类型的PT61中的一种;静态PC65和动态PT67。通过名称和位置或来源查询PT65和76。静态PT65是包括定义部分输出页面79的表示元素的ML语句的ML文件。静态PT65即不包括引用,也不将其与在PC161处理期间由FC59生成的输出数据27合并。它们通常被保留,以定义那些与客户应用程序79的所有输出页面79共有的输出页面79的元素(例如,页眉和页脚),尽管它们的使用不限于此规则。动态PT67还是包括定义部分输出页面79的表示元素的ML语句的ML文件。然而,动态PT67还包括至少一个控件63,其对由FC59生成的输出数据27提供引用或连接69。引用动态PT67的PC标签57除了动态PT67的名称和“source”之外,还包括包括在输出页面79的一部分中的对控件63类型的引用和对在PC161处理期间与控件63合并的“output_data_27”的引用或指令103。一旦小服务程序引擎23执行编译的Java小服务程序31并处理用户请求,则其生成输出页面79,该输出页面的一部分由PT65和67定义。可以认识到,JSP49包括多个PT61,其中每一个用于定义输出页面79的一部分。这些PT61可以重复使用,所以相同的PT65、67可以连接到不同配置的PC标签57。例如,可以通过两个具有引用69的不同的控件将PT67与两个不同的输出数据27连接。因此,这将在具有通过两个输出数据27的不同内容部分控件的两个不同主体内容的输出页面79中生成两个表格。客户应用程序基础架构参考图14,示出了使用一系列功能组件59汇编的客户应用程序的整体结构。出于说明的目的,通过客户应用程序基础架构97的替换实施例,全部描述小服务客户程序75、容器客户程序93、和直接可编程界面客户程序95与FC59的相互作用。例如,服务器19执行用于客户应用程序71的CORBA或EJB界面99来使用。在执行客户应用程序71处理逻辑期间,在FC59中形成指定的服务器19调用。客户应用程序基础架构97定义与构成客户应用程序71的功能框架一起执行自定义JSPFC标签扩展55和PC标签扩展57库的类。在优选实施例中,一组类执行用于支持客户应用程序功能组件59(功能组件基础架构)的自定义JSP扩展库,以及第二组类执行用于支持应用程序表示组件161(表示组件基础架构)的自定义JSP扩展库。功能组件基础架构(FCI)FC59基础架构提供功能组件59与指定应用客户程序(小服务客户程序75、容器客户程序93、和DPI客户程序95)之间的界面。提供用于小服务程序GUI、容器GUI、和直接可编程界面的适当的连接点。FC基础架构提供一组类,其执行用于支持客户应用程序的功能组件59的自定义JSP扩展库。这些类包括FunctionComponentInitTag、FunctionComponentInitTagExtraInfo、FunctionComponentCallTag、FunctionComponentCallTagExtraInfo、FunctionComponentPrerequisiteTag、FunctionComponentDebugTag、FunctionComponentErrorTag、FunctionComponentGetValueTag、和FunctionComponentGetValueTagExtraInfo。公共类FunctionComponentInitTag该类执行用于初始化功能组件自定义标签55的自定义JSP标签扩展库。该标签存在以定义FunctionComponentInitTagExtraInfo类中的变量。公共方法doStartTag()因为对该标签中内容不支持,该方法简单地返回SKIP_BODY。公共方法doEndTag()未请求指定的处理。返回值EVAL_PAGE。公共类FunctionComponentInitTagExtraInfo该类创建用于功能组件标签55的全部脚本变量。公共类FunctionComponentCallTag该类执行用于功能组件59调用支持的自定义JSP标签扩展库。公共获取/设置方法在优选实施例中,标签55的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getName(),setName().getDontResetAllData(),setDontResetAllData().getDebugLevel(),setDebugLevel()专用方法setFunctionComponentInstance()该方法存储当前功能组件59的实例。由于可以通过functionComponentprerequisite标签和functionComponenterror标签恢复功能组件59,由functionComponentcall标签设置功能组件59的实例。保护方法getFunctionComponentInstance()该方法保存当前的功能组件59实例。保护方法setFunctionComponentException()该方法保存由functionComponenterror标签指定的功能组件异常名称和页面。异常组存储在关键字为异常名称且值为异常页面的hashTable中。专用方法setFunctionComponentException()该方法返回用于命名异常的异常页面,或者如果没有指定页面则返回空。公共方法doStartTag()分解功能组件59的名称被分解和分隔为类名称和功能组件实例描述。然后,初始化功能组件59并设置实例描述。将功能组件实例名称和目标引用保存在作为对话语境一部分的杂凑表中。此外,使用getFunctionComponentInstance()方法保存功能组件实例本身。在该标签的主体中设置前提数据33和异常处理。在处理主体之后,通过doEndTag()方法实现功能组件59的实际启用。该标签请求主体,因此该方法简单地返回EVAL_BODY_TAG。公共方法doAfterBody()如果存在任意主体内容,则将其附加到用于页面的缓冲输出。在主体上未请求迭代,因此该方法简单返回SKIP_BODY。公共方法doEndTag()将写入用于页面的任意缓冲输出。必须由主体中的functionComponentprerequisite标签设置全部前提数据33。调用功能组件59的execute()方法。如果发生(throw)异常,则将必须以下列方式进行解释。如果存在对异常的错误描述符属性的设置,则可以将该异常将保存在FunctionComponentException脚本变量中,并且将请求发送到定义的JSP49。在这种情况下,返回值SKIP_PAGE。在所有的其他情况下,包括发生非异常的情况,返回值EVAL_PAGE。公共类FunctionComponentCallTagExtraInfo该类实现用于在针对functionComponentCall标签处理异常(由functionComponenterror标签定义)的情况下设定的functionComponentException的脚本变量定义。公共类FunctionComponentPrerequisiteTag该类实现用于功能组件59的前提数据33设置支持的自定义JSP标签55扩展库。公共获取/设置方法标签的每个属性都具有关联的获取和设置方法。具体地,创建以下方法。.getTarget(),setTarget().getSource(),setSource()该属性的每一个的类型为String,而不是前提数据33的实际类型。.getValue(),setValue().getEmpty(),setEmpty()公共方法doStartTag()如果该标签不在functionComponentCall标签内,则发生适当的JspTagException。可以使用functionComponentCall标签处理程序的getFunctionComponentInstance()方法检索功能组件59对象本身。因为不支持该标签中的内容,该方法简单地返回SKIP_BODY。公共方法doEndTag()使用对功能组件59类的反射进行设置目标数据元素。如果设置为empty属性,则将空值用于设置方法。如果设定为value属性,则提供文字值用于设置方法。否则,必须解释source属性,以得到用于设置方法的值。source属性的解释包括以下步骤●分离基址名称(如果为一个,则第一个“.”左侧的每个字符)与定义路径(如果为一个,则第一个“.”右侧的每个字符)●如果基址名称为脚本变量名称●则查找脚本变量名称值●如果基址名称为小服务器程序请求参数名称●则查找小服务程序请求参数名称值●否则,基址名称必须为功能组件59的实例名称●查找功能组件59的实例名称,以得到功能组件59的实例对象●如果有定义路径●则通过调用在定义路径组件的每一个上的获取方法估计定义路径●现在,其将是用于前提数据元素的值●返回值EVAL_PAGE公共类FunctionComponentDebugTag该类实现用于功能组件调试支持的自定义JSP标签扩展库。公共获取/设置方法在优选实施例中,标签的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getDebugLevel(),setDebugLevel().getDebugFile(),setDebugFile().getValue(),setValue().getSource(),setSource()公共方法doStartTag()因为对该标签中内容不支持,该方法简单地返回SKIP_BODY。公共方法doEndTag()使用对功能组件类的反射进行设置目标数据元素。如果设置为empty属性,则将空值用于设置方法。如果设定为value属性,则提供文字值用于设置方法。否则,必须解释source属性,以得到用于设置方法的值。source属性的解释包括以下步骤●分离基址名称(如果为一个,则第一个“.”左侧的每个字符)与定义路径(如果为一个,则第一个“.”右侧的每个字符)●如果基址名称为脚本变量名称●则查找脚本变量名称值●如果基址名称为小服务程序请求参数名称●则查找小服务程序请求参数名称值●否则,基址名称必须为功能组件59的实例名称●查找功能组件59的实例名称,以得到功能组件59的实例对象●如果有定义路径●则通过调用在定义路径组件的每一个上的获取方法估计定义路径●现在,其将是用于前提数据元素的值●返回值EVAL_PAGE公共类FunctionComponentErrorTag该类实现用于功能组件59错误支持的自定义JSP标签扩展库。公共获取/设置方法标签的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getName(),setName().getPage(),setPage()公共方法doStartTag()如果该标签不在functionComponentCall标签内,则发生适当的JspTagException。可以使用functionComponentCall标签处理程序的getFunctionComponentInstance()方法检索功能组件59对象本身。因为不支持该标签中的内容,该方法简单地返回SKIP_BODY。公共方法doEndTag()通过调用functionComponentCall标签处理程序的setFunctionComponentException()方法进行定义错误。返回值EVAL_PAGE。公共类FunctionComponentGetValueTag该类实现用于获取功能组件59返回的结果数据值的自定义JSP标签扩展库。公共获取/设置方法在优选实施例中,标签的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getSource(),setSource()公共方法doStartTag()因为对该标签中的内容不支持,该方法简单地返回SKIP_BODY。公共方法doEndTag()使用对功能组件类的反射进行设置目标数据元素。如果设置为empty属性,则将空值用于设置方法。如果设定为value属性,则提供文字值用于设置方法。否则,必须解释source属性,以得到用于设置方法的值。source属性的解释包括以下步骤●分离基址名称(如果为一个,则第一个“.”左侧的每个字符)与定义路径(如果为一个,则第一个“.”右侧的每个字符)●如果基址名称为脚本变量名称●则查找脚本变量名称值●如果基址名称为小服务程序请求参数名称●则查找小服务程序请求参数名称值●否则,基址名称必须为功能组件59的实例名称●查找功能组件59的实例名称,以得到功能组件59的实例对象●如果有定义路径●则通过调用在定义路径组件的每一个上的获取方法估计定义路径●现在,其将是用于前提数据元素的值●返回值EVAL_PAGE公共类FunctionComponentGetValueTagExtraInfo该类实现用于对functionComponentgetValue标签设定的resultValue的脚本变量定义。表示组件基础架构(PCI)PC161基础架构提供一组类,其实现用于支持用户应用程序的表示组件161的自定义JSP扩展库。这些类包括PresentationPageTag、PresentationControlTag、PresentationAttributeTag、以及PresentationProducePageTag。公共类PresentationPageTag该类实现用于表示组件161支持的自定义JSP标签扩展库。公共获取/设置方法PC标签57的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getName(),setName().getRoot(),setRoot().getSource(),setSource().getFormat(),setFormat().getLanguage(),setLanguage()公共方法doStartTag()因为对该标签中的内容不支持,该方法简单地返回SKIP_BODY。公共方法doEndTag()初始化页面制作者对象,命名为名称属性的值并存储在pageContext中。使用source、format、和language属性确定关联的ML文件。所有处理完成之后,返回值EVAL_PAGE。公共类PresentationControlTag这组类实现用于指定控件的表示组件161支持的自定义JSP标签扩展库。公共获取/设置方法标签的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getName(),setName().getType(),setType().getId(),setId().getParentPresentation(),setParentPresentation().getSource(),setSource().getValue(),setValue().getEmpty(),setEmpty()公共方法doStartTag()该标签57请求主体,因此该方法简单地返回EVAL_BODY_TAG。公共方法doAfterBody()如果存在任意主体内容,则其应该附于用于页面的缓冲输出。在主体上没有请求迭代,因此,该方法简单地返回SKIP-BODY。公共方法doEndTag()该双亲名称为已知的页面制造者对象或在pageContext中发现的控件对象。初始化适当类型的控件,并存储在pageContext中。设置控件的数据控件属性。如果设置为empty属性,则将空值用于属性。如果设定为value属性,则其提供文字值用于属性。否则,解释source属性,以得到用于属性的值。source属性的解释包括以下步骤●分离基址名称(如果为一个,则第一个“.”左侧的每个字符)与定义路径(如果为一个,则第一个“.”右侧的每个字符)●如果基址名称为脚本变量名称●则查找脚本变量名称值●如果基址名称为小服务程序请求参数名称●则查找小服务程序请求参数名称值●否则,基址名称必须为功能组件59的实例名称●查找功能组件59的实例名称,以得到功能组件59的实例对象●如果有定义路径●则通过调用在定义路径组件的每一个上的获取方法估计定义路径●现在,其将是用于前提数据元素的值●全部处理完成之后,返回值EVAL_PAGE公共类PresentationAttributeTag这组类实现用于指定控件属性的表示组件161支持的自定义JSP标签扩展库。公共获取/设置方法该标签的每个属性必须具有关联的获取和设置方法。具体地,创建以下方法。.getName(),setName().getSource(),setSource().getValue(),setValue().getEmpty(),setEmpty()公共方法doStartTag()因为对标签中的内容不支持,该方法简单地返回SKIP_BODY。公共方法doEndTag()在pageContext中发现双亲控件并设置属性。如果设置为empty属性,则将空值用于属性。如果设定为value属性,则其提供文字值用于属性。否则,解释source属性,以得到用于属性的值。source属性的解释包括以下步骤●分离基址名称(如果为一个,则第一个“.”左侧的每个字符)与定义路径(如果为一个,则第一个“.”右侧的每个字符)●如果基址名称为脚本变量名称●则查找脚本变量名称值●如果基址名称为小服务程序请求参数名称●则查找小服务程序请求参数名称值●否则,基址名称必须为功能组件59的实例名称●查找功能组件59的实例名称,以得到功能组件59的实例对象●如果有定义路径●则通过调用在定义路径组件的每一个上的获取方法估计定义路径●现在,其将是用于前提数据元素的值●全部处理完成之后,返回值EVAL_PAGE公共类PresentationProducePageTag该类实现用于生成输出页面的表示组件161支持的自定义JSP标签扩展库。公共获取/设置方法标签的每个属性均具有关联的获取和设置方法。具体地,创建以下方法。.getPage(),setPage()尽管参考某些具体的实施例描述了本发明,对于本领域技术人员来说,在不背离在所附权利要求中概括的本发明的精神和范围的情况下,各种更改显而易见。权利要求1.一种用于托管在网络上与用户界面相互作用的计算机可执行多层应用程序的方法,所述应用程序包括应用程序表示层,所述方法包括以下步骤选择第一表示模板,所述第一模板包括用于定义相应的第一表示元素的第一表示指令;选择用于处理所述第一表示指令的所述应用程序表示层的第一表示组件;以及将所述第一表示组件连接到所述第一模板,其中,在执行用于随后传递到所述用户界面的所述多层应用程序时,所述第一组件处理所述第一表示指令并生成所述第一表示元素。2.根据权利要求1所述的方法,还包括附加步骤选择第二表示模板,所述第二模板包括用于定义相应的第二表示元素的第二表示指令;选择用于处理所述第二表示指令的所述第一表示组件;以及将所述第一组件连接到所述第二模板;其中,在执行用于随后传递到所述用户界面的所述多层应用程序时,所述第一组件处理所述第二表示指令并生成所述第二表示元素。3.根据权利要求1所述的方法,其中,所述多层应用程序还包括应用程序逻辑层。4.根据权利要求1所述的方法,其中,所述方法包括以下附加步骤选择输入数据;选择用于处理所述输入数据的所述应用程序逻辑层的第一功能组件;以及将所述输入数据连接到所述第一功能组件,其中,在执行所述多层应用程序时,所述第一功能组件处理所述输入数据并生成输出数据。5.根据权利要求4所述的方法,其中,所述第一模板还包括用于进一步将所述相应的第一表示元素定义为包括所述输出数据的输出数据表示指令。6.根据权利要求5所述的方法,包括以下附加步骤引导所述第一表示组件,以处理所述输出数据表示指令,其中,在执行所述多层应用程序时,所述第一表示组件处理所述输出数据表示指令并生成结合所述输出数据的所述第一表示元素。7.根据权利要求2所述的方法,其中,所述表示模板是计算机可读文件。8.根据权利要求7所述的方法,其中,所述表示指令选自包括所述第一表示组件的布局、字体、以及格式的组。9.根据权利要求8所述的方法,其中,将所述表示指令写入置标语言中。10.根据权利要求9所述的方法,其中,所述置标语言选自包括HTML、HDML、和WML的组。11.根据权利要求5所述的方法,其中,所述输出数据表示指令定义控件,在所述控件中显示输出数据。12.根据权利要求11所述的方法,其中,所述控件选自包括文本字段、密码字段、隐含字段、文本区、表格、列表框、复选框、单选按钮、图像、按钮、图像按钮、提交按钮、复位按钮、链接、和取值范围的组。13.根据权利要求1所述的方法,其中,所述第一表示组件是计算机可执行文件。14.根据权利要求13所述的方法,其中,所述计算机可执行文件是JavaBean。15.根据权利要求4所述的方法,其中,所述第一功能组件是计算机可执行文件。16.根据权利要求15所述的方法,其中,所述计算机可执行文件是JavaBean。17.根据权利要求1所述的方法,其中,所述第一表示组件通过方向元素连接到所述第一表示模板。18.根据权利要求17所述的方法,其中,所述方向元素指定所述第一表示模板的位置并将所述第一表示组件引导至指定位置。19.根据权利要求18所述的方法,其中,所述方向元素是第一表示组件标签。20.根据权利要求19所述的方法,其中,所述第一表示组件标签选自包括页面标签、控制标签、属性标签、产生页面标签、清零标签、和消息拦截标签的组。21.根据权利要求19所述的方法,其中,所述第一表示组件标签表示为方向模块的指令,所述方向模块执行所述多层应用程序。22.根据权利要求21所述的方法,其中,所述方向模块是Java服务器页。23.根据权利要求1所述的方法,其中,所述第一功能组件通过方向元素链接到所述输入数据。24.根据权利要求23所述的方法,其中,所述方向元素指定所述输入数据的位置并且将所述第一功能组件引导至指定位置。25.根据权利要求24所述的方法,其中,所述方向元素是第一功能组件标签。26.根据权利要求25所述的方法,其中,所述第一功能组件标签选自包括初始化标签、调用标签、前提标签、调试标签、错误标签、赋值标签、条件标签的组。27.根据权利要求26所述的方法,其中,所述第一功能组件标签表示为方向模块的指令,所述方向模块执行所述多层应用程序。28.根据权利要求21所述的方法,其中,所述方向模块是Java服务器页。29.根据权利要求1所述的方法还包括以下步骤在用户界面上将显示项表示成多个显示区域,至少两部分与表示模板的不同的一个部分关联。30.根据权利要求29所述的方法,其中,所述表示模板是可重复使用的,使得所述模板之一用于生成所述部分中的至少两个。31.一种用于托管在网络上与用户界面相互作用的计算机可执行多层应用程序的系统,所述应用程序包括应用程序表示层,所述系统包括第一表示模板,所述第一模板包括用于定义相应的第一表示元素的第一表示指令;所述应用程序表示层的第一表示组件,用于处理所述第一表示指令;以及第一方向元素,用于将所述第一表示组件连接到所述第一模板,其中,在执行用于随后传递到所述用户界面的所述多层应用程序时,所述第一组件处理所述第一表示指令并生成所述第一表示元素。32.根据权利要求31所述的系统,还包括第二表示模板,所述第二模板包括用于定义相应的第二表示元素的第二表示指令;以及第二方向元素,用于将所述第一组件连接到所述第二模板,其中,在执行用于随后传递到所述用户界面的所述多层应用程序时,所述第一组件处理所述第二表示指令并生成所述第二表示元素。33.根据权利要求31所述的系统,其中,所述多层应用程序还包括应用程序逻辑层。34.根据权利要求31所述的系统,还包括用于处理输入数据的所述应用程序逻辑层的第一功能组件;以及所述第一方向元素进一步将所述输入数据连接到所述第一功能组件,其中,在执行所述多层应用程序时,所述第一功能组件处理所述输入数据并生成输出数据。35.根据权利要求34所述的系统,其中,所述第一模板还包括用于进一步将所述相应的第一表示元素定义为包括所述输出数据的输出数据表示指令。36.根据权利要求35所述的系统,其中,在执行所述多层应用程序期间,所述第一表示组件处理所述输出数据表示指令并生成结合所述输出数据的所述第一表示元素。37.根据权利要求32所述的系统,其中,所述表示模板是计算机可读文件。38.根据权利要求37所述的系统,其中,所述表示指令选自包括所述第一表示元素的布局、字体、以及格式的组。39.根据权利要求38所述的系统,其中,将所述表示指令写入置标语言中。40.根据权利要求39所述的系统,其中,所述置标语言选自包括HTML、HDML、和WML的组。41.根据权利要求35所述的系统,其中,所述输出数据表示指令定义控件,在所述控件中显示所述输出数据。42.根据权利要求41所述的系统,其中,所述控件选自包括文本字段、密码字段、隐含字段、文本区、表格、列表框、复选框、单选按钮、图像、按钮、图像按钮、提交按钮、复位按钮、链接、和取值范围的组。43.根据权利要求41所述的系统,其中,所述第一表示组件是计算机可执行文件。44.根据权利要求43所述的系统,其中,所述计算机可执行文件是JavaBean。45.根据权利要求34所述的系统,其中,所述第一功能组件是计算机可执行文件。46.根据权利要求45所述的系统,其中,所述计算机可执行文件是JavaBean。47.根据权利要求31所述的系统,其中所述第一表示组件通过方向元素连接到所述第一表示模板。48.根据权利要求47所述的系统,其中,所述方向元素指定所述第一表示模板的位置并将所述第一表示组件引导至指定位置。49.根据权利要求48所述的系统,其中,所述方向元素是第一表示组件标签。50.根据权利要求49所述的系统,其中,所述第一表示组件标签选自包括页面标签、控制标签、属性标签、产生页面标签、清零标签、和消息拦截标签的组。51.根据权利要求49所述的系统,其中,所述第一表示元素标签表示为方向模块的指令,所述方向模块执行所述多层应用程序。52.根据权利要求51所述的系统,其中,所述方向模块是Java服务器页。53.根据权利要求31所述的系统,其中,所述第一功能组件通过方向元素连接到所述输入数据。54.根据权利要求53所述的系统,其中,所述方向元素指定所述输入数据的位置并将所述第一功能组件引导至所述指定位置。55.根据权利要求54所述的系统,其中,所述方向元素是第一功能组件标签。56.根据权利要求55所述的系统,其中,所述第一功能组件标签选自包括初始化标签、调用标签、前提标签、调试标签、错误标签、赋值标签、条件标签的组。57.根据权利要求56所述的系统,其中,所述第一功能组件标签表示为方向模块的指令,所述方向模块执行所述多层应用程序。58.根据权利要求51所述的系统,其中,所述方向模块是Java服务器页。全文摘要一种用于与用户界面(例如PC或PDA上的浏览器)相互作用的多层应用程序。应用程序包括表示层(例如,具有JSP/Servlet引擎的网络服务器)和业务逻辑层(例如,应用程序服务器),以在用户界面上处理用于随后表示的数据。引导模块具有多个连接的方向,包括功能方向,用于引导相应的功能组件,以使用业务逻辑层执行数据处理功能并且提供数据处理输出;以及表示方向,用于引导相应的表示组件,以当数据处理输出可应用时将其与表示模板相结合来生成用于用户界面的表示元素。功能组件和表示组件彼此独立并且分离,功能组件的连接产生数据且表示组件输出数据。表示组件是表示元素普通种类的抽象表现,每个指定的表示元素具有储存在不同表示模板中的布局和格式(例如,置标语言),并且可以在表示层的中在处理时间内确定用于表示组件的对于特定表示模板的引用。文档编号A47G9/02GK1914594SQ20048004146公开日2007年2月14日申请日期2004年12月17日优先权日2003年12月19日发明者伦尼·霍恩,肯·施奈德申请人:爱默吉斯公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1