企业级java bean开发_第1页
企业级java bean开发_第2页
企业级java bean开发_第3页
企业级java bean开发_第4页
企业级java bean开发_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Enterprise Java Bean 3.0(EJB3.0),企业级Java Bean开发,课程大纲,1、JavaEE技术体系2、EJB3.0技术简介3、Enterprise Bean(企业Bean)理论及实例开发Session BeanMDB4、Persistence(JPA - 数据持久化框架)Entity BeanEntityManagerEJB-QL(EJB查询语言)OR映射5、EJB事务处理(Transactions)及其与Spring容器事务的比较,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,Java EE技术体系 版本发布的历史,J2EE 1.2 (December 12, 1999) J2EE 1.3 (September 24, 2001) J2EE 1.4 (November 11, 2003) Java EE 5 (May 11, 2006),J2EE 1.2 (December 12, 1999),Enterprise JavaBeans Specification (EJB), Version 1.1 JavaServer Pages Specification (JSP), Version 1.1 Java Servlet Specification, Version 2.2 JDBC API, Version 2.0 Java Naming and Directory Interface Specification (JNDI), Version 1.2 Java Message Service (JMS), Version 1.0.2 Java Transaction API (JTA), Version 1.0.1 Java Transaction Service (JTS), Version 0.95 JavaMail API Specification Version 1.1 JavaBeans Activation Framework Specification (JAF), Version 1.0,J2EE 1.3 (September 24, 2001),Enterprise JavaBeans Specification (EJB), Version 2.0 JavaServer Pages Specification (JSP), Version 1.2 Java Servlet Specification, Version 2.3 JDBC API, Version 2.1 Java Naming and Directory Interface Specification (JNDI), Version 1.2 Java Message Service (JMS), Version 1.0.2 Java Transaction API (JTA), Version 1.0.1 Java Transaction Service (JTS), Version 1.0 JavaMail API Specification Version 1.1 JavaBeans Activation Framework Specification (JAF), Version 1.0 J2EE Connector Architecture, Version 1.0 Java API for XML Processing (JAXP), Version 1.0 Java Authentication and Authorization Service (JAAS), Version 1.0,J2EE 1.4 (November 11, 2003),Enterprise JavaBeans Specification (EJB), Version 2.1 JavaServer Pages Specification (JSP), Version 2.0 Java Servlet Specification, Version 2.4 JDBC API, Version 3.0 Java Naming and Directory Interface Specification (JNDI), Version 1.2 Java Message Service (JMS), Version 1.1 Java Transaction API (JTA), Version 1.0.1B Java Transaction Service (JTS), Version 1.0 JavaMail API Specification, Version 1.2 JavaBeans Activation Framework Specification (JAF), Version 1.0 J2EE Connector Architecture, Version 1.5 Java API for XML Processing (JAXP), Version 1.2 Java Authentication and Authorization Service (JAAS), Version 1.0 Java Authorization Service Provider Contract for Containers (JACC), Version 1.0 Web Services for J2EE, Version 1.0 Java API for XML-based RPC (JAX-RPC), Version 1.0 Java API for XML Registries (JAXR), Version 1.0 Java Management Extensions (JMX), Version 1.1 Java 2 Platform, Enterprise Edition Management Specification, Version 1.0 Java 2 Platform, Enterprise Edition Deployment Specification, Version 1.0,Java EE 5 (May 11, 2006),Enterprise JavaBeans Specification (EJB), Version 3.0 Java Persistence API (JPA), Version 1.0 JavaServer Pages Specification (JSP), Version 2.1 Java Servlet Specification, Version 2.5 JavaServer Faces (JSF), Version 1.2 JavaServer Pages Standard Tag Library (JSTL), Version 1.2 JDBC API, Version 3.0 Java Naming and Directory Interface Specification (JNDI), Version 1.2 Java Message Service (JMS), Version 1.1 Java Transaction API (JTA), Version 1.1 Java Transaction Service (JTS), Version 1.0 JavaMail API Specification, Version 1.4 JavaBeans Activation Framework Specification (JAF), Version 1.1 J2EE Connector Architecture, Version 1.5,Java API for XML Processing (JAXP), Version 1.3 Java Authentication and Authorization Service (JAAS), Version 1.0 Java Authorization Service Provider Contract for Containers(JACC), Version 1.1 Web Services for Java EE, Version 1.2 Java API for XML-based RPC (JAX-RPC), Version 1.1 Java API for XML Registries (JAXR), Version 1.0 Java Management Extensions, Version 1.2 Java Platform, Enterprise Edition Management Specification, Version 1.1 Java Platform, Enterprise Edition Deployment Specification, Version 1.1 Java API for XML-based Web Services (JAX-WS), Version 2.0 Java Architecture for XML Binding (JAXB), Version 2.0 SOAP with Attachments API for Java (SAAJ), Version 1.3 Web Services Metadata for the Java Platform, Version 2.0 Streaming API for XML (StAX), Version 1.0 Java Data Objects (JDO), Version 2.0,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,Java EE应用程序的组件构成(分布式多层应用架构),Java EE应用程序由组件构成,Web ClientsAppletsApplication Clients,ServletJSPJSF,Session BeanMDBEntity Bean,分布式? VS 集群?,Web Clients(或称瘦客户端),一个web客户端包括两个部分:第一,动态的web页面包含HTML/XML等标签语言,这些内容由运行在web层的web组件产生;第二,一个web浏览器,它负责接收和解释从服务器端传送过来的web页面。,Applets,从web层传送的web页面可以包含Applet,Applet是:用java语言编写的小应用程序运行在被安装于web浏览器的java虚拟机中但由于web浏览器的安全限制,Applet只能执行有限的功能。,Application Clients(应用客户端),应用客户端一般是由swing或awt技术编写(但也有可能是命令行客户端)。应用客户端直接访问在业务逻辑层的Java Beans(EJB),当然,它也可以发出HTTP请求,访问web层组件。,客户端与JavaEE服务器的通信,客户端组件与运行在服务器端的业务逻辑组件通信时,既可以直接访问,也可以通过Web层的组件访问,Web组件,Web组件就是Servlet或由JSP/JSF技术创建的页面静态HTML或Applet不是JavaEE规范的一部分。那些辅助的工具类也不被认为是web组件。,在Web层,也可能会借助于辅助的Java Bean来处理用户的输入,并将数据传输到业务逻辑层。比如现在流行的SSH架构,就是存在于Web层的辅助工具类,业务逻辑组件,业务逻辑组件与其它组件的交互如下所示:,Enterprise Information System(EIS)层,企业信息系统层一般而言,指的是数据库系统。当然,也可以指企业其它的遗留系统。比如ERP等。,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,SSH架构在整个Java EE架构中的位置,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,JavaEE容器,JavaEE容器提供了企业应用开发中的各种服务,处理事务管理、连接池等底层复杂的细节。,容器服务,容器就是组件和底层服务细节之间的接口,在web组件、企业级Bean等能够执行之前,它必须被装配为一个JavaEE模块,并部署在容器上。装配的过程主要包括定制容器事务管理特性JNDI服务等JavaEE容器还提供其它的功能:比如管理EJB和Servlet的生命周期、数据库连接池、数据持久化等。,容器类型,JavaEE组件经过部署之后,被安装到JavaEE容器中。JavaEE服务器:JavaEE服务器提供web容器和EJB容器EJB容器:管理EJB的运行Web容器:管理Servlet和JSP的运行(Application Client)应用客户端容器:管理客户端应用程序的运行比如:应用客户端容器会提供JNDI服务Applet容器:管理着Applet小应用程序的运行,容器类型,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,Java EE应用开发与实施过程,比如,Web模块: 即Web组件按如下结构进行组织,可以打包为.war文件,DocumentRoot - client-side classes and archives(applets) - static web resources, such as images - JSP pages - WEB-INF - web.xml - Tag library descriptor files - classes - lib,Java EE应用开发与实施过程,在JAVA EE中,各种不同类型的模块既可以单独打包部署,也可以将这些模块综合起来做成一个EAR包进行部署。在后续课程中,我们将学习这些部署的过程。,Java EE技术体系,JavaEE版本发布的历史分布式多层应用架构与SSH架构的比较Java EE容器Java EE应用开发与实施过程Java EE角色,Java EE 角色,JavaEE Product Provider(Java EE产品提供者)即实现了Java EE技术规范的厂商Application Component Provider(应用组件提供者)企业Bean开发者Web组件开发者应用客户端开发者Application Assembler(应用装配者)Deployer(部署者)System Administrator(系统管理员)Tool Provider(工具供应商)即工具厂商,比如开发、打包、装配以及部署工具的提供,JavaEE 5 APIs,课程大纲,1、JavaEE技术体系2、EJB3.0技术简介3、Enterprise Bean(企业Bean)理论及实例开发Session BeanMDB4、Persistence(JPA - 数据持久化框架)Entity ClassEntityManagerEJB-QL(EJB查询语言)OR映射5、EJB事务处理(Transactions)及其与Spring容器事务的比较,EJB3.0技术简介,被简化的EJB APIEJB3.0消除了对Home接口的依赖,所有的持久化对象不必再实现任何EJB API接口。Session Bean,Message driven Bean,Entity Bean现在只是简单的Java Bean。Java AnnotationsEJB 3.0需要用到JDK5.0中出现的新特性:Annotations。Annotation特性使得发布描述文件变成一个可选项,而非必选项。EJB 3.0 定义了很多Annotation,覆盖了众多与持久化相关的概念。比如Bean的类型、依赖注入、事务管理、安全、回调、O-R映射、关系等等。如果你想要覆盖在Annotation中的定义,那么发布描述文件依然有它的用武之地。Jboss应用服务器和Hibernate都支持这些Annotation,这就意味着,如果你使用hibernate的话,你可以在ejb3.0容器之外和在单独的Java应用程序中获得ejb3.0 annotation所带来的一切好处。依赖注入(DI)通过定义Inject、EJB、Resource等annotations,这些依赖关系现在可以由容器来注入到EJB中。,可选的回调机制开发者们现在可以仅仅实现他们感兴趣的那些回调方法了。通过定义PostConstruct,PreDestroy,PrePersist或者PostPersist,开发者们可以映射任何Java Bean或回调类的方法,让它们接收这些事件。Entity Manager API一个普通的Java Bean实例,可以通过EntityManager API来持久化到数据库,当然也可以从EntityManager中获取一个Java Bean实例,修改之后,再次持久化到数据库中。Jboss应用服务器和Hibernate都支持这个新的API。简化的持久化模型和改良的查询EJB 3.0将Java持久化模型进行标准化,Hibernate扮演了至关重要的角色。一套完整的Java Annotations被用来定义处理O-R映射和不同的对象关系类型。EJB 3.0也增强了EJB-QL查询语言。支持动态查询、子查询、批量更新、批量删除等。可以脱离容器使用EJB 3.0规范允许你在普通的Java应用程序中使用它的持久化API。,课程大纲,1、JavaEE技术体系2、EJB3.0技术简介3、Enterprise Bean(企业Bean)理论及实例开发Session BeanMDB4、Persistence(JPA - 数据持久化框架)Entity BeanEntityManagerEJB-QL(EJB查询语言)OR映射5、EJB事务处理(Transactions)及其与Spring容器事务的比较,Enterprise Bean(企业Bean)理论,Enterprise Bean(企业Bean)理论什么情况下需要企业Bean?企业Bean的类型Session Bean(会话Bean)Stateful Session BeanStateless Session BeanMDB定义客户端访问接口远程客户端(Remote Client)本地客户端(Local Client)Web service客户端方法的参数和访问方式独立性粗粒度的数据访问,什么情况下需要企业Bean?,企业Bean运行在EJB容器中。企业Bean实际上就是一个封装了业务逻辑的Java类。Why EJB?最重要的理由:分布式!分布式对象之间互相协作,完成特定的业务功能。分布式对象之间应实现分布透明性(或位置透明性)。即在客户端代码中无需指定分布式对象的位置(通过配置来解决)。分布式对象之间的事务支持(RMI不支持事务)应用程序需要支持不同的客户端,只需要少量的代码,就可以让远程客户端访问到企业Bean。如果你的应用需要进行分布式部署、如果你的分布式对象需要支持事务、如果你的关键业务逻辑需要能够支持多种不同类型的客户端,那么EJB将会是一个很好的选择。,EJB的基本分类,Enterprise Bean 企业BeanSession Bean 会话BeanStateless Session Bean 无状态会话BeanStateful Session Bean 有状态会话BeanMessage Driven Bean(MDB) 消息驱动Bean,基于JMSPersistence 持久化Entity Bean 实体Bean,提示:在EJB2中,Entity Bean分为BMP(Bean管理持久化实体Bean)和CMP(容器管理持久化实体Bean)两类。,Session Bean(会话Bean),会话Bean可以执行业务逻辑操作,比如注册用户、订单登记、数据库操作等等。什么叫会话(Session)?即从客户端获得EJB对象开始,然后调用EJB的方法(可以多次),直到客户端生命周期结束,或客户端释放了EJB对象为止,称为一次会话随着会话的终止,EJB对象也有可能会被EJB容器销毁,InitialContext context = new InitialContext();FirstEjb ejb = (FirstEjb)context.lookup(FirstEjbBean/remote);String s = ejb.saySomething(张三);System.out.println(s);,什么是对象的状态?,对象的状态是由其实例变量(即成员变量)的值组成的什么是实例变量?什么是类变量?,public class SomeEjbBean implements SomeEjb private int state; /对象的状态信息.,什么叫有状态的会话Bean?(Stateful Session Bean),即EJB能够为同一个客户端在多次请求(方法调用)之间保持状态信息。比如:基于某种原因(可能是因为系统要支持多种不同类型的客户端),购物篮功能作为系统的核心业务,需要由EJB对象来担当(而不是由HTTP SESSION对象)。那么EJB必须能够区分不同的客户端,并分别为不同的客户端保持与其对应的状态信息。即,从某个客户端的角度来看,似乎EJB对象正被它独占了一样,不会因为有任何其它的客户端同时对同一个EJB访问而影响其最终的计算结果。,从Http Session原理入手了解 Stateful Session Bean的原理,比如,购物过程中,HTTP SESSION的交互过程:,从Http Session原理入手了解 Stateful Session Bean的原理,什么叫无状态的会话Bean?(Stateless Session Bean),并非是说EJB不能存在状态,而是说EJB容器不会对EJB的状态做管理容器会使用实例池的方式,甚至单例的方式来实现无状态的Session Bean。因为EJB容器不会对Stateless Session Bean的状态进行管理,所以它的性能要比Stateful Session Bean的好,回过头看看Spring?,由Spring管理的业务逻辑类,是无状态的(Singleton)Struts2中的Action,是有状态的(prototype),定义客户端访问接口,客户端仅通过业务逻辑Bean所定义的接口来访问业务逻辑(跟具体实现无关)。当在开发企业Bean之前,首先要做的第一个决定是:EJB要支持什么样的客户端?因为不同的客户端,其访问方式也将不同。远程客户端本地客户端WebService客户端关于JVM进程的问题:假设在同一台机器上,安装了一个JVM,一个JBOSS应用服务器1、启动JBOSS应用服务器(启动JBOSS当然要用到JVM)2、另外编写一个包含main方法的JAVA类,并编译以及运行(要运行这个程序,当然也要用到JVM)问题:在运行这个JAVA类的时刻,这台机器上有多少个JVM进程?, 客户端与其调用的EJB对象不在同一个JVM进程中, 客户端与其调用的EJB对象在同一个JVM进程中,远程客户端(Remote Client),一个远程客户端具有如下特性:它可以运行在跟企业Bean不同的机器或不同的JVM进程上它可以是web组件、应用客户端、或其它的企业Bean对远程客户端来说,企业Bean的位置是透明的为了创建一个能够被远程客户端访问的企业Bean,你必须用Remote注解来定义这些企业Bean。,本地客户端(Local Client),一个本地客户端具有如下特性:它必须与企业Bean运行在同一个JVM中它可能是一个web组件或别的企业Bean为了创建一个能够被本地访问的企业Bean,你必须用Local注解来定义这些企业Bean。一个企业Bean接口可以同时被定义为Remote和Local,远程访问(调用)方式(Remote Access),本地访问方式(Local Access),客户端与访问方式,Web service客户端,Web service客户端可以访问无状态会话Bean的接口,只有在业务逻辑方法被标识为WebMethod的时候,web service客户端才可以访问到!,方法的参数和访问方式,不同的访问方式(Remote、Local、web service),会影响到Bean方法的参数及其返回值。独立性如果是远程调用,客户端操纵的Bean的参数,其实是一份参数值的拷贝。因此,对参数的修改,不会影响到Bean。但是对于本地调用来说,客户端操纵的Bean的参数,就是一个引用,它对参数的修改,将会影响到Bean。所以,不管在哪种情况下,请避免修改参数的值!粗粒度的数据访问因为远程调用的速度比较慢,所以在设计的时候,请尽量使用粗粒度的接口设计。即尽量减少方法的调用,并尽可能在一次方法调用中传输完毕所需要的数据!,Enterprise Bean实例开发,Enterprise Bean实例开发,安装及运行JBOSS,从网站下载JBOSS的安装包:jems-installer-1.2.0.GA.jar在命令行下运行这个安装包java jar jems-installer-1.2.0.GA.jar,在本步骤中,要注意选中ejb3,运行JBOSS,安装完成之后:进入JBOSS安装目录下的bin目录,运行其中的run即可或者也可以在MyEclipse中集成对JBOSS的支持,在MyEclipse中添加对JBOSS运行的支持,这将有利于部署EJB项目,开发第一个EJB应用(基于MyEclipse6.0.0.M1),选择新建EJB Project,开发第一个EJB应用(基于MyEclipse6.0.0.M1),2、选中J2EE Specification Level中的Java EE 5.0 EJB3,并取消“Add support for Entity Beans选项”,开发第一个EJB应用(基于MyEclipse6.0.0.M1),3、编写EJB代码,开发第一个EJB应用(基于MyEclipse6.0.0.M1),4、利用注解配置EJB,至此,第一个EJB已经开发完成,下面部署到JBOSS,开发第一个EJB应用(基于MyEclipse6.0.0.M1),5、部署到JBOSS并启动JBOSS,开发第一个EJB应用(基于MyEclipse6.0.0.M1),6、开发应用客户端新建一个java项目,开发第一个EJB应用(基于MyEclipse6.0.0.M1),7、将EJB项目的接口打包(客户端只需要EJB的接口即可),并把这个jar包加入到客户端项目的类路径中8、将JBOSS安装目录下的client目录里面的所有jar包加到客户端项目中9、编写客户端代码:,开发第一个EJB应用(基于MyEclipse6.0.0.M1),10、在客户端源代码目录下添加perties文件,内容是:11、运行客户端即可,java.naming.factory.initial=erfaces.NamingContextFactoryjava.naming.factory.url.pkgs=org.jboss.naming:vider.url=localhost,动手开发更多的EJB实例项目,有状态和无状态EJB之间的差异比较远程客户端和本地客户端(Remote与Local)之间的差异EJB实现多个接口的情况下,如何定义访问方式?(注解的基本概念)JMS的基本概念以及MDB消息驱动Bean如何把无状态的EJB定义为WebService的方法拦截器的概念,课程大纲,1、JavaEE技术体系2、EJB3.0技术简介3、Enterprise Bean(企业Bean)理论及实例开发Session BeanMDB4、Persistence(JPA - 数据持久化框架)Entity BeanEntityManagerEJB-QL(EJB查询语言)OR映射5、EJB事务处理(Transactions)及其与Spring容器事务的比较,Persistence(JPA - 数据持久化框架),持久化框架开发持久化BeanPersistence.xml配置JBOSS数据源编写实体类编写业务逻辑类持久化实体管理器EntityManagerEJB-QLOR映射,开发持久化Bean,持久化Bean跟普通Java Bean无异,区别在于它们用ejb的Annotation进行了标记。持久化Bean有下列基本要求:一个实体类(即普通的POJO),并将其标识为Entity实体类必须要有主键,一般用Id将其标识在/META-INF/目录下,有persistence.xml文件,其主要作用是定义实体类映射的相关配置信息,比如指定数据源、都有哪些实体类、以及跟持久化相关的其它的一些属性,EntityBean实例开发第一步:配置JBOSS数据源,拷贝数据库驱动到JBOSS_HOME/server/default/lib下拷贝docs/examples/jca/mysql-ds.xml到/server/default/deploy目录下,并修改数据库用户名及密码Mysql-ds.xml文件的内容类似下面所示: MySqlDS jdbc:mysql:/localhost/ejb3 com.mysql.jdbc.Driver root root.,EntityBean实例开发第二步:创建EJB项目,支持EntityBean,EntityBean实例开发第二步:创建EJB项目,支持EntityBean,Persistence Unit Name: 我们在后面会用这个名称来跟它所指定的数据库打交道JNDI Data Source:输入我们刚才配置的数据源名称,并加上前缀java:/取消Specify JPA Datasource details的复选框,EntityBean实例开发第二步:创建EJB项目,支持EntityBean,在创建完成之后,自动在META-INF目录下添加了persistence.xml文件,其内容如下:,EntityBean实例开发第三步:编写实体类,并注解映射规则,Entitypublic class Person private int id;private String name;/* * return Returns the id. */IdGeneratedValuepublic int getId() return id;,/* * param id The id to set. */public void setId(int id) this.id = id;/* * return Returns the name. */public String getName() return name;/* * param name The name to set. */public void setName(String name) = name;,EntityBean实例开发第四步:创建实体类对应的数据库表,在JBOSS应用服务器中,JPA是由Hibernate来作为底层的实现,因此,我们可以在persitence.xml中配置一些与Hibernate相关的属性,比如下面的配置:部署EJB项目之后,即可以看到JBOSS自动导出了数据库表,EntityBean实例开发第五步:编写业务逻辑类,操作持久化数据,StatelessRemotepublic class PersonManagerBean implements PersonManager PersistenceContext(unitName=test)protected EntityManager em;public void addPerson(String name) Person p = new Person();p.setName(name);em.persist(p);,EntityBean基本映射规则,所有未标明为Transient的属性均会默认映射使用Table和Column注解,可将属性映射到特定的表和字段默认的表名和字段名跟属性名一致映射的是实例变量还是getters/setters所指定的属性?field-baseproperty-base,关注ID生成策略,只用Id来定义一个主键时,它的规则是:不自动生成,即由程序来手工分配我们可以使用GeneratedValue来指定ID的生成策略仅使用GeneratedVaue ID的生成策略是自动的,也就是相当于Hibernate中native生成策略如果ID是字符串,则可以使用UUID生成策略(使用Hibernate扩展特性),多对一关联映射,一对一关联映射,主键关联外键关联,一对多关联映射,一对多单向关联一对多双向关联,多对多关联映射,继承映射,总共有三种策略:第一种是单表继承策略,如下所示,继承映射 Join映射策略,继承映射 TABLE_PER_CLASS映射策略,EntityManager和PersistenceContext的管理类型,Container-Managed EntityManager vs Application-Managed EntityManager容器管理的Ent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论