




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
中移动杭州研究院 Java web 开发三大框架整理报告 Java web 开发三大框架整理 目 录 1引言 2 2 Java Web 开发三大框架 .2 2.1 Struts 框架 2 2.1.1 Struts 框架概述 2 2.1.2 Struts2 处理流程 3 2.1.3 Struts 框架的组件分析 .4 1 2.2 Hibernate 框架 6 2.2.1 Hibernate 工作原理和工作流程 7 2.2.2 Hibernate 框架的组件分析 7 2.2.3 Hibernate 核心接口 .8 2.2.4 Hibernate 缓存管理 .9 2.2.5 Hibernate 框架优势 9 2.3 Spring 框架 .10 2.3.1 Spring 框架模块 10 2.3.2 控制反转(IoC) 和依赖注入(DI) 11 2.3.3 面相切面编程(AOP) 12 2.3.4 Spring 框架优势 12 3 SSH 框架整合 .13 3.1 整合理念 13 3.2 整合方案 14 3.2.1 Spring 与 Struts 的集成 14 3.2.2 Spring 与 Hibernate 的集成 15 3.2.3 系统分析 16 4 小结 16 1引言 随着计算机网络技术的日益普及,基于Java的Web技术也得到了广泛的应 用。然而,利用Java进行 Web应用程序的软件架构非常复杂,这在很大程度上 限制了Web系统的开发效率,因此轻量级 J2EE框架应运而生。优秀的轻量级 J2EE框架不仅保留了传统J2EE框架良好的可扩展性、可维护性等特点,还具有 开发效率高、各层无缝集成等优点。 2 Web框架是开发者在使用某种语言编写 Web应用服务端时关于架构的最佳 实践。所谓的三层开发就是将系统的整个业务应用划分为“表示层业务逻辑 层数据访问层” ,这样有利于系统的开发、维护、部署和扩展,分层是为了实 现“高内聚、低耦合” 。三层体系将业务规则、数据访问及合法性校验等工作放 在业务逻辑层处理。客户端不直接与数据库交互,而是通过组件与中间层建立 连接,再由中间层与数据库交互。 本报告探讨现在主流一种轻量级J2EE架构,即SSH(Struts +Spring +Hibernate) 框架,并对各层之间的整合技术进行研究。首先,分析了 Struts、Spring和Hibernate 三种框架和各自的特点;其次,阐述了它们整合的理 念,选取了一种比现有SSH框架更加合理有效的整合方案,使其各层能够无缝集 成、有机整合,最大限度地实现SSH框架的高内聚低耦合的特点。 2 Java Web 开发三大框架 2.1 Struts 框架 2.1.1 Struts 框架概述 Struts是一个基于 MVC( Model-View -Controller)模式的应用架构开源框架, 采用Servlet和 JSP技术实现,它减弱了业务逻辑接口和数据接口之间的耦合,为 开发人员节约了时间。其中Struts 的控制文件struts-config. xml、Action 和 Action Servlet 实现MVC 的控制器,Java Bean 或者 EJB 完成MVC 的模型部分, JSP 页面承担MVC 的视图组件,而且所有的控制逻辑都是由struts-config.xml 配置文件来完成。Struts 把 Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编 码实现全套MVC模式,极大的节省了时间。 在使用Struts 框架应该遵守以下原则: 尽量使用Struts标签,避免嵌入Java代码; 避免在视图层处理对数据库的访问。 3 2.1.2 Struts2 处理流程 当用户端的Http请求到达时,Struts2 处理流程如图 2-1所示 图2-1 Struts2 处理流程 一个客户端请求在 Struts 2 框架中的处理大概分为以下几个步骤: 客户端提交一个(Http Servlet Request )请求; 请求被提交到一系列(主要是 3 层)的过滤器(Filter) ,如 Action Context Clean Up、Filter Dispatcher 等。注意:这里是有顺序的, 先 Action Context Clean Up ,再其他过滤器(Other Filters、Site Mesh 等) , 最后到 Filter Dispatcher; Filter Dispatcher 是控制器的核心,就是 MVC 的 Struts 2 实现中控制层 (Controller)的核心; Filter Dispatcher 询问 Action Mapper 是否需要调用某个 Action 来处理这个 (Http Servlet Request)请求,如果 Action Mapper 决定需要调用某个 Action,Filter Dispatcher 则把请求的处理交给 Action Proxy; Action Proxy 通过 Configuration Manager(struts.xml)询问框架的配置文 件,找到需要调用的 Action 类; Action Proxy 创建一个 Action Invocation 实例,同时 Action Invocation 通 过代理模式调用 Action。但在调用之前,Action Invocation 会根据配置加 4 载 Action 相关的所有 Interceptor(拦截器) ; 一旦 Action 执行完毕,Action Invocation 负责根据 struts.xml 中的配置找 到对应的返回结果 result,最后将该 result 通过(Http Servlet Response) 请求返回给客户端。 2.1.3 Struts 框架的组件分析 (1) Struts 2 配置文件 Struts 2 配置文件是用户请求(View)和业务逻辑模块(Model))Action 之间 联系的桥梁,可以通过修改 Struts 2 的配置文件来快速适应业务需求,它是整个 Struts 2 的精髓之一。 Struts 2 框架配置文件分为 XML 文件和属性资源文件两种。 web.xml 对 web 应用中一些初始信息进行了配置。web.xml 可以配置过滤器 用于同时拦截多个请求的 URL。除此之外 web.xml 还可以用来配的 会话时间、欢迎页、错误页、监听器、控制器等等。 struts.xml 文件主要用来配置 Action 和 Http 请求的对应关系,以及配置逻辑 视图和物理视图资源的对应关系。struts.xml 文件中包含了 Action 的定义以及 Action 的返回值对应的视图资源、命名空间等信息。此外,用户也可以定义自 己的 XML 文件,然后通过 include 指令将其包含到 struts.xml 文件中。 另一类配置文件是属性资源文件。资源文件中一般采用固定的 Key -Value 形式,用于定义 Struts 2 全局或者局部的资源数据。例如定义国际化、开发模式 等信息。 (2) Struts 2 控制器 Struts 2的控制器组建是 Struts 2框架的核心,事实上所有MVC框架都是以控 制器组件为核心的。正如前面提到的,Struts 2的控制器由两个部分组成:Filter Dispatcher和业务控制器 Action。前者由框架提供,负责拦截所有的用户请求。 Filter Dispatcher 负责根据用户提交的URL和struts.xml中的配置,来选择合适的Action, 让这个Action 来处理用户的请求。Filter Dispatcher 其实是一个过滤器 Filter( Servlet规范中的一种 web组件) ,只需要在web.xml 文件中配置即可。 5 Filter Dispatcher充分体现了 J2EE核心设计模式中的前端控制器模式。 业务控制器Action Struts 2框架为用户提供了一个名为Action Support的接口。该接口定义 SUCCESS、ERROR 、INPUT 、LOGIN 、NONE五个静态的字符串和一个execute 方法,用户在编写自己的Action时只要实现该接口并重写其中的execute方法,将 所要实现的业务逻辑在该方法中处理就行了,当调用Action时,Struts 2框架会自 调用execute方法来完成所需的业务逻辑处理。而且用户亦可编辑自己的函数并 通过Struts 2框架调用实现。实际上,在Struts2 中起作用的业务逻辑并不是用户自 定义的Action ,而是系统生成的Action代理,只不过Action代理以用户定义的 Action为目标。 (3) Struts2 拦截器 拦截器(Interceptor )是Struts 2中的重要组成部分,Struts 2拦截器是在访问 某个Action或 Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器 是可插拔的。拦截器是AOP的一种实现。使用拦截器可以给开发过程带来很多 好处:可以将大问题分解成多个小问题以便于处理,使每个Action更专注于处 理自己的功能。Struts 2拦截器(Interceptor Stack)就是将拦截器按一定的顺序 联结成一条链。图2-2为拦截器功能图。在访问被拦截的方法或字段时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。Struts2拦截器的 实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据 其配置实例化相对的 拦截器对象,然后串成一个列表,最后一个一个地调用列 表中的拦截器。 图2-2 拦截器功能图 (4) Struts 2 标签库 6 Struts 2的标签库也是 Struts 2的重要组成部分,Struts 2的标签库提供了非常 丰富的功能,这些标签不仅提供了表现层数据处理,而且还提供了基本的流程 控制功能,还提供了国际化、Ajax支持等功能。使用标签,开发者可以最大限 度地减少页面代码的书写。 (5)Struts2 框架优势 Struts 2框架( MVC框架)的优势如下: 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现; 丰富的标签库,大大提高了开发的效率; Struts2提供丰富的拦截器实现; 通过配置文件,就可以掌握整个系统各个部分之间的关系; 异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相 应的处理。 2.2 Hibernate 框架 Hibernate是数据持久层的一个轻量级框架,它对 JDBC进行了非常轻量级的 对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用, 也可以在Servlet/JSP 的Web 应用中使用,并且Hibernate是一个开源的orm(object relations mapping)框架,提供了查询获取数据的方法,用面向对象的思想来操 作数据库,节省了我们开发处理数据的时间。目前使用较多且较稳定的版本是 Hibernate3。 2.2.1 Hibernate 工作原理和工作流程 图2-3展示了Hibernate 的工作原理,从该图中很清楚地了解到Hibernate 框 架是在物理数据库之上利用一些配置文件如hibernate.cfg.xml 文件、XML Mapping (映射文件)等来为应用系统提供数据持久化方面的服务,同时达到 将应用系统的持久层与不同的物理数据库系统相互隔离开的目的。 7 图2-3 Hibernate 的工作原理 Hibernate工作流程: 读取并解析配置文件; Configuration负责读取并创建映射信息,创建session factory; SessionFactory负责创建session; Transaction负责开启事物Transaction; Query负责执行持久化操作; Transaction负责提交实物; 关闭session和session factory。 2.2.2 Hibernate 框架的组件分析 (1) Hibernate 核心文件 Hibernate 核心文件主要包括两种类型文件: Hibernate 的配置文件和映射文 件。 Hibernate 的配置文件 hibernate.cfg.xml 可以配置 JDBC 的连接属性和列出所 有的映射文件,对 C3P0 连接池提供了内嵌支持,还可以通过 JNDI 建立数据源, 建立与数据库的连接,同时该文件可以对 Hibernate 的二级缓存进行管理,可以 到动态加载和卸载。 映射文件用于向 Hibernate 提供将对象持久化到关系数据库中的相关信息, 将持久化类与数据库表之间建立起映射。这意味着映射文档是按照持久化类的 定义来创建的,而不是表的定义。这个 xml 文件默认名为*.hbm.xml 。根据映射 文件,Hibernate 可以生成足够的信息以产生所有 SQL 语句,即插入、更新、删 除和查询所需要的 SQL 语句。 8 2.2.3 Hibernate 核心接口 Hibernate3 共有5个核心接口和 1个核心类,分别是 Session 接口、Session Factory 接口、Transaction接口、Query 接口、Criteria 接口和Configuration 类。 Session接口 Session 接口是Hibernate 中使用最广泛的接口,主要用于对数据的增、 删、改、查等操作。而这个Session 对象是非线程安全的,不能被多个线程 共享。 Session Factory 接口 一个Session Factory 对应一个数据存储源,也就是一个数据库对应一个 Session Factory。Session Factory 负责创建Session 对象,并且是线程安全的, 可以被多个线程共享。 Transaction 接口 Transaction 接口是 Hibernate的事务接口,负责处理与事务相关的操作。 它是一个可选的应用程序编程接口,开发人员也可以选择自己设计编写底层 事务的处理代码。 Query 接口 Query 接口是Hibernate 的查询接口,负责执行数据库的各种查询。它提 供了结构化的SQL和面向对象的HQL两种查询方式。 Criteria 接口 Criteria 接口和Query接口非常类似,它允许创建并执行面向对象方式的 查询,而且更擅长于执行动态查询。 Configuration类 Configuration 类负责配置并引导Hibernate,创建Session Factory 对象。它 包含数据库实例的配置信息, 通过它可以创建一个Configuration 类的实例来 管理相应的配置文档。 9 2.2.4 Hibernate 缓存管理 Hibernate 中提供了两级Cache,第一级别的缓存是 Session级别的缓存,它 是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需 进行干预;第二级别的缓存是Session Factory 级别的缓存,它是属于进程范围或 群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和 卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。 2.2.5 Hibernate 框架优势 对象/关系数据库映射(ORM) 它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思 想,完全的面向对象思想 透明持久化(persistent) 带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。 这些对象可能是普通的Java Beans/POJO,这个对象没有实现第三方框架 或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个 Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的 任何层自由使用。 (例如,用作跟表示层打交道的数据传输对象。 ) 事务Transaction (org. hibernate. Transaction) 应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很 短。它通过抽象将应用从底层具体的JDBC、JTA以及 CORBA事务隔离开。某 些情况下,一个Session 之内可能包含多个 Transaction对象。尽管是否使用该对 象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开 启与关闭是必不可少的。 它没有侵入性,即所谓的轻量级框架 移植性会很好 缓存机制,提供一级缓存和二级缓存 简洁的HQL编程 10 2.3 Spring 框架 Spring 是一个基于J2EE 平台的分层的应用程序框架,为企业级应用提供 了一个轻量级的解决方案,这个方案包括声明式事务管理、通过RMI 或Web Service 远程访问业务逻辑、mail 支持工具以及对于数据持久层的各种配置的 支持。Spring还提供了一个MVC 应用框架,Spring 还可以通过集成AOP 透明 地嵌入软件,同时Spring 包含一个优秀的异常处理体系,这个异常体系可以自 动从属性异常体系进行映射。Spring 框架的核心技术是控制反转(IoC)和面 向切面编程(AOP) 。 2.3.1 Spring 框架模块 Spring 框架是一个分层架构,由7 个定义良好的模块组成。Spring 模块构 建在核心容器之上,核心容器定义了创建、配置和管理bean 的方式,如图2-4 所示。 图 2-4 Spring框架模块 组成Spring 框架的每个模块(或组件) 都可以单独存在,或者与其他一 个或多个模块联合实现。每个模块的功能如下: 核心容器 核心容器提供Spring 框架的基本功能。核心容器主要组件是Bean Factory,它是工厂模式的实现。Bean Factory 使用控制反转(IOC) 模式将 应用程序的配置和依赖性规范与实际的应用程序代码分开。 Spring 上下文 Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下 11 文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。 Spring AOP 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。 通过使用Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应 用程序中。 Spring DAO JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常 处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并 且极大地降低了需要编写的异常代码数量(例如打开和关闭连接) 。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。 Spring ORM Spring框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具, 其中包括JDO、Hibernate 和iBatis SQL Map。所有这些都遵从Spring的通用事务 和DAO 异常层次结构。 2.3.2 控制反转(IoC) 和依赖注入(DI) 控制反转即依赖注入是Spring 应用的核心。当应用了IoC技术后,控制权 就由对象本身转向容器,也就是由容器根据配置文件去创建实例并负责控制各 个实例之间的依赖关系。也就是说,一个类不需要去查找或实例化它们所依赖 的类。对象间的依赖关系在对象创建时由负责协调项目中各个对象的外部容器 来提供并管理的。也就是强调了对象间的某种依赖关系式由容器在运行期间注 入调用者的,控制程序间的关系的实现交给了外部的容器来完成。这样,当调 用者需要被调用者对象时,调用者不需要知道具体的实现细节,它只需要从容 器中拿出一个对象并使用就可以了。 依赖注入存在着2种实现方式,分别是设值注入和构造方法注入。 设值注入即Set注入(setter injection ) 指IOC容器使用setter方法来注入被依赖的实例。通过调用无参结构或无参 12 static工厂方法实例化bean后,调用该bean 的setter ,即可实现基于setter的依赖注 入。 构造注入(constructor injection) 指在接受注入的类中定义一个构造方法,并在参数中定义需要注入的元素。 为了让Business 接受Data Base的注入,需要为它定义一个构造方法,来接受 Data Base的注入。 2.3.3 面相切面编程(AOP) AOP 将应用程序分成两大部分,即核心业务逻辑和通用逻辑。使用AOP 后, 应用对象只需关注它们需要关注的核心业务逻辑即可,而无需关注通用逻辑, 如大中型系统都要涉及的事务管理、安全管理、日志管理等。 AOP的出现解决了面向对象编程的局限性。AOP利用了一种称为 “横切”的 技术,将已封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并 将其封装为一个可重用的模块,这个模块可以称为“切面” 。切面将与那些业务 无关,却被业务模块调用的逻辑提取并封装起来,减少了系统中的重复代码, 降低了模块间的耦合度,同时提高了系统的可维护性。 Spring通常可以单纯使用aspect J进行aop,也可以spring和aspect J 联合开发进 行aop。spring 和aspect J联合开发进行aop有两种方式,一是单纯的使用注解,二 是在配置文件中进行定义。前者较为灵活强大,后者更利于管理模块化管理。 2.3.4 Spring 框架优势 Spring框架的优势可以总结为以下几点: 能有效地组织中间层对象。可以有效地将现有框架例如Struts和Hibernate框 架组织起来; 实现了真正意义上的面相接口编程,可实现组件之间的高度解耦; 使用Spring构建的应用程序易于进行单元测试; Springs所秉承的设计思想就是让使用Spring创建的那些应用都尽可能少地 依赖于它的APIs。在Spring应用中的大多数业务对象都不依赖于Spring; 提高了代码的可重用性,它尽可能避免在程序中使用硬编码; 13 简化了底层数据库的访问方式。 3 SSH 框架整合 3.1 整合理念 一个典型的Web 应用系统,按职责一般分为三层,即表示层,业务逻辑层 和数据持久层,每一层次都有其独特的职责,不能把各自的功能与其他层次相 混合。 表示层 位于web应用的最前端,它可以将一个数据视图呈现给用户,也可以接 收用户表单在用户界面上的操作; 业务逻辑层 完成项目各种业务逻辑的实现,表示层通过业务层中提供的方法来完成 一系列的展示工作,而业务层的业务逻辑方法需要通过与持久层的交互来 实现; 数据持久层 将访问数据库的各种操作进行封装,提供给业务层使用。在持久化层的 实现中,常常采用工厂模式和DAO模式来降低应用的业务逻辑和数据库的 访问逻辑之间的关联。 采用Struts、 Spring 和Hibernate 框架技术可以分别实现这三层,即利用 Struts 框架作为系统整体基础架构,负责MVC 的分离,在 Struts 架构的Model 部分,利用Spring 支持业务逻辑,用Hibernate 支持数据持久层,具体整合架 构如图3-1所示。 14 图3-1 Struts+ Spring+ Hibernate 整合结构 Struts 用于表示层,直接面向用户,响应用户的请求,为显示提供一个模 型和一个控制器,并委派调用业务逻辑和其他上层处理等功能。 Spring 在事务管理和依赖注入方面的独特能力,实现处理应用程序的业务 逻辑和业务校验,以及提供与其他层进行相互作用的接口等。 Hibernate 是ORM 的实现,利用它建立Java 对象模型的持久化对象,进而 以面向对象的方式来方便地操作关系数据库 这样Struts、Spring 和Hibernate 就能够很好地封装各个层次的程序,如在处理前台表示层时就不会把事务逻辑 和持久化逻辑掺杂进来,从而最大限度地实现各层的高内聚低耦合目标。 3.2 整合方案 Struts、Spring 和Hibernate 的整合,有很多种不同的方案选取,若要实现 SSH 框架的有机整合以及整个结构的高内聚、低耦合,就需要做出最优的选择。 在这里很多项目的开发人员更愿意使用Spring去整合Struts框架和Hibernate 框架。 3.2.1 Spring 与 Struts 的集成 就当前来看,Spring 和Struts 整合的方式主要有三种,分别如下所述: 使用Web Application Context 这种方式是在Struts 的Action 类中获取Spring 应用上下Web Application Context的实例化对象,通过此对象调用Bean 来实现。 15 继承Spring 的Action Support 这种方式实际上是对第一种方式的简化,当Struts的Action 类继承了Spring 的Action Support 后,直接可以使用Web Application Context 对象,从而简化对 Spring 应用上下文的操作。 将Struts 的Action 托管给Spring 的IoC 容器 这种方式将Struts 的Action 以Bean 的形式托管给Spring,通过Spring IoC 容器来管理各个Action。由于前两种方式存在各种弊端,如Struts 框架对Spring 的依赖性强,若Spring 更新了版本,就必须要重写相关代码。而使用Spring 的 IoC 容器来管理Action,组件依赖注入的工作由IoC 容器自动完成,实现了 Spring 和Struts 的有机整合,因此本文选择第三种整合方式。 在3种框架整合的轻量级J2EE架构中, 一般采用Spring的IoC 容器来管理 Struts Action。采用这种方法能够充分的利用Spring 依赖注入的优势, 而不需要 显示的获取Spring的Application Context实例。Struts2与Spring集成时要用到 Spring的插件包,这个包是随着Struts2一起发布的。 当创建一个新对象时,Spring插件先使用Struts2 配置文件中的class 属性与 Spring配置文件中的id属性进行关联,如果能找到相应对应的关系则由Spring负 责创建对象,否则仍由Struts2框架自身负责创建对象,创建后再由Spring进行装 配。 3.2.2 Spring 与 Hibernate 的集成 Spring 对Hibernate 提供了良好的支持,如对Hibernate 异常的支持、对 Hibe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版河砂运输仓储管理及配送合同
- 2025房地产代理销售协议书:特色小镇文旅地产代理服务
- 二零二五年度生态环保地板砖供货与市场推广合同
- 2025版跑步赛事官方赛事宣传册与海报设计合同
- 2025版房地产担保规定及会计处理办法合同
- 二零二五年金融机构财务顾问聘用协议书
- 2025版化肥行业环保达标改造合同范本
- 2025版企业员工离职交接与保密协议合同范本下载
- 二零二五年珠宝首饰代理销售合作协议模板
- 二零二五年度健康环保电压力锅代理销售合同
- HG20202-2014 脱脂工程施工及验收规范
- 2024-2030年中国粽叶市场发展状况及竞争力研究研究报告
- DB44-T 2503-2024 村镇工业集聚区升级改造工作指南
- 中学舆情应急处置方案
- TD/T 1046-2016 土地整治权属调整规范(正式版)
- 实习手术室护士出科汇报
- (2024年)AED(自动体外除颤器)使用指南
- 门诊分诊知识课件
- 华润认知能力测评题
- 创客教室建设方案
- 乒乓球教练劳务合同范本
评论
0/150
提交评论