版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第15章 EJB 网络应用程序开发(1),2,15.1 EJB 简介,EJB(Enterprise Java Bean)组件。 在JavaEE中,组件技术是非常重要的内容。组件实现了系统的大部分功能,它们运行在性用的服务器上供客户端进行调用。 在JavaEE中重要的组件有2类: 1.EJB组件。 2.web组件。 EJB开发是J2EE的核心内容。在典型型的JavaEE四层模型中,EJB位于业务层,主要用来实现企业级应用中的业务逻辑。,3,JavaEE业务逻辑从客户端软件中抽取出来,封装在一个组件中,这个组件运行在一个独立的服务器上,客观端软件通过网络调用组件提供的服务以实现业务逻辑,而客户端的
2、功能单纯到只负责发送调用请求和显示处理结果。在JavaEE中,这个运行在一个独立的服务器上,并封装了业务逻辑的组件就是EJB(Enterprise Java Bean)组件。,4,EJB应用的典型架构,5,6,EJB的实现技术,EJB是运行在独立服务器上的组件,客户端是通过网络对对象进行调用的。在Java中,能够实现远程对象调用的技术是RMI,EJB的技术正是RMI。通过RMI技术,JavaEE将EJB组件创建为远程对象,客户端就可以通过网络调用EJB对象了。 不同于RMI,EJB客户端进行远程调用时。并不是采用RMI注册表提供的命名服务进行查找,而是使用JNDI技术查找EJB对象。 JNDI
3、屏蔽掉了RMI命名服务实现的细节,是客户端程序更具有通用性。,7,远程方法调用(RMI),RMI生成远程对象必须先要定义远程接口(继承Remote接口),然后还要编写它的实现类。开发EJB组件时,也是要先定义远程接口,但不用编写它们的实现类,远程对象的实现类是由EJB组件所运行的容器根据远程接口自动实现的,不同的容器生成的实现类文件可能不同。 与RMI不同,EJB组件包含2个接口文件,一个是Remote接口文件,另一个是Home接口文件。这两个接口都是远程接口,都继承了 java.rmi.Remote接口, 并且它们声明的方法都要抛出 java.rmi.RemoteException 异常。,
4、8,Remote接口中声明的方法是EJB中实现了业务逻辑的方法,而Home接口则声明了如何生成EJB对象的create方法(实体EJB还包含finder方法)。 EJB容器在运行组件时,先生成一个Home对象,这个对象就是Home接口实现类的实例。客户端程序在调用时,首先通过JNDI查找到Home对象,然后调用Home接口提供的创建EJB对象的方法返回一个EJB对象的引用。EJB组件中真正的EJB对象是由容器生成的Remote接口实现类的对象,而它是由Home接口中的创建组件的方法来生成的。,9,EJB技术的高明之处在于它虽然使用了RMI技术,但却只需要定义远程接口而无需定义它们的实现类。 R
5、MI与EJB Remote接口的不同: RMI的Remote接口是继承java.rmi.Remote接口; EJB的Remote接口是继承javax.elb.EJBObject接口; java.elb.EJBObject接口是java.rmi.Remote子接口,增添了与EJB相关的方法。 对于本地视图的EJB接口继承javax.ejb.EJBLoaclObject接口,该接口没有继承java.rmi.Remote接口。,10,JNDI(Java Naming Directory Inteface)服务 EJB采用JNDI来查找EJB对象。 JNDI是一个J2EE API,提供了一个定位用户,
6、机器,网络,对象,和服务等的标准接口 JNDI接口提供了一个公共框架,通过它可以执行所有的目录操作 EJB采用JNDI来查找EJB对象。,11,XML EJB组件最后要部署到容器上才能够运行,容器需要部署人员向它提供有关EJB组件的一些信息。这些部署信息是通过XML文档的形式提供给容器。EJB规范中要求的部署文件只有一个,即ejb-jar.xml。,12,从EJB组件组件开发到应用的全过程中,EJB组件与三个角色发生关系,他们是EJB组件开发人员、容器供应商和客户端。 从EJB开发人员的角度看,一个EJB组件有四个组成部分:Home接口、Remote接口、Enterprise Bean 和部署
7、秒描述文件; 从容器的角度来看,它从EJB中读取部署描述文件,通过部署描述文件提供的信息生成Home对象、EJB对象和Enterprise对象,并回调Enterprise Bean对象中提供的方法,实现EJB对象所需要的一些服务;,EJB组件与不同角色的关系,13,从客户的角度来看,EJB组件则提供了一组可以调用的业务方法。能够完成整个业务流程中大部分业务逻辑。对EJB来说,有两种客户可以调用的方法,一种是远程客户可以调用的方法,另一种是本地客户可以调用的方法。所以EJB有责任向客户提供两种视图,即本地视图和远程视图。,14,EJB分类,EJB2.1中定义了三种不同类型的EJB,会话Bean(
8、Session Bean)、实体Bean(Entity Bean)和消息Bean(Message-Driven Bean)。 会话Bean 会话Bean是一个应用逻辑组件,表示的是客户要求完成的任务。如网上虚拟的购物车就是一个会话Bean,它实现了客户要求的各种任务,如添加商品,删除商品、结账等。 会话Bean不是持久数据对象,它不会存储的数据库中,当服务器或容器发生意外崩溃后,会话Bean就不复存在了,15,每个客户在与服务器会话时,都会占有一个特定的会话Bean,在会话过程中其他客户机不能同时访问这个Bean,会话结束后,会话Bean一般会被收回到Bean池中。虽然会话Bean一般只存在于
9、服务器端与客户端对话过程中,但却是实现业务逻辑的主要组件,地位十分重要。 根据容器对会话Bean的状态管理的不同,会话Bean分为无状态会话Bean和有状态会话Bean。无状态会话Bean不存储与客户进行会话的过程中的消息。有状态会话Bean则能保持客户状态的变化。但也只是一种暂时的保存,当服务器发生意外崩溃后,状态会丢失。,16,会话Bean可以直接通过JDBC对数据库进行访问,但要求EJB开发人员编写大量的数据库查询也修改语句,降低工作效率。所以更好的办法是通过实体Bean将数据对象化,然后在会话Bean中通过实体Bean对这些数据进行访问。这样可以减少编写SQL语言的代码工作量。集中精力
10、考虑真正的业务逻辑问题。,17,实体Bean,实体Bean是一种持久数据组件,表示底层的数据模式。实体Bean不包括业务逻辑,它只是将底层数据对象化,以便于数据操作。但也有业务方法,只不过它的业务方法比较简单,一般都是对属性的getter、setter方法。这些方法都定义在Remote接口中,用户可直接调用。 会话Bean在与客户端程序会话结束后就会被回收到Bean池中,它内部所包含的数据也就不复存在了。即使是有状态的会话Bean,由于它的状态是以属性的方式存储在对象中,所以当Bean消失后,它的状态也不存在了。,18,通常的方法是通过会话Bean访问实体Bean,然后按照会话Bean中的业务
11、逻辑对实体Bean所代表的数据进行处理。 根据实体Bean持久管理机制不同,可以将实体Bean分为Bean管理持久机制(bean-managed persistence ,BMP)的实体Bean和容器管理的持久机制(container-managed persistence ,CMP)的实体Bean。,19,消息Bean,消息Bean用于听取Java消息服务(JMS,Java Message Service)的输入消息。 消息Bean没有向客户端公开的接口,要与消息Bean进行通信只能通过向其发送消息来实现。由于没有公开接口,所以消息Bean没有Home接口,也没有Remote接口。,20,对
12、象状态 即对象的属性值 持久化方法 如对象序列化、O/R映射、使用对象数据库等方法。 序列化 将一个对象转换成字节流的形式,并在读取时将字节流还原成对象。,21,15.2 EJB的构成,EJB有四个部分构成: 远程EJB构成: 远程Home接口; Remote接口; Enterprise Bean类; 部署描述文件。,22,本地EJB构成: (1)远程Home接口; (2)Local接口; (3)Enterprise Bean类; (4)部署描述文件。 无论是会话Bean还是实体Bean都必须包含这四个部分;,23,Home接口声明了创建EJB的方法; Remote接口和Local接口则声明了
13、实现业务逻辑的业务方法; Home接口和Local接口的方法都将开放给客户调用; Enterprise Bean类则说明了接口中的方法应该如何实现,并定义了所有容器的回调方法; 但是Enterprise Bean类并没有实现Home、Local或Remote接口,它只是说明这两个接口中的方法如何实现。 实际上Enterprise Bean类的真正父接口是java.ejb.EnterpriseBean接口。,24,Home接口 会话Bean和实体Bean都有Home接口,Home接口继承了java.ejb.EJBHome或java.ejb.LoaclHome接口,前者为远程Home接口,后者为本
14、地Home接口。,25,Public interface javax.ejb.EJBHome extends java.rmi.Remote public abstract EJBMetaData getEJBMetaData() throws java.rmi.RemoteException; public abstract HomeHandle getHomeHandle() throws java.rmi.RemoteException public abstract void remove(Handle handle) throws java.rmi.RemoteException,j
15、ava.ejb.RemoveException; public abstract void remove(Object primaryKey) throws java.rmi.RemoteException, java.ejb.RemoveException; ,26,public interface java.ejb.EJBLocalHome public abstract void remove(Object primaryKey) throws RemoteException,EJBException; ,27,如果希望EJB同时具有远程或本地特征,就应该同时继承这两个接口。 在开发EJ
16、B时,必须定义Home接口,它的作用是声明创建、删除和查找EJB对象的方法。但是,不用编写Home接口的实现类,实现类将有容器自动生成.,28,Home接口的方法,EJB 接口中要声明创建EJB对象的方法,一般称这些能够创建EIB对象的方法为create方法,create方法的名称必须以create开头,并且返回返回的是Remote接口或Local接口的实现类的对象的引用。 对于实体Bean,它的Home接口除了可以定义create方法外,还可以定义finder方法。,下面是一个会话Bean接口: package firstejb; import javax.ejb.*; import jav
17、a.util.*; import java.rmi.*; public interface FirstHome extrends EJBHome public First create() throws CreateException,RemoteException; 客户端在调用EJB对象的方法前必须先调用FirstHome对像的create方法,创建EJB对象,这个对象就是First接口实现类的对象。,Remote接口和Local接口 Remote 接口继承了javax.elb.EJBObject 接口,Local接口继承了javax.ejb.LocalObject接口,如果EJB设计为远
18、程对象,则在定义了远程Home 接口的同时,也要定义他的Remote接口;相反,如果EJB设计为本地对象,则要在定义了本地Home接口的同事,也要定义Local接口。也就是说,Remote接口或Local接口必须与Home接口的类型相匹配,不能交叉定义。,Javax.ejb.EJBObject 和javax.ejb.LocalObject 接口定义如下:,public interface javax.ejb.EJBObject extends java.rmi.Remote public abstract javax.ejb.EJBHome getEJBHome() throws java.r
19、mi.RemoteException; public abstract java.long.Object getPrimaryKay() throws java.rmi.RemoteException, javax.ejb.RemoteException; public abstract void remove() throws java.rmi.RemoteExcepton, javax.ejb.RemoteException; public abstract javax.ejb.Hadle getHandle() throws java.rmi.RemoteException; publi
20、c abstract boolean isIdentical(javax.ejb.EJBObject obj) throws java.rmi.RemoteException; ,32,public interface javax.ejb.LocalObject public abstract javax.ejb.LocalEJBHome getEJBLocalHome() throws EJBException; public abstract java,long.Object getPrimaryKey() throws EJBException; public abstract void
21、 remove() throws EJBException.RemoteException; public abstract boolean isIdentical(java.long.Object obj) thorws EJBException; ,33,Remote 和Local接口都是声明处理各种业务逻辑的各种方法。在开发EJB时,可以之定义Remote接口,也可以之定义Local接口。还可以两者都定义。但是并不用定义他们的实现类。容器会在编译时根据接口定义,和Enterprise Bean类的内容自动创建Remote 接口,Local接口的实现类。,34,Remote接口和Local
22、接口要声明所有的供客户调用的业务方法。设计良好的Remote接口或Local接口是十分重要的。应为接口的实现可能会变化,但是,只要接口设计良好,在他的实现变化时是不用改变的。只要接口不变,客户端程序就不用变动。所以EJB开发人员在设计这两个接口时的责任就是将所有的业务方法全部写到接口中。,35,下面定义一个Remote接口:(First.java) package firstejb; import javax.ejb.*; import java.util.*; import java.rmi.*; public interface First estends EJBObject void F
23、irstMethod throws RemoteException; 当客户端调用EJB时,调用Home对象的create方法创建EJB,容器会根据这个接口生成的First实现类创建一个First对象,然后First对象的方法就可以供客户端调用了。,36,Enterprise Bean类 Enterprise Bean类是EJB的主体,它说明了Home接口与Remote接口或Local接口中的方法应该如何实现,其中回调方法是由容器在需要时主动调用的EJB方法但他并没有实现Home接口或Remote接口,它只是告诉容器应该如何实现它们。而它必须真正要实现的接口是javax.ejb.Enterpr
24、iseBean 接口: public interface java.ejb.EnterpriseBean extends java.io.Serializable,37,这个接口没有定义任何方法,只起到一个标示作用,当一个类实现了这个接口,就说明它是一个Enterprise Bean 类。 此外这个接口还继承了java.io.Serializable接口,说明所有Enterprise Bean类都是可序列化的。 在实际开发中,很少直接实现这个Enterprise Bean接口,J2EE还提供了Enterprise Bean接口的三个扩展: javax.ejb.SessionBean; java
25、x.ejb.EntityBean; javax.ejb.MessageDrivenBean;,38,public interface javax.ejb.SessionBean extends javax.ejb.EnterpriseBean public abstract void setContext(SessionContext ctx) throws EJBException,java.rmi.RemoteException public abstract void ejbPassivate() throws EJBException,java.rmi.RemoteException;
26、 public abstract void ejbActivate() throws EJBException,java.rmi.RemoteException; ,39,public interface javax.ejb.EntityBean extends javax.ejb.EnterpriseBean public abstract void setEntityContext(EntityBean ctx) throws EJBException,java.rmi.RemoteException; public abstract void unsetEntityBean() thro
27、ws EJBException,java.rmi.RemoteException; public abstract void ejbRemoe() throws EJBException,RemoveException, java.rmi.RemoteException; public abstract void ejbActivate() throws EJBException,java.rmi.RemoteException; public abstarct void ejbPassivate() throws EJBException,java.rmi.RemoteException;
28、public abstract void ejbLocal() throws EJBException,java.rmi.RemoteException; public abstract void ejbStore() throws EJBException,java.rmi.RemoteException; ,40,public interface javax.ejb.MessageDrivenBean extends javax.ejb.EnterpriseBean public abstract void setMessageDrivenBean( MessageDrivenContex
29、t ctx) throws EJBException; public abstract void ejbRemove() throwsEJBException ,41,这三个接口的实现类分别成为: Session Bean类; Entity Bean类; Message-Driven Bean类。 这三个类中的方法包括三部分:Remote接口中的方法的实现、Home接口中的方法的实现和容器回调方法的实现。,42,Enterprise Bean 类的方法,43,设计Enterprise Bean类是EJB开发中比较繁重的工作。所有业务方法以及容器的回调方法都必须在这个类中实现。而且,Home接口
30、中的create方法也要在Enterprise Bean类中实现,其中容器的回调方法的种类和数量对不同的容器是不同的。,44,First组件的Enterprise Bean类的代码(FirstBean.java),package firstejb; import javax.ejb.*; public class FirstBean implements SessionBean SessionContext sessionContext; public void ejbCreate() throws CreateException public void ejbRemove() public
31、void ejbActive() public void ejbPassive(),45,public void setSessionContext(sessionContext ctx) this.sessionContext=sessionContext; public void FirstMethod() System.out.println(“this is my first EJB!”): ,46,其中,ejbCreate()方法就是是与Home接口中定义的create方法相对应的实现。Home接口中定义了多少个create方法,在Enterprise Bean中就要定义多少个ejb
32、Create方法,并且它的名称和参数要与Home接口中定义的create方法相匹配,但是ejbCreate方法的返回类型是void,这与Home中得create方法是不一样的。ejbRemove、ejbActive、ejbPassive和setSessionContext方法是提供给容器回调的方法。除了setSessionContext方法以外,其他几个都是空的,由于对于不同的EJB,这几个回调方法的意义是不同的。,47,最后,Enterprise Bean类还实现了业务方法FirstMethod。它与Remote接口或Home接口中声明的方法是完全一致的,不用加ejb前缀。注意这个方法不是输
33、出在客户端,而是输出在服务器端。,48,部署描述文件,部署描述文件是用来向容器声明EJB组件如何部署到容器中去,以及EJB组件希望容器为组件提供那些服务的。 部署描述文件与Home接口文件,Remote(Local)接口可Enterprise Bean类一样,是EJB组件中必须包含的内容之一。,49,部署描述文件可以向容器指定以下内容: EJB的基本信息。指明EJB名称、Remote接口或Local接口,Home 接口以及Enterprise Bean类; EJB管理要求,指明EJB如何管理Bean; EJB持久性要求,指明实体Bean是自己来管理持久性,还是由容器管理持久性; EJB事务处理
34、要求,指明容器如何处理事务; 安全性要求,指明容器的安全策略。,50,EJB规范中要求的部署描述文件只有一个,即ejb-jar.xml,这个文件描述了一些与容器无关的EJB组件信息。但对于不同的容器,他们可能还要求提供一些与容器相关的部署描述文件,以weblogic为例,他除了要求提供ejb-jar.xml文件以外,还要求提供另外一个部署描述文件: weblogic-ejb-jar.xml。,51,First组件的部署描述文件ejb-jar.xml, First First firstejb.FirstHome firstejb.First firstejb.FirstBean Statele
35、ss Container ,52, First Required ejb-jar.xml文件中描述的信息包括EJB的种类、EJB的名称、Home接口的名称、Remote接口的名称、Enterprise Bean的名称等,这些是与容器无关的信息。,53,下面是与wenlogic 容器相关的部署描述文件weblogic-ejb-jat.xml:, First First 这个部署描述文件主要描述了EJB的JNDI名称,命名与目录服务是由容器提供的。,54,文件组织结构与命名规则 EJB组件在开发完后并不是随意放置的,而是要将编译好的类文件及部署描述文件按照一定的组织结构放到文件夹中,然后上传到服务
36、器指定的目录中。 通常在一个包含EJB的目录中必然会包含一个META-INF文件夹,在这个文件夹中包含了所有EJB组件的部署描述文件。而与EJB相关的类的文件要按照类的包的结构存放到根目录下。,55,First EJB的编译后的文件组织结构:,56,还可以使用工具生成JAR文件来组织这些文件。JAR文件是一个和ZIP格式相同的压缩文件,只不过其中多了一个manifest文件,用来记录JAR文件中的所有内容。JAR文件内部的组织结构和上图相同,知识进行了压缩,采用JAR文件的方法使得EJB组件上传复制时更加方便,是使用最多的方法。,57,JAR文件要上传到服务器制定的文件夹下,不同的服务器要求不
37、同。以weblogic为例,JAR文件的上传目录是通过服务器的config.xml文件制定的。指定了那个目录就应该上传到那个目录中。通常都是将JAR文件上传到用户目录域的myserver/upload目录。例如: 如果weblogic域目录为D:/bea/user_projects/mydomain/,那么上传目录就应该为:D:/bea/user_projects/mydomain/myserver/upload,上传时要为每个EJB创建一个文件夹,在文件夹中存放JAR文件或者按结构组织好的文件。,58,除了组织结构以外还要按照EJB组件的命名规则进行命名。一般而言,Remote接口的名称应该
38、与EJB名称相同,Home接口名称为Home,Enterprise Bean 类名为Bean,例如: First EJB 的Remote接口名称为Remote,Home接口的名称为FirstHome,而Bean类的名称为FirstBean。这样命名并非强制,而是有利于提高开发效率。,59,接口实现类与调用流程,Home对象 在编辑EJB组件时只定义了Home接口,而没有定义它的实现类,在容器运行EJB对象之前会自动生成一个Home接口的对象。当容器运行时就会依据生成的Home接口的实现类创建它的对象实例,这个对象通常称为Home对象。 由于Home接口间接继承了java.rmi.Remote接
39、口,所以Home对象就是一个远程对象。客户可以通过RMI机制对它进行远程调用。,60,在开发EJB组件时定义的Home接口,实际上就是在告诉容器要生成一个含有那些create方法的Home对象,而这些方法的描述则是在Enterprise Bean类ejbCreate方法中给出。Home对象的主要职责: 生成EJB对象。 查找已经存在的EJB对象 删除EJB对象。,61,最终客户调用的ejbCreate方法正是Home对象的create方法,而不是Enterprise Bean类中定义的ejbCreate方法。但实际上,Home的create方法只是做了一些对请求的先期处理,然后它还会调用在En
40、terprise Bean类中定义的ejbCreate方法来完成EJB的创建工作。所以,Home对象可以看成是Enterprise Bean 类中ejbCreate方法的代理,用户只能通过调用Home对象的create方法来间接的调用ejbCreate方法。,62,不同容器最终生成的实现类是不同的,因此,虽然EJB的Home 接口是与容器无关的,但实现类却与容器相关。由于实现类文件是由容器在编译时自动生成的,所以不会影响EJB的通用性。,63,EJB 对象,编译EJB组件时容器还会生成Remote接口的实现类。让客户端调用Home接口的create方法时,容器会生成这个实现类的对象,通常称这个
41、对象为EJB对象。,64,由于Remote接口也间接的继承了java.rmi.Remote 接口,所以EJB对象也是一个远程对象,代理EJB组件响应用户的请求,它具有网络功能,能够处理事物,提供安全措施等。 客户端调用EJB的业务方法时,实际调用的也是EJB对象中的业务方法,与Home对象类似,EJB对象中的业务方法也只是对请求做一些简单处理,最终还是要调用Enterprise Bean类中对应的方法。所以说,尽管响应客户端请求的是EJB对象,但真正完成请求处理的还是Enterprise Bean类的对象。,65,在开发EJB组件时定义的Remote接口,实际上就是告诉容器要生成一个具有哪些方
42、法的EJB对象,以及要通过这个对象开放给用户的业务方法有哪些。至于这些方法包含了什么样的内容则是在Enterprise Bean 类中定义的。,66,Enterprise Bean对象,尽管响应客户调用请求的是Home对象和EJB对象,但是他们最终还是要调用Enterprise Bean类定义的方法。实际上,容器在编译时会对Enterprise Bean类进行再一次的扩展,重载其中那些供容器回调的方法(这就是为什么在编写Enterprise Bean类文件时,这些方法可以为空的原因)。然后在运行时生成一个扩展后的类的实例,这个实例就是Enterprise Bean对象。由于它没有继承java.
43、rmi.Remote 接口,所以它不是远程对象,客户不能对它进行远程调用,而只能通过Home对象和Remote对象对他的方法进行调用。,67,EJB对象之间的关系,EJB可以课客户联系的是Home对象和EJB对象,Enterprise Bean对象并不能与客户进行直接的联系。这样做的好处是:,68,Enterprise Bean类只扩展了EnterpriseBean接口,不是远程对象,必须由Home对象和EJB对象代理Enterprise Bean对象来接受客户的调用请求。而Home对象和EJB对象最后是由容器生成的,所以EJB开发人员在编写EJB组件时不需要真正去编写与网络相关的内容。简化了
44、EJB开发的流程。 Home对象和EJB对象在截获客户请求时,可以进行一些必要的处理。最简单的就是可以对请求进行安全检查,其次还可以解决多个请求访问同一个Bean时造成的冲突问题。 进行负载平衡。,69,EJB 调用过程,70,EJB 调用流程 通过JNDI API定位Home对象; 由Home对象的相应的create方法生成EJB对象; 通过EJB对象调用EJB组件中的方法。,71,First EJB的客户端程序(Jbuilder生成),package firstejb; import javax.naming.*; import java.util.Properties; import j
45、avax.rmi.PortbleRemoteObject; public class FirstTestClient extends Object private FirstHome firsthome=null; puboic FirstTestClient() Initialize(); ,72,public void initialize() try Context comtext=getInitialContext(); Object ref=context.lookup(“First”); firstHome=(FirsrHome)PortableRemoteObject.narrow(ref,FirstHome.class); catch(Exception e) e.printStackTrace(); ,73,Private Context getInitialContext() throws Exception String url=”t3:/kingsong:7001”; String user=null; String password=null; Properties properties=null; try Properies=new Properties(); Properties.p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小班安全教育安全乘车
- 幼儿园燃气安全教育培训
- 妊娠糖尿病案例分析
- 幼儿园教职工消防安全培训
- 旅游客运市场调研报告及发展对策
- 探索特征增强策略提升图像场景理解精度
- 探索撒哈拉以南非洲地区:政治、经济与发展之多维剖析
- 探索微波与γ射线联合作用下的细胞奥秘:生物学效应与机制解析
- 餐饮企业营销方案及效果评估
- 移动学习应用与实践案例分析
- DB41∕T 2816-2025 建设项目节约集约用地综合论证技术指南
- 2025四川成都新都投资集团有限公司招聘党建文书岗等岗位13人笔试参考题库附带答案详解(3卷)
- 大学生英语四级核心1500词
- 2025年招银理财笔试题库及答案
- 萌宠乐园招商方案
- 产后抑郁症典型案例分析与心理干预报告
- 压力性损伤的健康宣教
- 电梯钢丝绳更替作业方案
- 初创科技企业股权激励方案解析
- 校园周边安全风险隐患排查台账
- 汽车维修合同范本(2025年版)
评论
0/150
提交评论