已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,SSH三大框架,2,SSH三大框架,Web层Struts2框架,Ssh框架图解,业务层Spring框架,持久层Hibernate,数据库,3,Hibernate,Hibernate简介。Hibernate的Xml配置方法。Hibernate应用步骤。主键生成机制。,4,Hibernate简介?,Hibernate是对象/关系映射(ORM)的解决方案。-hibernate是java和关系型数据库的桥梁,负责java对象和关系数据的映射。-hibernate是一个开源的对象关系型映射框架,它对jdbc进行了非常轻量级的对象封装。-hibernate的目标是成为java平台管理数据持久问题的完整解决方案。-使java开发人员更加专注于业务的熟悉和处理,而非对数据库的基本操做,同时让开发人员以面对对象的思想操作数据库Hibernate原理就是利用了ORM映射机制。他的本质就是将数据从一种形式转换成另一种形。就是将对象模型中的实体类存入关系模型中,实体中类对应关系模型中中的一个表,实体类中的属性对应表中的一个列,实体类的一个实对应数据库的一条记录。,5,Hibernate结构,简单介绍hibernate的结构,6,hibernate简介,-Hibernate是一个优秀的java持久层的解决方案-是是当今主流的对象关系型映射工具-Hibernate简化了jdbc繁琐的代码-Hibernate将数据库的链接信息都放在配置文件中,7,Hibernate配置的两种方法,1.属性文件(Hperties)调用代码:Configurationconf=newConfiguration();2.Xml文件(Hibernate.cfg.xml)调用代码:Configurationconf=newConfiguration().configure();,8,Hibernate配置文件的书写,Hibernate.cfg.xml,9,Hibernate映射文件的书写,Student.hbm.xml,10,Hibernate常用的主键生成策略,1:assigned-表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。2:increment-表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。(1)新增数据前先查询一遍,影响了性能。(2)主键的类型只能为数值型的int或者long(3)并发操作时的冲突问题。3:identity-不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。4:native-表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用5.sequenceDB2、Oracle均支持的序列,用于为long、short或int生成唯一标识,11,Hibernate关联关系映射,1:一对一关联2:一对多关联3:多对多关联,12,创建一个Hibernate的步骤,1.创建一个web项目,导入Hibernate所需要的.jar包2.在数据库中创建表格,3.创建对应的pojo类,4.创建Hibernate.hbm.xnl配置文件配置数据库相关属性5.创建对应pojo类的映射文件,与数据库中的表对应,13,Hibernate常用的接口,1.Configuration接口configuration对象用于加载解析配置文件启动Hibernate,然后创建SessionFactory实例2.SessionFactory接口一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获取Session实例。SessionFactory有以下特点:1.它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。2.它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。之所以称SessionFactory是重量级的,因为它需要一个很大的缓存,用来存放预定义的SQL语句及映射元数据等。用户还可以为SessionFactory配置一个缓存插件,这个缓存插件被称为Hibernate的二级缓存,该缓存用来存放被工作单位读过的数据,将来其他工作单元可能会重用这些数据,因此这个缓存中的数据能被所有的工作单元共享。一个工作单元通常对应一个数据库事务。,14,Hibernate常用的接口,3.Session接口Session用来操作数据库;session接口是Hibernate应用中最广泛的接口。Session也被称为持久化管理器。它提供了和持久化相关的操作。Session有以下特点:1.它不是线程安全的,因此在设计软件架构的时候,应该避免多个线程共享一个Session实例。2.Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗过多的资源。这意味着在程序中可以经常地创建或者销毁Session对象,如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Session实例。session有一个缓存,被称为Hibernate的第一级缓存,它存放被当前工作单元加载的对象,每个Session实例都有自己的缓存,这个Session实例的缓存只能被当前的工作单元访问。4.Transaction接口Transaction接口是Hibernate的数据库的数据库事务接口,它对底层的事务接口做了封装。底层事务接口包括:1.jdbcAPI2.JTA(JAVATransationAPI)3.CORBA(CommonObjectRequestBrokerArchitecture)API5.Query和Criteria查询数据,15,Hibernate操作数据库,1读取并解析配置文件Configurationconf=newConfiguration().configure();2读取并解析映射信息,创建SessionFactorySessionFactorysf=conf.buildSessionFactoty();3打开SessionSessionsession=sf.openSession;/sf.getCurrentSession();4开始一个事务(增删改操作必须,查询操作可选)Transactiontx=session.beginTransaction();5数据库操作session.sava();/实现添加功能6提交事务(回滚事务)mit();(tx.rollback();)7关闭sessionsession.close();,16,Hibernate缓存机制,1.Hibernate缓存机制分为一级缓存和二级缓存Session的缓存被称为hibernate的第一级缓存。默认是开启的。SessionFactory的外置缓存称为hibernate的二级缓存。这两个缓存都位于持久层,它们存放的都是数据库数据的拷贝。SessionFactory的内置缓存存放元数据和预定义SQL,SessionFactory的内置缓存是只读缓存。,17,Session缓存的三大作用,1,减少数据库的访问频率,提高访问性能。2,保证缓存中的对象与数据库同步,位于缓存中的对象称为持久化对象。3,当持久化对象之间存在关联时,Session保证不出现对象图的死锁,18,缓存配置文件中的属性说明,设置缓存数据文件的存放目录设置缓存的默认数据过期策略设定具体的命名缓存的数据过期策略每个命名缓存代表一个缓存区域,每个缓存区域有各自的数据过期策略。命名缓存机制使得用户能够在每个类以及类的每个集合的粒度上设置数据过期策略。cache元素的属性name设置缓存的名字,它的取值为类的全限定名或类的集合的名字maxInMemory设置基于内存的缓存中可存放的对象最大数目eternal设置对象是否为永久的,true表示永不过期,此时将忽略timeToIdleSeconds和timeToLiveSeconds属性;默认值是falsetimeToIdleSeconds设置对象空闲最长时间,超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。timeToLiveSeconds设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在于缓存中。overflowToDisk设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中,19,Session什么时候清理缓存?,1,commit()方法被调用时2,查询时会清理缓存,保证查询结果能反映对象的最新状态。3,显示的调用session的flush方法,20,Struts2,21,Struts2简介,Struts2是一个web框架,一个mvc框架Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2的变化很小。Struts2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是Struts2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,22,Struts2原理,在Struts2框架中的处理大概分为以下几个步骤1客户端初始化一个指向Servlet容器(例如Tomcat)的请求2这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMeshPlugin)3接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类6ActionProxy创建一个ActionInvocation的实例。7ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。8一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper基本简要流程如下:1、客户端浏览器发出HTTP请求。2、根据web.xml配置,该请求被FilterDispatcher接收。3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。6、返回HTTP响应到客户端浏览器。,供核心控制器FilterDispatcher来使用,23,Struts2的处理流程,StrutsPrepareAndExecuteFilter,Interceptor,Action,Result,Jsp/html,用户请求,Struts2内置的一些拦截器或用户自定义拦截器,用户编写的action类,类似struts1中的Action,类似struts1中的forward,响应,StrutsPrepareAndExecuteFilter是Struts2框架的核心控制器,它负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径不带后缀或者后缀以.action结尾,这时请求将被转入Struts2框架处理,否则Struts2框架将略过该请求的处理。当请求转入Struts2框架处理时会先经过一系列的拦截器,然后再到Action。与Struts1不同,Struts2对用户的每一次请求都会创建一个Action,所以Struts2中的Action是线程安全的。,24,搭建Struts2开发环境,搭建Struts2环境时,我们一般需要做以下几个步骤的工作:1找到开发Struts2应用需要使用到的jar文件.2编写Struts2的配置文件3在web.xml中加入Struts2MVC框架启动配置,25,Struts2需要的jar包,下面给出了开发Struts2程序最少需要的JAR。struts2-core-2.x.x.jar:Struts2框架的核心类库xwork-core-2.x.x.jar:XWork类库,Struts2在其上构建ognl-2.6.x.jar:对象图导航语言(ObjectGraphNavigationLanguage),struts2框架通过其读写对象的属性freemarker-2.3.x.jar:Struts2的UI标签的模板使用FreeMarker编写commons-logging-1.x.x.jar:ASF出品的日志包,Struts2框架使用这个日志包来支持Log4J和JDK1.4+的日志记录。commons-文件上传组件,2.1.6版本后必须加入此文件,26,搭建Struts2开发环境-Struts2应用的配置文件,27,细说常量定义,常量可以在struts.xml或perties中配置,建议在struts.xml中配置,两种配置方式如下:在struts.xml文件中配置常量在perties中配置常量struts.action.extension=do因为常量可以在下面多个配置文件中进行定义,所以我们需要了解struts2加载常量的搜索顺序:pertiesweb.xml如果在多个文件中配置了同一个常量,则后一个文件中配置的常量值会覆盖前面文件中配置的常量值.,28,常用的常量介绍,29,Action配置中的各项默认值,/WEB-INF/page/hello.jsp1如果没有为action指定class,默认是ActionSupport。2如果没有为action指定method,默认执行action中的execute()方法。3如果没有指定result的name属性,默认值为success。,30,Action中result的各种转发类型,/WEB-INF/page/hello.jspresult配置类似于struts1中的forward,但struts2中提供了多种结果类型,常用的类型有:dispatcher(默认值)、redirect、redirectAction、plainText。在result中还可以使用$属性名表达式访问action中的属性,表达式里的属性名对应action中的属性。如下:/view.jsp?id=$id下面是redirectAction结果类型的例子,如果重定向的action中同一个包下:helloworld如果重定向的action在别的命名空间下:helloworld/testplaintext:显示原始文件内容,例如:当我们需要原样显示jsp文件源代码的时候,我们可以使用此类型。/xxx.jspUTF-8,31,指定需要Struts2处理的请求后缀,前面我们都是默认使用.action后缀访问Action。其实默认后缀是可以通过常量”struts.action.extension“进行修改的,例如:我们可以配置Struts2只处理以.do为后缀的请求路径:如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。如:,32,搭建Struts2开发环境-Struts2在web中的启动配置,在struts1.x中,struts框架是通过Servlet启动的。在struts2中,struts框架是通过Filter启动的。他在web.xml中的配置如下:struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterorg.apache.struts2.dispatcher.FilterDispatcher-struts2/*在StrutsPrepareAndExecuteFilter的init()方法中将会读取类路径下默认的配置文件struts.xml完成初始化操作。注意:struts2读取到struts.xml的内容后,以javabean形式存放在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件,33,为应用指定多个struts配置文件,在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿。为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通过元素指定多个配置文件:通过这种方式,我们就可以将Struts2的Action按模块添加在多个配置文件中。,34,Struts2优点,Struts2是在WebWork2基础发展而来的。和struts1一样,Struts2也属于MVC框架。不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但Struts2和struts1在代码编写风格上几乎是不一样的。那么既然有了struts1,为何还要推出struts2。主要是因为struts2有以下优点:1.在软件设计上Struts2没有像struts1那样跟ServletAPI和strutsAPI有着紧密的耦合,Struts2的应用可以不依赖于ServletAPI和strutsAPI。Struts2的这种设计属于无侵入式设计,而Struts1却属于侵入式设计。publicclassOrderListActionextendsActionpublicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsException2.Struts2提供了拦截器,利用拦截器可以进行AOP编程,实现如权限拦截等功能。3.Strut2提供了类型转换器,我们可以把特殊的请求参数转换成需要的类型。在Struts1中,如果我们要实现同样的功能,就必须向Struts1的底层实现BeanUtil注册类型转换器才行。4.Struts2提供支持多种表现层技术,如:JSP、freeMarker、Velocity等5.Struts2的输入校验可以对指定方法进行校验,解决了Struts1长久之痛。6.提供了全局范围、包范围和Action范围的国际化资源文件管理实现。,35,Spring,36,36,Spring简介,Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的。目的:解决企业应用开发的复杂性。功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能。范围:任何Java应用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。,37,37,Spring简介,Spring即是一个容器又是一个框架。容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。Spring是一个轻量级的解决方案,Spring是模块化的,允许你使用仅需要的部分。Spring提供了很多基础的与业务逻辑无关的功能比如:事务管理、持久化框架集成等等比如:事务管理、持久化框架集成等等,使用Spring框架,开发人员可以专注于业务逻辑开发,这个意义上讲它是一个框架。,38,38,Spring核心模块(SpringCore)Spring的核心容器模块,它提供IOC的支持。该模块中包含BeanFactory,它采用工厂模式来实现IOC,负责对bean的生命周期的管理。ApplicationContext(上下文模块)该模块扩展了BeanFactory的功能,例如提供了i18n,系统生命周期以及验证的支持Spring的AOP模块该模块为应用系统的AOP开发提供了支持。,Spring模块,39,39,Spring体系结构,40,40,IOC(Inversionofcontrol)即控制反转。IOC即使用容器来控制程序之间的依赖关系,而非用程序代码来控制。控制权由原来的代码转移到到了容器,所以也称之为反转控制。IOC又名,依赖注入,DI(DependencyInjection)。依赖注入:组件之间的依赖关系,由容器运行时动态的注入,而非编写代码给定。,IOC,41,41,没有使用IOC的订单管理的业务类保存订单的代码,未使用IOC示例代码,privateOrderDaoorderDao=null;publicOrderDaogetOrderDao()/未使用IOC,代码新建Dao的实例orderDao=newOrderDao();publicvoidsaveOrder(Orderorder)/获取Dao,调用Dao的方法保存订单getOrderDao().save(order);,42,42,使用IOC示例代码,privateOrderDaoorderDao=null;publicOrderDaogetOrderDao()/使用IOC,Dao由容器调用当前对象的/setOrderDao方法设置,所以直接返回DaoreturnorderDao/容器自动调用该方法注入当前对象依赖的OrderDaopublicvoidsetOrderDao(OrderDaodao)this.orderDao=dao;publicvoidsaveOrder(Orderorder)/获取Dao,调用Dao的方法保存订单getOrderDao().save(order);,43,43,Spring是一个轻量级的框架,轻量级与重量级框架没有明显的界限,一般以是否需要特定的Application服务为界。轻量级:非侵入式,框架更小,性能高。反向控制:Spring提倡使用IOC来实现松耦合,使用IOC对象是被动接收依赖类而不是主动去找。面向切面:Spring对面向切面的编程提供了强大的支持,例如可以将系统的事务,日志从业务代码中分离出来。容器:Spring是一个容器,它负责管理系统对象的生命周期和配置,例如你可以配置一个bean是产生一个实例还是每次请求都产生一个实例,它的容器相对于EJB容器更加简洁。框架:Spring实现了使用简单的组件来配置组装一个复杂的系统。,Spring的特点,44,44,JDBC和DAO模块提供了JDBC封装的模板代码,使得使用JDBC开发更加简洁。O/R映射模块该模块提供了对许多流行的ORM框架的支持,其中包括Hibernate,JDO和iBATISSQL的支持SpringWeb模块该模块中Spring提供了对其它的WEB框架的支持,包知Struts,JSF,WEBWORK等SpringMVC框架Spring提供的用于开发WEB应用的MVC框架,Spring模块,45,45,核心容器提供了IOC的具体实现,所有的其它模块都是建立在它的基础之上。建立Spring核心应用的基本步骤引用Spring相关的Jar文件建立Spring的配置文件,它是一个XML文件,用于配置配置Bean的实例及依赖关系。建立Bean类,并在XML文件中注册及注入依赖。根据配置文件建立容器实例即:BeanFactory实例。通过BeanFactory获取容器中的Bean实例。,建立Spring核心应用,46,46,Spring的配置文件,Spring2.0的核心容器只需要Spring.jar文件即可。Spring配置文件示例:配置文件一般存放在类路径中,以applicationContext.xml命名,Spring充许有多个配置文件。,/注册bean及依赖,47,47,注册Bean的实例及依赖,Spring中Bean实例的注册及依赖注入示例:,/注册了一个com.Bar的实例bar/*注册一个com.Foo的实例foo,并为之注入了bar的属性,属性值引用已注册的bar实例*/,48,48,建立使用BeanFactory,BeanFactory为Spring核心容器的实现接口。示例建立BeanFactory实例:,BeanFactorybf=newXmlBeanFactory(newClassPathResource(applicationContext.xml);,从当前BeanFactory中获取Bean实例,Foofoo=(Foo)bf.getBean(foo);,49,49,使用上下文模块,Spring上下文模块,封装了Spring的核心模块,提供了更多的应用功能,Spring提供了三种类型的上下文,分别用于同的应用环境:ClassPathXmlApplicationContext通过引用类路径中的配置文件来建立ApplicationContext实例。通过引用文件系统中的配置文件来建立ApplicationContext实例。XmlWebApplicationContext从Web应用的环境中获取配置文件。,建立Spring上下文实例,并获取注册的Bean:,ApplicationContextapp=newClassPathXmlApplicationContext(applicationContext.xml);Foofoo=(Foo)app.getBean(foo);,50,50,JavaWeb与Spring的整合,JavaWeb实例化ApplicationContext,contextConfigLocationclasspath:resource/spring/applicationContext*.xml/配置Spring配置文件/配置监听以实例化Spring上下文org.springframework.web.context.ContextLoaderListener,51,51,JavaWeb与Spring的整合,Jsp/Servlet中获取Spring的Bean实体,srv.TestServicests=(srv.TestServices)WebApplicationContextUtils.getWebApplicationContext(this.getServletContext().getBean(sayHello);,52,52,Spring中Bean生命周期,53,53,SpringIOC配置,Spring的核心容器负责管理Bean的生命周期,并负责注入Bean的依赖。Set注入利用属性的set方法注入其依赖的对象构造注入基于构造方法数据类型的注入基于构造方法索引的注入基于构造方法参数名字的是注入自动注入在Spring构建Bean的实例后,自动搜索与Bean属性名或类型相匹配的其它Bean实例并注入。,54,54,Set注入的方法,使用注入已注册的其它的Bean实例。,55,55,基于构造方法注入,。,56,56,构造注入与Set注入比较,构造注入的优点构造注入提供了强制依赖,如果某些属性没有注入,bean将无法被实例化bean的更加简洁,因为bean的属性通过构造方法注入,而无需为bean的属性提供set方法因为只有通过构造方法才能设置bean的属性可以保证bean的属性不变性构造注入的缺点如果bean的属性非常多,势必造成构造方法的参数会很长如果一个bean有已有多个构造方法,那么很难再提出不同的构造方法,因为只能通过构造方法的参数来区分不同的构造方法如果一个构造参数有两个类型相同的参数,很难确定他们的用途另外构造函数注入不利于类的继承一个好的尺度是对于那些必需的属性可使用构造注入,而对于非必需的属性可考虑使用set注入。,57,57,构造注入与Set注入比较,构造注入的优点构造注入提供了强制依赖,如果某些属性没有注入,bean将无法被实例化bean的更加简洁,因为bean的属性通过构造方法注入,而无需为bean的属性提供s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年病科社区健康服务
- 对员工大会演讲稿
- 《号资产减值》课件
- 小学生食品安全主题班会课件
- 分期车回收合同范例
- 新质生产力助力低碳城市建设
- 市政井盖工程合同范例
- 婚纱礼服馆合同范例
- 律师刑事合同模板
- 毕业论文答辩演讲稿
- 2024年山东省公务员考试《行测》真题及答案解析
- 2024-2030年中国发芽米行业发展现状及投资规模分析报告
- (一模)宁波市2024学年第一学期高考模拟考试 历史试卷(含答案)
- 山东省枣庄市滕州市2024-2025学年九年级上学期11月期中物理试题(无答案)
- 2024年人教版八年级历史上册期末考试卷(附答案)
- 天津市河东区2024-2025学年七年级上学期期中数学试卷(含答案)
- 2024新版(粤教沪教版)三年级英语上册单词带音标
- 拆违服务合同模板
- 2025届高三听力技巧指导-预读、预测
- GB/T 31486-2024电动汽车用动力蓄电池电性能要求及试验方法
- JGJ/T235-2011建筑外墙防水工程技术规程
评论
0/150
提交评论