版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨工业大学计算机学院唐好选Email:tanghx@CORBA构件模型及
构件接口语言
主要内容RPC的基本原理CORBA的概念与组成CORBA构件模型RPC的基本原理NetworkLocalCallClientStubRPCInterfaceRPCInterfaceServerStubRemoteProceduresendreceivesendreceive客户端程序服务器端程序RPC过程描述1、客户按本地调用的方式 直接调用本地的客户代理 客户代理具有与服务器相同的过程接口2、客户代理将客户的调用请求进行加工、打包 向底层通信机制(如套接字)发出请求消息
客户代理 不进行任何逻辑处理 只是一个中介3、客户端通过底层的通信机制 将消息传送给服务器端的底层通信机制RPC过程描述4、服务器需要部分地解析消息 找出客户希望调用的服务器程序5、服务器代理对消息进行解析 从中获得调用者的参数 然后调用服务器程序6、服务器程序执行相应的过程7、服务器程序将结果返回给服务器代理8、服务器代理将结果打包 向底层通信机制发出应答消息9、服务器端通信机制将消息传送给客户端通信机制RPC过程描述10、客户端节点上也可能有多个调出点 通信机制需要部分地解析返回的消息 找出消息应该返回给哪个客户程序 并将消息发送给对应的客户代理11、客户代理从消息中解析结果 返回给客户程序客户端开发过程服务器端开发过程服务器端程序IDL编译器(rpcgen)客户端程序IDLaccount.haccount_clnt.caccount_svc.cserver.cclient.crpclib.o互操作接口定义语言互操作协议
互操作实现(以RPC为例)互操作查找互操作规范底层协议决定决定服务器端程序客户端程序客户端代理互操作消息网络基础设施服务器端代理互操作消息网络基础设施CORBA的概念与组成CORBA概述CORBA(CommonObjectRequestBrokerArchitecture公共对象请求代理体系结构)是OMG制定的、最清晰的、跨越平台最多的分布对象模型通过IDL(InterfaceDefinitionLanguage)定义的接口,使用不同的编程语言,不同编译器实现的构件,可以通过对象请求代理(ORB:ObjectRequestBroker)连接,形成跨平台的应用CORBA是一套规约,而不是一个产品,开发商可以开发不同的产品来实现CORBA规约CORBA历史OMG成立于1989年,CORBA规约的第一代主要集中在为分布式对象定义了一个基础,其核心是ORB和IDL1995年颁布的CORBA2.0增加了ORB的互操作性规约,主要是基于TCP/IP的IIOP(InternetInter-ORBProtocol:因特网ORB互联协议)1997年颁布的CORBA2.1增加了COM/CORBA互操作规范1998年颁布的CORBA2.2增加了移植性的对象适配器(POA:PortableObjectAdapter)和IDL到Java语言的映射规约,OMA中增加了领域接口部分2001年颁布的CORBA3.0增加了CCM(CORBAComponentModel:CORBA构件模型),提供容器作为构件的运行环境CORBA的组成客户程序Client对象实现Server动态调用客户IDL存根ORB接口动态框架接口静态框架接口对象适配器对象请求中间件核心(ORBCore)接口仓库实现库CORBA的基准模型对象请求代理(ORB)对象服务应用对象公共设施基准模型描述了分布式对象系统的基本成分(1)CORBAService(对象服务)是一组系统级对象,为实现和管理对象提供了基本功能,包括名字、生存周期服务、事务服务、安全服务等(2)ORB是核心,它提供了一种机制,使得对象可以透明的发送请求和接受响应ORB与对象服务相结合,确保符合CORBA基准的应用构件之间有效的通信(3)CORBAFacilities(公共设施)是适用于众多应用领域的通用构件,例如信息管理、系统管理、任务管理和用户界面等(4)ApplicationObject(应用对象)是专用于特定领域的构件CORBA的基准模型(续)对象类的上下文关系ORB的体系结构接口仓库IDL编译程序实现仓库客户机对象实现GIOP/IIOPDII客户代理ORB内核ORB接口Operation()输入参数输出参数+返回值对象适配器实现骨架DSIORB体系结构定义一个描述客户机如何向远程对象发送请求并得到回答的框架ORB的职责ORB给分布式对象提供了透明发送请求和接受响应的机制,主要包括以下职责:负责根据客户机给出的对象引用定位相应的远程对象实现,激活远程对象实现,建立与远程对象实现的连接客户端ORB接受客户机请求的参数,将参数打包,通过ORB互联协议(如IIOP协议)跨网络送给服务器端的ORB服务器端的ORB接受通过ORB互联协议跨网络传送过来的参数,并将这些参数解包,发送给对象实现负责将对象实现响应客户机的请求后的输出参数、返回值等,以同样的打包/解包方式,传回给客户机ORB内核和ORB接口ORB内核提供了对象的通用表示和对象间通信的机制。客户和对象实现通过ORB接口的形式访问ORB内核提供的功能ORB接口是客户与对象实现可以直接访问到的、抽象描述ORB操作的接口,ORB接口由ORB内核实现,它不倚赖于任何的对象适配器,ORB接口主要包括:ORB初始化(ORB-init)获取初始对象引用对象引用操作策略域的管理线程有关的操作ORB的实现方式
位于客户和对象实现内部的ORB
基于服务器的ORB基于系统的ORBORB的对象适配器OAOA是对象实现访问ORB所提供服务的主要方式,由于对象实现方式不同,ORB内核很难为所有对象提供方便有效的单一接口,通过OA,ORB可以定制接口,为一组特定的对象实现提供服务,OA负责的主要功能有:生成和解释对象引用,方法调用、注册、激活和冻结对象实现,将对象引用映射到相应的对象实现BOA(基本对象适配器)着重CORBA服务器实现POA(可移植对象适配器)规约将CORBA对象定义为具有标识、接口和实现的抽象实体,负责把CORBA对象概念适配为编程语言的服务体(Servant)概念,允许编程人员构造可移植的对象实现对象适配器ORB通过对象适配器提供的服务通常包括生成和解释对象引用方法调用交互的安全性对象和实现的激活及冻结将对象引用映射到实现注册实现对象粒度、寿命、策略、实现风格等的明显区别使得
ORB核心很难为所有对象提供方便和有效的单一接口通过对象适配器
ORB可以将一组特定的对象实现作为目标对象适配器的作用ORB的接口仓库和实现仓库接口仓库(InterfaceRepository:IR)是储存、发布、管理相关对象接口定义的集合,通常以IDL文件作为输入,将接口描述信息经过处理后存放在文件、数据库或者其它形式的存储机制中,并提供一组标准的调用接口供运行时动态查询实现仓库包含了允许ORB激活和定位对象实现的信息,一般来说,对象实现的安装和与对象实现的激活及执行有关的策略控制都是通过实现仓库上的操作完成的客户桩和实现骨架客户桩又称为IDLStubs,是由IDL编译程序根据IDL文件生成的,与编程语言相关的客户端代码段,客户桩向客户提供一个因接口而异的API实现骨架又称为IDLSkeleton,是由IDL编译程序根据IDL文件生成的,与编程语言相关的服务器端代码框架,实现骨架提供将对象适配器转发的请求调度到对象实现上的代码动态激活接口DII和动态骨架接口DSIDII(DynamicInvocationInterface)是一种允许动态创建和激活对CORBA对象请求的客户端接口,根据客户代码提供的要调用的对象、要执行的操作、操作的参数集和参数类型等信息(其中包括从接口仓库中获得的各种动态信息),在运行时动态创建和激活对对象的请求DSI(DynamicSkeletonInterface)是一种允许将请求在运行时从对象适配器动态提交给对象实现的接口。DSI要求实现代码必须向ORB提供所有操作参数的描述,ORB则提供输入参数的值,以便在执行操作时使用,在执行操作后,实现代码向ORB提供输出参数的值或者异常CORBA请求发送和响应的方法客户机与远程对象发送和接受请求的方法主要有两种:静态方法和动态方法,静态方法更为普遍静态方法要求在编译时已知所有的IDL接口,由IDL编译程序生成客户端的桩代码和服务器端的骨架代码,并分别链接到客户机程序和对象实现中对于动态方法,在编译时客户机和服务器端程序都不知道IDL接口。运行时,客户端使用DII(动态激活接口)向对象实现发出请求,服务器端对象适配器使用DSI(动态骨架接口)访问对象实现,两者之间的接口信息从ORB接口仓库中动态获取ORB通信协议模型ClientStubORBClientServer-objectServer-objectServerSkeletonServerSkeletonORB(Java)ORB(C++)IIOPIIOPCORBA构件模型构件模型的产生CORBA3.0首次提出了构件模型,扩充了CORBA的对象模型CORBA构件模型(CORBAComponentModel:CCM)是一种用来构建和部署CORBA应用程序的服务器端构件模型,其设计思想比较类似于EJB,大量的代码生成以及系统功能的实现由容器提供者而不是应用程序自己来完成CCM的体系结构主要包含:抽象构件模型,构件实现框架(ComponentImplementationFramework:CIF),构件的包装、组织和部署,构件容器框架等抽象构件模型(1)CCM抽象构件模型定义了服务器端构件及其交互构件插座(uses)事件接收器(consumes)事件源(publishes,emits)构件接口(supports)呈面(provides)属性(1)构件接口唯一标识了构件的实例,客户可通过对构件接口的引用来调用构件的操作,支持一个或多个接口例:
interfaceA,B;//ForwarddeclarationcomponentFoosupportsA,B//definitionofequivalentinterface{//anditssupportedinterfacesprovidesW,X,Y,Z;//Facets(providedinterfaces.)…//othercomponentdefinitions};抽象构件模型(2)(2)呈面标识构件向客户提供的可访问的功能接口,上例中,呈面W,X,Y,Z标识构件提供的W,X,Y,Z接口(3)插座(receptacles)是构件之间连接(connection)的描述模型。IDL中的关键字“uses”用于定义构件与要连接的接口之间的关系,如:
Checkout{…};componentShoppingCart{usesCheckoutthe_checkout;}抽象构件模型(3)(4)事件接收器(eventsink)和事件源(eventsource)CCM支持发布/订阅事件模型,属于推(push)模型,事件使用者(consumer,或称为事件接收器)先订阅(subscribe)某类事件,此后,事件产生者(supplier,或称为事件源)把事件推给使用者作为事件源的构件产生事件的方式有两种:(1)发布(publishes)方式:在产生事件的构件与任一接收者之间建立专门通道(2)广播(emits)方式:利用多个产生者共享的通道广播事件构件也可能接收别的构件产生的事件,用关键字”consumes”说明抽象构件模型(4)(5)属性主要用于构件部署(6)构件实例是由Home来管理,一个Home管理某一类构件的所有实例.Home要求所有的实例在一处生成,从而有效管理其生命周期,这是工厂设计模式的典型应用抽象构件模型(5)构件的容器框架容器提供服务方的运行环境,CORBA构件使用一个容器来实现对系统服务的访问CORBA构件内部接口POA回调接口容器外部接口构件HomeCORBA构件内部接口POA回调接口容器外部接口构件HomeORB事务安全持久状态通知CORBA构件接口为了使客户能够准确、方便地访问服务,服务的提供者必须对自身进行准确的描述,并以一定的方式提供给客户
接口的定义是必须的接口的必要性接口模块(Module)通常由接口(Interface)和实现(Implementation)两部分组成模块接口刻画了各个模块是如何耦合的模块的实现部分是各个模块的内部事务模块是什么?其它模块的设计者和使用者需要知道其它模块的设计者和使用者不需要知道功能性描述是对接口中各个操作调用方式的描述,分为对输入和输出两个部分的描述约束性描述是对功能以外特征的描述,不仅包括异常处理、执行语义等简单内容,还包括行为特征和同步特征接口包含的具体内容以描述结构化程序的功能为主(如RPC-IDL,微软的-IDL)以描述对象的功能为主(如CORBA的IDL)以描述服务为主(如webservice的WSDL服务描述语言)几种接口定义语言为什么需要IDL?IDLSmalltalkCobolJavaAda-95C++CIDL可转换为多种编程语言,用其它语言实现OMGIDL编译器IDLidl2javaIdl2c++ClientstubServerskeletonClientstubServerskeletonIDL编译器的工作流程IDL编译器CORBA库CORBA库本地代理
目标对象存根代码XXXC.X框架代码XXXS.X客户程序服务器程序客户程序像访问本地对象一样访问远程对象保存接口把对象接口映射成某种语言IDL的任何基本类型映射到特定语言中时保持其size不变,但可能改变其标识范围(Range)IDL自定义类型包括对特殊类型的重命名和复杂类型的定义,复杂类型包括EnumerationStructureUnionSequencearrayIDL的数据类型类似于C++中枚举类型的定义方式:enumColor{red,green,blue,black,orange};IDL不定义枚举类型中各个成员的特定序号,只定义一种对比关系(序号由左向右增加)与C++不同,IDL不允许控制枚举成员的序号,比如:
enumColor{red=0,green=7};//不合法定义枚举类型表示一个闭包的命名空间,任何枚举成员不能重复出现在多个枚举类型中
enumInteriorColor{white,blue,grey};
enumExteriorColor{yellow,blue,green};//不合法不允许定义空的枚举类型IDL数据类型-Enumeration结构中通常包含一个或多个任意类型的成员,包括用户自定义的复杂类型
structTimeofDay{shorthour;shortminute;shortsecond;};结构允许嵌套定义
structOuter{structFirstNested{longfirst;longsecond;}firstS;structSecondNested{longfirst;longsecond;}secondS;};IDL数据类型-StructureIDL联合类型完全不同于C++中的联合
unionColorCountswitch(Color){casered:casegreen:caseblue:unsignedlongnum_in_stock;caseblack:floatdiscount;default:stringorder_details;};联合中的成员类型可以是任意类型,包括用户定义的复杂类型,而鉴别器类型必须是整型(char,short,long,boolean,enum)IDL数据类型-Uniondefault在联合类型中是一个可选项,不过,只要它存在于联合类型中,就必须要代替一种特定的情况(其它情况均不成立),该情况不能为空,否则是不合法的
unionUswitch(boolean){caseFALSE:longcount;caseTRUE:stringmessage;default://Illegal,defaultcasecannothappenfloatcost;};IDL数据类型-UnionIDL支持一维和多维数组
typedefColorColorVector[10];typedefstringIDtable[10][20];数组必须用typedef关键字定义,每一维元素个数必须明确定义
typedefstringIDtable[][20];//
ErrorIDL数据类型-Array序列是IDL特有的特殊数据类型,其本质是变长数组,可包含任意类型元素,可以是有界的或无界的
typedefsequence<Color>Colors;typedefsequence<long,100>Numbers;序列是可空的IDL数据类型-Sequencetypedef
unsignedlongPhoneNumber;typedef
stringGuestName,Address;enumChargeCard
{MasterCard,Visa,AmericanExpress};
structGuestRecord{
GuestName
name;
Address
address;
PhoneNumber
number;
ChargeCard
card_kind;
unsignedlongcard_number,expiration;};typedef
sequence<GuestRecord>GuestList;IDL类型定义示例typedef
structEmployeestruct{
stringname;
Addressaddress;
unsigned
longsocial_security_number;}Employee;typedef
EmployeeRecord
Employee[100];enumPersonKind
{A_GUEST,AN_EMPLOYEE,AN_OTHER};unionPersonswitch(PersonKind){ caseA_GUEST:
GuestRecord
guest_record; caseAN_EMPLOYEE
EmployeeRecord
employee_record; default:stringdescription;};IDL类型定义示例(续)接口通过interface关键字来定义
interface
Calculator{shortadd(inshorts1,inshorts2);shortsub(inshorts1,inshorts2);shortmul(inshorts1,inshorts2);shortdiv(inshorts1,inshorts2);};IDL接口定义了分布对象对外表现的细节,每个IDL接口定义了一个新对象类型对接口的访问通过调用接口内定义的操作来实现,操作是接口的核心,是服务请求的入口点接口清晰地划分了服务实现与客户之间的边界IDL接口(Interface)接口中定义的所有内容都具有public属性IDL接口中不包含成员变量,客户端所有的请求均通过调用接口中的相关操作来实现每个CORBA对象只对应一个接口,而每个接口则对应于若干CORBA对象换句话说:IDL接口对应于C++类的定义,而CORBA对象则对应于C++类的实例IDL接口(Interface)IDL接口组成一个名字空间接口中可以嵌套其它的定义,如Constantdefinition常量定义Typedefinition类型定义Exceptiondefinition异常定义Attributedefinition属性定义Operationdefinition操作定义接口不支持嵌套定义接口的语法interfaceHaystack
{
exception
NotFound
{
unsignedlongnum_straws_searched;
};
//异常定义
constunsignedlongMAX_LENGTH
=10;
//常量定义
readonlyattributeunsignedlongnum_straws;
//属性定义
typedeflong
Needle;
//类型定义
typedefstring
Straw;
voidadd(inStraw
s);
//操作定义
booleanremove(inStraw
s);
voidfind(inNeedle
n)raises(NotFound);};接口的语法操作定义必须包括:返回值类型(非匿名类型);操作名字(不可重载);零个或多个参数声明。操作不区分读写操作例如:interfacesimple{voidop();//注意:voidop(void)是错误的
//同样:op();也是错误的
};接口例子:interfacePrimes{typedefunsignedlongprime;primenext_prime(inlongn);voidnext_prime2(inlongn,outprimep);voidnext_prime3(inoutlongn);};其中in表示从Client->Server;out表示从Server->ClientIDL操作操作签名(Signature)的一般形式为:
[oneway]<op_type_spec><identifier>(param1,...,paramL)[raises(except1,...,exceptN)][context(name1,...,nameM)]其中:Oneway表示该操作为异步操作,操作机制类似于UDP数据报通信,是一种不可靠的信息传输机制:返回类型必须为void;不包含out参数或inout参数;不包含raise表达式
<op_type_spec>是返回结果的类型<identifier>为接口中的操作提供名称raises指示可能引发的异常处理context指示有效的请求环境信息IDL操作(续)CORBA保证发出请求的客户总是可以接收到一个成功的返回或者一个异常异常被分为两类:用户自定义异常和系统异常,IDL定义了29个系统异常,具有不同的名字,但共用同一个异常体异常的声明类似于IDL结构类型exceptionCardExpired{stringexpiration_date;};exceptionCreditLimitExceeded {unsignedlongcredit_limit;};exceptionCardReportedStolen{
string
reporting_instructions;
unsignedlonghotline_phone_number;};IDL异常(Exceptions)IDL接口可定义公共属性,属性可以是只读的(Read-only)或者可读写的(read-write),属性定义不包含raise表达式只读属性代表一个基本操作,可进行读操作可读写属性代表一对基本操作,可进行读写操作IDL属性interfaceThermostat{readonlyattributeshort
temperature;attributeshort
nominal_temp;};在语义上等价于:interfaceThermostat{
shortget_temperature();
shortget_nominal_temp();
voidset_nominal_temp(inshort
t);};模块是为IDL定义、创建、分离名字的空间,防止不同模块中标识之间的冲突模块可以嵌套;CORBAServices对模块进行了扩充,每个服务定义一个或多个模块模块内的名字可通过如下方式引用:Part::Assembly::ComponentWidgetIDL模块(Modules)module
Part{
typedef
Assembly::WidgetPartWidget;
module
ComponentPart{typedef
PartWidgetComponentWidget;};};IDL模块定义的主要内容常量类型异常接口模块常量类型异常操作属性CORBA应用开发典型的CORBA应用开发过程IDLIDLCompileIDLCompile客户机服务器ORB库客户机桩ORB库服务器骨架客户机程序开发者服务器程序开发者使用静态调用的CORBA应用开发过程IDLFileidl2javaidl2cppidl2java客户桩骨架JavaCompileJavaCompileC++Compile客户程序对象实现ClientProgramObjectImplementORB内核StubSkeleton客户端和服务器端使用同一开发环境客户端和服务器端使用不同开发环境IONA公司的Orbix:Orbix是全球范围内部署最广泛的企业CORBA解决方案(企业版/标准版/大型主机版),为全球规模最大要求最高的面向服务的体系结构(SOA)
提供了基础结构Inprise公司的visibroker:提供visibrokerforjava,visibrokerfordephi,visibrokerforc++三个版本,主要实现了CORBA中的ORB核心技术,同时又为CORBA提供了一些扩充功能Digital公司的ObjectBroker:.NET平台一款开源O/R映射框架IBM公司的ComponentBrokerOOC公司的OminiBrokerORB产品一个简单的CORBA应用开发(自学)例:网格对象调用,客户远程调用服务器网格对象GridObject的get()和set()操作,开发环境为C++编程语言网格对象客户机服务器widthheightget(row,col)set(row,col,value用IDL定义接口//grid.idlinterface
Grid{
readonlyattributeshortheight;readonlyattributeshortwidth;
void
set(in
shortrow,in
shortcol,in
longvalue);
void
get(in
shortrow,in
shortcol,out
shortvalue);};编译IDL文件grid.idl客户机服务器Grid.idlgridC.cc客户机桩ORB客户机库gridS.cc服务器骨架ORB服务器库Grid.hh公用的说明//grid.hhclassGrid:publicvirtualCORBA::Object{public:staticGrid_ptr_bind(…);virtualCORBA::Shortheight(CORBA::Environment&);virtualCORBA::Shortwidth(CORBA::Environment&);virtualvoidset(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Longvalue,CORBA::Environment&);
virtualvoidget(CORBA::Shortrow,CORBA::Shortcol,CORBA::Environment&);};编译grid.idl生成的文件//用C++语言定义对象实现Grid_i#include“grid.hh”classGrid_i:publicvirtualGridBOAImpl{
shortm_height,m_width;
long**m_array;public:
Grid_i(shorth,shortw);virtual~Grid_i();virtualCORBA::shortheight(CORBA::Environment&);
virtualCORBA::shortwidth(CORBA::Environment&);接口实现virtualvoid
set(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Longvalue,CORBA::Environment&);
virtual::Longget(CORBA::Shortrow,CORBA::Shortcol,
CORBA::Environment&);};virtualCORBA::shortGrid_i::width(CORBA::Environment&){returnm_width;}virtualCORBA::shortGrid_i::height(CORBA::Environment&){returnm_height;}virtualvoid
Grid_i::set(CORBA::Shortrow,CORBA::Shortcol,CORBA::Longvalue,CORBA::Environment&){m_array[row][col]=value;}
virtual::LongGrid_i::
get(CORBA::Shortrow,
CORBA::Shortcol,CORBA::Environment&){returnm_array[row][col];}接口实现(续)#include“grid.hh”#include<iostream.h>main(){Grid_imyGrid(100,100);try{CORBA::Orbix.impl_is_ready();}catch(…)cout<<“Serverterminating”<<endl;};编写服务器端程序#include“grid.hh”#include<iostream.h>main(){Grid_varp;//类似于C++指针,连接到Grid对象
p=Grid::_bind(“myGrid:GridSrv”,GridHost);cout<<“heightis”<<p->height()<<endl;
cout<<“widthis”<<p->width()<<endl;
p->set(2,4,123);cout<<“grid[2,4]is“<<p->get(2,4)<<endl;};编写客户端程序银行系统的一个简单实例,包含查询和建户操作描述实例2-定义IDL文件//Bank.idlmoduleBank{interfaceAccount{floatbalance(instringname);//返回帐户存款余额操作voiddeposit(instringname,infloatamount);//存款voidwithdraw(instringname,infloatamount);//取款
};interfaceAccountManager{Accountopen(instringname,infloatinitvalue);//创建帐户操作voiddelete(instringname);//删除帐户booleanfind(instringname);//查找帐户
};};通过JDK提供的IDLJava编译器idlj
生成如下文件Java接口定义文件客户端桩代码服务器端骨架代码:对象实现的基类接口助手类文件:*Helper.java接口支持类文件:*Holder.java实例2-编译后自动生成的文件publicclassAccountImplextendsBank._AccountImplBase{privatefloatvalue;privateStringname;publicAccountImpl(Stringname,floatvalue){this.value=value;=name;}publicfloatbalance(Stringname){returnvalue;}publicvoiddeposit(Stringname,floatamount){ }publicvoidwithdraw(Stringname,floatamount){ }}实例2(组件实现部分AccountImpl.java)publicclassAccountManagerImplextendsBank._AccountManagerImplBase{privateDictionary_accounts=newHashtable();privateRandom_random=newRandom();publicAccountManagerImpl(Stringname){ super();}p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工装包工合同范本
- 《凉山彝族自治州精准扶贫研究》
- 《徐州地区技巧运动开展现状及对策研究》
- 2024年度物业管理公司与绿化维护合同
- 2024年度船舶股份转让合同范本
- 清洁阿姨合同范本
- 2024年度股权转让合同详细条款和条件
- 2024年度知识产权保护委托协议
- 2024年度货运代理合同服务内容与费用结构
- 2024年度景区卫生间环保设施安装与维护合同
- APQP产品设计与开发(共97页).ppt
- 平乐郭氏正骨外治方药撷英
- 国华太仓电厂600MW超临界直流炉控制策略
- Invoice商业发票模板
- 金属平衡管理办法
- 退房通知书模板
- 行政服务中心窗口工作人员手册
- 初中语文教学中生本理念的实践分析
- 饮料与健康调查活动报告书
- 中国移动通信集团应聘信息表
- 最新患者用药情况监测
评论
0/150
提交评论