版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java分布式處理技術(shù)(RMI,JDNI)1.1 RMI的基本概念1.1.1什么是RMIRMI(Remote Method Invocation)遠(yuǎn)程方法調(diào)用是一種計算機(jī)之間對象互相調(diào)用對方函數(shù),啟動對方進(jìn)程的一種機(jī)制,使用這種機(jī)制,某一臺計算機(jī)上的對象在調(diào)用另外一臺計算機(jī)上的方法時,使用的程序語法規(guī)則和在本地機(jī)上對象間的方法調(diào)用的語法規(guī)則一樣。1.1.2RMI的用途1、分布式體系結(jié)構(gòu)我們?yōu)槭裁匆褂梅植际接嬎隳兀慨?dāng)我們想與多個用戶或客戶機(jī)共享一個中央資源(如一個數(shù)據(jù)庫)時,就會使用分布式計算。分布式計算用來利用多個系統(tǒng)的組合計算能力,以便比在單個系統(tǒng)上更有效或更快地解決問題??梢杂枚喾N方法配
2、置多個計算機(jī)系統(tǒng)以共享處理,包括共享內(nèi)存、共享磁盤或只是共享一條公共通信通道。最新的技術(shù)允許物理上相隔很遠(yuǎn)的系統(tǒng)能夠在處理計算問題時協(xié)同工作。關(guān)于利用計算能力這一主題,因特網(wǎng)及伴隨的通信協(xié)議TCP/IP的 出現(xiàn)已使無數(shù)的計算機(jī)系統(tǒng)史無前例地連接起來。對一些應(yīng)用程序來說,能夠利用如此多的計算功能來解決問題是令人滿意的。甚至更吸引人的是,大多數(shù)計算機(jī)系 統(tǒng)都有充足的空閑時間,可以幫助解決其它問題。將來,網(wǎng)格計算會利用分布式計算能力進(jìn)行出售,這與電力行業(yè)出售電能非常相似。2、Java分布式對象編程技術(shù)RMI是Enterprise JavaBeans的支柱,是建立分布式Java應(yīng)用程序的方便途徑。只要
3、按照RMI規(guī)則設(shè)計程序,可以不必再過問在RMI之下的網(wǎng)絡(luò)細(xì)節(jié)了,如:TCP和Socket等等。任意兩臺計算機(jī)之間的通訊完全由RMI負(fù)責(zé)。調(diào)用遠(yuǎn)程計算機(jī)上的對象就像本地對象一樣方便。1.1.3RMI應(yīng)用程序分類依據(jù)RMI應(yīng)用程序各部分職責(zé),可對應(yīng)用程序進(jìn)行如下分類:服務(wù)器程序:服務(wù)器程序?qū)?chuàng)建多個遠(yuǎn)程對象,并使每個對象能夠被引用。等待客戶端調(diào)用創(chuàng)建好的遠(yuǎn)程對象上的方法??蛻舳顺绦颍簭姆?wù)端程序中得到一個或多個遠(yuǎn)程對象的引用??蛻舳四苡么艘谜{(diào)用遠(yuǎn)程對象上的方法。對等計算程序:雙方地位相等,互為對方的服務(wù)器和客戶端。1.2創(chuàng)建RMI應(yīng)用程序步驟1、定義遠(yuǎn)程接口在Java中,遠(yuǎn)程對象是實現(xiàn)遠(yuǎn)程接口的
4、類的實例,遠(yuǎn)程接口聲明每個要遠(yuǎn)程調(diào)用的方法。在需要創(chuàng)建一個遠(yuǎn)程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細(xì)節(jié),客戶通過接口句柄發(fā)送消息即可。遠(yuǎn)程接口具有如下特點:遠(yuǎn)程接口必須為public屬性。如果不這樣,除非客戶端與遠(yuǎn)程接口在同一個包內(nèi),否則當(dāng)試圖裝入實現(xiàn)該遠(yuǎn)程接口的遠(yuǎn)程對象時,調(diào)用會得到錯誤結(jié)果。遠(yuǎn)程接口必須擴(kuò)展接口java.rmi.Remote。除與應(yīng)用程序本身特定的例外之外,遠(yuǎn)程接口中的每個方法都必須在自己的throws從句中聲明java.rmi.RemoteException。(或RemoteException的父類)。代碼范例1package com.itjob;import
5、 java.rmi.*;public interface RmiSample extends Remotepublic int sum(int a,int b) throws RemoteException;2、實現(xiàn)遠(yuǎn)程接口遠(yuǎn)程對象實現(xiàn)類必須擴(kuò)展遠(yuǎn)程對象java.rmi.UnicastRemoteObject類, 并實現(xiàn)所定義的遠(yuǎn)程接口。遠(yuǎn)程對象的實現(xiàn)類中包含實現(xiàn)每個遠(yuǎn)程接口所指定的遠(yuǎn)程方法的代碼。這個類也可以含有附加的方法,但客戶只能使用遠(yuǎn)程接口中的方 法。因為客戶是指向接口的一個句柄,而不是它的哪個類。必須為遠(yuǎn)程對象定義構(gòu)造函數(shù),即使只準(zhǔn)備定義一個默認(rèn)構(gòu)造函數(shù),用它調(diào)用基礎(chǔ)類構(gòu)造函數(shù)。因為
6、基礎(chǔ) 類構(gòu)造函數(shù)可能會拋出java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。代碼范例2package com.itjob.rmi;import java.rmi.*;import java.rmi.server.*;import com.itjob.RmiSample ;/*遠(yuǎn)程接口實現(xiàn)類,繼承了UnicastRemoteObject并實現(xiàn)了RmiSample遠(yuǎn)程接口*/public class RmiSampleImpl extends UnicastRemoteObject implements RmiSampl
7、e/覆蓋默認(rèn)構(gòu)造函數(shù)并拋出RemoteExceptionpublic RmiSampleImpl() throws RemoteExceptionsuper();/所有遠(yuǎn)程實現(xiàn)方法必須拋出RemoteExceptionpublic int sum(int a,int b) throws RemoteExceptionreturn a+b;3、編寫服務(wù)器類包含main方法的類可以是實現(xiàn)類自身,也可以完全是另一個類。下面通過RmiSampleServer來創(chuàng)建一個遠(yuǎn)程對象的實例,并通過java.rmi.registry.LocateRegistry類的createRegistry方法從指定端口號啟
8、動注冊服務(wù)程序,也可以通過執(zhí)行rmiregistry命令啟動注冊服務(wù)程序,注冊服務(wù)程序的缺省運行端口為1099。代碼范例3package com.itjob.rmi;import java.rmi.*;import java.rmi.registry.*;public class RmiSampleServerpublic static void main(String args)/*創(chuàng)建和安裝一個安全管理器,令其支持RMI.作為Java開發(fā)包的一部分*適用于RMI唯一一個是RMISecurityManager.*if(System.getSecurityManager() = null) S
9、ystem.setSecurityManager(new RMISecurityManager();*/tryLocateRegistry.createRegistry(8808);RmiSampleImpl server=new RmiSampleImpl();Naming.rebind(/localhost:8808/SAMPLE-SERVER,server);System.out.println (遠(yuǎn)程對象注冊成功,RMI服務(wù)已經(jīng)啟動,等待客戶端調(diào)用.);catch(.MalformedURLException me)System.out.println (Malformed URL:+
10、me.toString();catch(RemoteException re)System.out.println (Remote exception:+re.toString();catch(AlreadyBoundException abe)System.out.println (AlreadyBoundexception:+abe.toString();代碼范例3中將將遠(yuǎn)程對象名字綁定到對遠(yuǎn)程對象的引用上:LocateRegistry.createRegistry(8808);指定本RMI服務(wù)程序不使用默認(rèn)端口1099,而是使用自己指定的端口8808。Naming.rebind(/loc
11、alhost:8808/SAMPLE-SERVER , Server);將遠(yuǎn)程對象在服務(wù)器上注冊并指定了將查找遠(yuǎn)程對象引用的URL,URL格式為/host:port/name。其中host是注冊表所在的主機(jī)(遠(yuǎn)程或本地),port是注冊表接受調(diào)用的端口號,name是未經(jīng)注冊表解釋的簡單字符串。host和port兩者都是可選項。如果省略了host,則主機(jī)默認(rèn)為本地主機(jī)。如果省略了port,則端口默認(rèn)為1099,該端口是RMI的注冊表rmiregistry使用的“著名”端口。代碼范例3的運行結(jié)果如圖所示:圖14.1代碼范例3運行結(jié)果4、編寫使用遠(yuǎn)程服務(wù)的客戶機(jī)類客戶機(jī)類的主要功能有兩個,一是通過N
12、aming.lookup方法來構(gòu)造注冊服務(wù)程序stub程序?qū)嵗?,二是調(diào)用服務(wù)器遠(yuǎn)程對象上的遠(yuǎn)程方法。代碼范例4package com.itjob.rmi;import java.rmi.*;import java.rmi.server.*;public class RmiSampleClient public static void main(String args)try String url = /localhost:8808/SAMPLE-SERVER;RmiSample RmiObject = (RmiSample)Naming.lookup(url);System.out.print
13、ln( 1 + 2 = + RmiObject.sum(1,2) ); catch (RemoteException exc) System.out.println(Error in lookup: + exc.toString(); catch (.MalformedURLException exc) System.out.println(Malformed URL: + exc.toString(); catch (java.rmi.NotBoundException exc) System.out.println(NotBound: + exc.toString();5、為遠(yuǎn)程對象實現(xiàn)創(chuàng)
14、建根和干客戶端是通過Naming.lookup方法來構(gòu)造注冊服務(wù)程序stub程序?qū)嵗?,通過該實例的引用來發(fā)起對遠(yuǎn)程對象方法調(diào)用的,所以在運行運行客戶端應(yīng)用前必須為遠(yuǎn)程對象實現(xiàn)創(chuàng)建根(stub)和干(Skeleton)。要創(chuàng)建存根程序和骨架文件,應(yīng)以包含遠(yuǎn)程對象實現(xiàn)的已編譯類包全名運行rmic編譯器。存根(Stub)是遠(yuǎn)程對象在客戶端的代理,它將RMI調(diào)用傳遞給服務(wù)器端的骨架(Skeleton),后者負(fù)責(zé)將該調(diào)用傳遞給實際的遠(yuǎn)程方法。在命令行模塊下運行RMIC調(diào)用:圖14.2RMIC命令調(diào)用RMIC命令運行結(jié)果如圖所示:圖14.3 RMIC運行結(jié)果我們可以看系統(tǒng)幫我們生成了存根(stub)Rmi
15、SampleImpl_Stub.class但系統(tǒng)并沒有幫我們生成骨架(Skeleton)RmiSampleImpl_Skeleton.class。這與JDK的版本有關(guān):采用JDK1.4版本運行rmic com.itjob.rmi. RmiSampleImpl命令系統(tǒng)將會生成存根(stub)RmiSampleImpl_Stub.class和骨架(Skeleton)RmiSampleImpl_Skeleton.class兩個類文件;采用JDK1.5版本運行rmic com.itjob.rmi. RmiSampleImpl命令系統(tǒng)將只會生成存根(stub)RmiSampleImpl_Stub.cla
16、ss,骨架(Skeleton)RmiSampleImpl_Skeleton.class的功能將通反射技術(shù)由系統(tǒng)在運行時自動實現(xiàn);6、運行程序依次做完上述步驟后,我們現(xiàn)在來運行一下我們的RMI應(yīng)用。先運行服務(wù)端程序,運行結(jié)果如圖14.1所示。接下來我們運行客戶端程序(代碼范例4),運行結(jié)果如圖所示:圖14.4客戶端程序運行結(jié)果看到上面結(jié)果說明我們客戶端程序進(jìn)行RMI遠(yuǎn)程調(diào)用已經(jīng)成功了。1.3 RMI接口和類簡介負(fù)責(zé)指定rmi系統(tǒng)遠(yuǎn)程對象行為的接口和類在java.rmi包中定義的,接下來我們了解一下幾個核心接口和類:1、Java.rmi.Remote接口在rmi中,遠(yuǎn)程接口聲明了可從遠(yuǎn)程java虛
17、擬機(jī)中調(diào)用的方法集,遠(yuǎn)程接口必須滿足下列條件:遠(yuǎn)程接口必須至少直接或間接的擴(kuò)展java.rmi.Remote接口。遠(yuǎn)程接口中的方法申明必須滿足:遠(yuǎn)程方法申明在其throws子句中除了要包含與應(yīng)用程序有關(guān)的異常之外,還必須包括RemoteException異常(或她的父類);在遠(yuǎn)程方法申明中,作為參數(shù)或返回值申明的遠(yuǎn)程對象必須申明為遠(yuǎn)程接口,而非該接口的實現(xiàn)類。2、Java.rmi.RemoteException類RemoteException類是在遠(yuǎn)程方法調(diào)用期間由RMI運行所拋出的異常,在使用了rmi系統(tǒng)的應(yīng)用程序中,遠(yuǎn)程接口中申明的遠(yuǎn)程方法在其throws子句中必須指定RemoteExce
18、ption或者其超類。當(dāng)遠(yuǎn)程方法調(diào)用由于某種原因失敗時,將拋出RemoteException異常。RemoteException類是一個已檢驗的異常,而不是RuntimeException。3、Java.rmi.server.RemoteObject類RMI服務(wù)器函數(shù)由RemoteObject類及其子類RemoteServer,UnicastRemoteObject和Activatabble提供。RemoteObject為遠(yuǎn)程對象敏感的Object方法,hashCode,equals和toString方法提供實現(xiàn)。創(chuàng)建遠(yuǎn)程對象并將其導(dǎo)出,所需的方法由類UnicastRemoteObject和A
19、ctivatable提供,子類可以識別遠(yuǎn)程方法。UnicastRemoteObject定義了單個調(diào)用的遠(yuǎn)程對象,其引用只有在服務(wù)器進(jìn)程運行時才有效。類Activatable是抽象類,它定義的activatable遠(yuǎn)程對象在其遠(yuǎn)程方法被調(diào)用時開始執(zhí)行,并在必要時自己關(guān)閉。4、Java.rmi.registry.LocateRegistry類LocateRegistry類用于獲得對特定主機(jī)的引導(dǎo)遠(yuǎn)程對象注冊服務(wù)程序的引用(創(chuàng)建stub),或者創(chuàng)建能在特定端口接受調(diào)用的遠(yuǎn)程對象注冊服務(wù)程序,注冊服務(wù)程序?qū)崿F(xiàn)將遠(yuǎn)程對象名與遠(yuǎn)程對象引用關(guān)聯(lián)的簡單命名語法,服務(wù)器重新啟動不會記住這些名字和遠(yuǎn)程對象之間的綁
20、定。LocateRegistry類中的方法:public static Registry getRegistry() throws RemoteExceptionPublic static Registry getRegistry(int port ) throws RemoteExceptionPublic static Registry getRegistry(String host ) throws RemoteExceptionPublic static Registry getRegistry(String host , int port) throws RemoteExceptio
21、nPublic static Registry getRegistry(String host, int port ,RMIClientSocketFactory csf ) throws RemoteExceptionPublic static Registry createRegistry(int port )throws RemoteExceptionPublic static Registry createRegistry(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteExc
22、eption5、Java.rmi.Naming類Naming類提供了存儲和獲得遠(yuǎn)程對象注冊服務(wù)程序中的遠(yuǎn)程對象進(jìn)行引用的方法Naming類中的方法以url的形式作為其中的一個參數(shù),/host:port/name當(dāng)遠(yuǎn)程對象使用rmi注冊服務(wù)程序在本地主機(jī)上進(jìn)行過注冊后,遠(yuǎn)程主機(jī)上的調(diào)用程序就可以按名稱查詢遠(yuǎn)程對象,獲得其引用,然后在對象上調(diào)用遠(yuǎn)程方法。Public static Remote lookup(String name) throws NotBoundException, MalformedURException, RemoteExceptionPublic static void b
23、ind(String name, Remote obj) throws AlreadyBoundException, MalforedURException, RemoteExceptionPublic static void unbind (String name) throws RemoteException, NotBoundException,MalformedURLExceptionPublic static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException6、Java
24、.rmi.server.UnicastRemoteObject類類UnicastRemoteObject創(chuàng)建并導(dǎo)出遠(yuǎn)程對象,該類實現(xiàn)的遠(yuǎn)程服務(wù)具有以下特點:將這種對象的引用至多僅在創(chuàng)建該遠(yuǎn)程對象的進(jìn)程生命周期內(nèi)有效。通過TCP傳輸與遠(yuǎn)程對象通信調(diào)用,參數(shù)和結(jié)果使用流協(xié)議在客戶端和服務(wù)器之間進(jìn)行通信。7、Stub和skeleton在遠(yuǎn)程對象的通信過程中,rmi使用標(biāo)準(zhǔn)機(jī)制:stub和skeleton圖14.5 Stub和SkeletonStub的功能初始化與包含遠(yuǎn)程對象的遠(yuǎn)程機(jī)器的連接。對遠(yuǎn)程機(jī)器參數(shù)進(jìn)行編組(寫入并傳輸)。等待方法調(diào)用結(jié)果。讀取返回值或返回的異常。將值返回給調(diào)用程序。Skele
25、ton的功能在遠(yuǎn)程機(jī)器中,每個遠(yuǎn)程對象都可以有相應(yīng)的skeleton,skeleton負(fù)責(zé)將調(diào)用分配給實際的遠(yuǎn)程對象實現(xiàn),他的主要功能如下:讀取遠(yuǎn)程方法的參數(shù)。調(diào)用實際遠(yuǎn)程對象實現(xiàn)上的方法。將結(jié)果(返回值或異常)編組(寫入并傳輸)給調(diào)用程序。1.4 JNDI基本概念JNDI誕生的理由似乎很簡單。隨著分布式應(yīng)用的發(fā)展,遠(yuǎn)程訪問對象訪問成為常用的方法。雖然說通過Socket等編程手段仍然可實現(xiàn)遠(yuǎn)程通信,但按照模式的理論來說,仍是有其局限性的。RMI技術(shù),RMI-IIOP技術(shù)的產(chǎn)生,使遠(yuǎn)程對象的查找成為了技術(shù)焦點。JNDI技術(shù)就應(yīng)運而生。JNDI技術(shù)產(chǎn)生后,就可方便的查找遠(yuǎn)程或是本地對象。1、JND
26、I是什么?JNDI(The Java Naming and Directory Interface,Java命名和目錄接口)是一組在Java應(yīng)用中訪問命名和目錄服務(wù)的API。為開發(fā)人員提供了查找和訪問各種命名和目錄服務(wù)的通用、統(tǒng)一的方式。借助于JNDI提供的接口,能夠通過名字定位用戶、機(jī)器、網(wǎng)絡(luò)、對象服務(wù)等。命名服務(wù):就像DNS一樣,通過命名服務(wù)器提供服務(wù),大部分的J2EE服務(wù)器都含有命名服務(wù)器。目錄服務(wù):一種簡化的RDBMS系統(tǒng),通過目錄具有的屬性保存一些簡單的信息。目錄服務(wù)通過目錄服務(wù)器實現(xiàn),比如微軟ACTIVE DIRECTORY等。2、JNDI的好處:包含大量命名和目錄服務(wù),可以使用相
27、同API調(diào)用訪問任何命名或目錄服務(wù)??梢酝瑫r連接多個命名和目錄服務(wù)。允許把名稱同JAVA對象或資源關(guān)聯(lián)起來,不必知道對象或資源的物理ID。使用通用接口訪問不同種類的目錄服務(wù)使得開發(fā)人員能夠集中使用和實現(xiàn)一種類型的命名或目錄服務(wù)客戶API上。1.5 JNDI應(yīng)用程序結(jié)構(gòu)JNDI的結(jié)構(gòu)由一個API和一個SPI組成,Java應(yīng)用程序?qū)嵱肑NDI API訪問各種各樣的命名和目錄服務(wù)。圖14.6 JNDI應(yīng)用程序結(jié)構(gòu)1、JNDI上下文前面提到命名服務(wù)是將名稱與對象相關(guān)聯(lián)。這種關(guān)聯(lián)被稱為綁定。一組這樣的綁定被稱為上下文,Jndi上下文可以用來查找,捆綁/解除捆綁,創(chuàng)建或者破壞綁定名稱操作在JNDI中,上下
28、文是使用javax.naming.Context接口來表示的,而這個接口也正是與命名服務(wù)進(jìn)行交互的主要接口。Context接口中的每個命名方法都有兩種重載的形式:lookup(String name):接受一個字符串名稱參數(shù),查找綁定遠(yuǎn)程對象。lookup(javax.naming.Name):接受一個結(jié)構(gòu)化的名稱,查找綁定遠(yuǎn)程對象。2、初始化上下文InitialContext是一個實現(xiàn)了Context接口的類。使用這個類作為您到命名服務(wù)的入口點。創(chuàng)建一個InitialContext對象構(gòu)造器需要采用一組屬性,形式為java.util.Hashtable或其子類之一,比如:代碼范例5Prope
29、rties props = new Properties();props.setProperty(java.naming.factory.initial, erfaces.NamingContextFactory);props.setProperty(vider.url, localhost:1099);InitialContext= new InitialContext(props);要通過JNDI進(jìn)行資源訪問,我們必須設(shè)置初始化上下文的參數(shù),主要是設(shè)置JNDI驅(qū)動的類名(java.naming.factory.initial)和提供命名服
30、務(wù)的URL(vider.url)。因為Jndi的實現(xiàn)產(chǎn)品有很多。所以java.naming.factory.initial的值因提供JNDI服務(wù)器的不同而不同,vider.url的值包括提供命名服務(wù)的主機(jī)地址和端口號。下表列出了用于所支持的服務(wù)提供程序的工廠類。表: Context.INITIAL_CONTEXT_FACTORY的值名稱服務(wù)提供程序工廠文件系統(tǒng)com.sun.jndi.fscontext.RefFSContextFactoryLDAPcom.sun.jndi.ldap.LdapCtxFactoryRMIcom.sun.
31、jndi.rmi.registry. RegistryContextFactoryCORBAcom.sun.jndi.cosnaming.CNCtxFactoryDNScom.sun.jndi.dns.DnsContextFactory1.6 RMI與JNDI集成通過上面對JNDI的了解我們可以利用JNDI來管理RMI遠(yuǎn)程對象的注冊服務(wù),我們將代碼范例3進(jìn)行如下改寫:代碼范例6package com.itjob.rmi;import java.rmi.*;import java.rmi.registry.*;import javax.naming.*;public class RmiSampl
32、eServerJndipublic static void main(String args) throws ExceptionLocateRegistry.createRegistry(8808);RmiSampleImpl server=new RmiSampleImpl();System.setProperty(Context.INITIAL_CONTEXT_FACTORY,com.sun.jndi.rmi.registry.RegistryContextFactory);System.setProperty(Context.PROVIDER_URL,rmi:/localhost:8808);InitialContext ctx=new InitialContext();ctx.bind(java:comp/env/SampleDemo,server);ctx.close();啟動服務(wù)端程序如圖所示:圖14.7 JNDI
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 游泳行業(yè)游泳技巧培訓(xùn)總結(jié)
- 零食店服務(wù)員工作技巧
- 時尚店銷售員的工作總結(jié)
- 快遞行業(yè)派送專員培訓(xùn)總結(jié)
- 《瑜伽與健康》課件
- 《卒中優(yōu)化治療》課件
- 2023年江蘇省宿遷市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2022年青海省西寧市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2021年江蘇省鹽城市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2021年河北省石家莊市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- GB 18218-2000重大危險源辨識
- 神通數(shù)據(jù)庫管理系統(tǒng)v7.0企業(yè)版-2實施方案
- 油田視頻監(jiān)控綜合應(yīng)用平臺解決方案
- 人體內(nèi)臟器官結(jié)構(gòu)分布圖詳解
- 福建省泉州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)及行政區(qū)劃代碼
- 酒精性腦病的護(hù)理查房實用版課件
- OCT青光眼及視野報告
- 三年級新教科版科學(xué)《我們來做-“熱氣球”》說課稿
- 國家電網(wǎng)有限公司十八項電網(wǎng)重大反事故措施(修訂版)
- 凈水廠課程設(shè)計
- (完整版)八年級上綜合性學(xué)習(xí)-我們的互聯(lián)網(wǎng)時代-練習(xí)卷(含答案)
評論
0/150
提交評論