




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基本概念Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用MVC模式,能够很好地帮助java 开发者利用J2EE开发Web应用。和其他的java架构一样,Struts 也是面向对象设计,将MVC模式分离显示逻辑和业务逻辑的能力发挥得淋漓尽致。Structs 框架的核心是一个弹性的控制层,基于如 Java Servlets,JavaBeans,ResourceBundles与XML等标准技术,以及 Jakarta Commons 的一些类库。Struts有一组相互协作的类(组件)、Serlvet以及jsp tag lib组成。基于struts构架的web应用程序基本上符合JSP Model2的设计标准,可以说是一个传统 MVC设计模式的一种变化类型。Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,如 JDBC / EJB ,以及其它第三方类库,如 Hibernate / iBATIS ,或者 Object Relational Bridge(对象关系桥)。在视图层,Struts能够与JSP,包括 JSTL 与 JSF,以及 Velocity 模板,XSLT 与其它表示层技术。Struts 为每个专业的 Web 应用程序做背后的支撑,帮助为你的应用创建一个扩展的开发环境。Struts的体系结构与工作原理MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图1所示: 图1Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的体系结构与工作原理如下图2所示: 图2从图2中我们可以知道,Struts的体系结构包括模型(Model),视图(View)和控制器(Controller)三部分。下面让我们从MVC角度来看看struts的体系结构(Model 2)与工作原理:1)模型(Model)在Struts的体系结构中,模型分为两个部分:系统的内部状态和可以改变状态的操作(事务逻辑)。内部状态通常由一组Actinform Bean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。2)视图(View)视图主要由JSP建立,struts包含扩展自定义标签库(TagLib),可以简化创建完全国际化用户界面的过程。目前的标签库包括:Bean Tags、HTML tags、Logic Tags、Nested Tags 以及Template Tags等。3)控制器(Controller)在struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。对于业务逻辑的操作则主要由Action、ActionMapping、ActionForward这几个组件协调完成的,其中Action扮演了真正的业务逻辑的实现者,ActionMapping与ActionForward则指定了不同业务逻辑或流程的运行方向。struts-config.xml 文件配置控制器。Struts体系结构中的组件 图3上图3显示了 ActionServlet (Controller)、Actionform (form State) 和 Action (Model Wrapper) 之间的最简关系。体系结构中所使用的组件如下表:ActionServlet 控制器ActionClass 包含事务逻辑Actionform显示模块数据ActionMapping 帮助控制器将请求映射到操作ActionForward 用来指示操作转移的对象ActionError 用来存储和回收错误Struts标记库可以减轻开发显示层次的工作Struts配置文件:struts-config.xmlStruts配置文件struts-config.xml,我们默认可以在目录WEB-INFstruts-config.xml找到这个文件。文件的配置包括全局转发、ActionMapping类、Actionform bean 和JDBC数据源四个部分。1)配置全局转发全局转发用来在JSP页之间创建逻辑名称映射。转发都可以通过对调用操作映射的实例来获得,例如:NuW=mactionMappingInstace.findForward(logicalName);全局转发的例子:global-forwardsforward name=bookCreated path=/BookView.jsp/global-forwards属性 描述Name 全局转发的名字Path 与目标URL的相对路径2)配置ActionMappingActionMapping对象帮助进行框架内部的流程控制,它们可将请求URI映射到Action类,并且将Action类与Actionform bean相关联。ActionServlet在内部使用这些映射,并将控制转移到特定Action类的实例。所有Action类使用perform()方法实现特定应用程序代码,返回一个ActionForward对象,其中包括响应转发的目标资源名称。例如:action-mappingsaction path=/createBook type=BookAction name=bookform scope=request input=/CreateBook.jsp/actionforward name=failure path=/CreateBook.jsp/forward name=cancel path=/index.jsp/action-mappings属性 描述PathAction类的相对路径Name与本操作关联的Action bean的名称Type连接到本映射的Action类的全称(可有包名)Scope Actionform bean的作用域(请求或会话)Prefix用来匹配请求参数与bean属性的前缀Suffix用来匹配请求参数与bean属性的后缀attribute 作用域名称。className ActionMapping对象的类的完全限定名默认的是org.apache.struts.action.ActionMappinginput 输入表单的路径,指向bean发生输入错误必须返回的控制unknown 设为true,操作将被作为所有没有定义的ActionMapping的URI的默认操作validate设置为true,则在调用Action对象上的perform()方法前, ActionServlet将调用Actionform bean的validate()方法来进行输入检查通过forward元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。属性 描述Id IDClassName ActionForward类的完全限定名,默认是org.apache.struts.action.ActionForwardName操作类访问ActionForward时所用的逻辑名Path响应转发的目标资源的路径redirect若设置为true,则ActionServlet使用sendRedirec方法来转发资源3)配置Actionform BeanActionServlet使用Actionform来保存请求的参数,这些bean的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到Actionform bean的实例,然后将这个实例传送到Action类。例子:form-beansform-bean name=bookform type=Bookform/form-beans属性描述IdIDclassName Actionform bean的完全限定名,默认值是org.apache.struts.action.ActionformBeanName表单bean在相关作用域的名称,这个属性用来将bean与ActionMapping进行关联Type 类的完全限定名4)配置JDBC数据源用data-sources元素可以定义多个数据源:属性描述IdIDKey Action类使用这个名称来寻找连接Type实现JDBC接口的类的名称下面属性需要set-property元素定义,在Struts 1.1版本中已不在使用,但你可用data-source元素。例如:|data-sourcesdata-source id=DS1 key=conPool type=org.apache.struts.util.GenericDataSourceset-property id=SP1 autoCommit=true description=Example Data Source ConfigurationdriverClass=org.test.mm.mysql.Driver maxCount=4minCount=2 url=jdbc:mysql:/localhost/test user=struts password=ghq123 /data-source/data-sources属性 描述desciption 数据源的描述autoCommit 数据源创建的连接所使用的默认自动更新数据库模式driverClass数据源所使用的类,浅谈Struts MVC工作原理及实例1Struts MVC中Model 1 和Model 2简介 我们在开发Web应用时经常提到的一个概念是Model 1/Model 2,那么到底它是什么意思呢?其实它是对采用JSP技术构成Web应用的不同模型的描述。下面对这个概念做一个简单的介绍。 Model 1 在使用JAVA技术建立Web应用的实例中,由于JSP技术的发展,很快这种便于掌握和可实现快速开发的技术就成了创建Web应用的主要技术。JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:scriplet)和HTML(),在JSP页面中同时实现显示,业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model 1。 当然这种开发模式在进行快速和小规模的应用开发时,是有非常大的优势,但是从工程化的角度考虑,它也有一些不足之处: 应用的实现一般是基于过程的,一组JSP页面实现一个业务流程,如果要进行改动,必须在多个地方进行修改。这样非常不利于应用扩展和更新。 由于应用不是建立在模块上的, 业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离。所以非常不利于应用系统业务的重用和改动。 考虑到这些问题在开发大型的Web应用时必须采用不同的设计模式这就是Model2 Model 2 Model 2 表示的是基于MVC模式的框架。MVC是ModelViewController的简写。Model 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), View 是应用的表示面(由JSP页面产生),Controller 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model 1的不足。 Model 2具有组件化的优点从而更易于实现对大规模系统的开发和管理,但是开发Struts MVC系统比简单的JSP开发要复杂许多,它需要更多的时间学习和掌握。同时新东西的引入会带来新的问题(这让我想起来关于自动计算的一篇文章,中间提到为了降低系统的复杂度,却导致更高的复杂度)。 必须基于Struts MVC组件的方式重新思考和设计应用结构。原来通过建立一个简单的JSP页面就能实现的应用现在变成了多个步骤的设计和实现过程。 所有的页面和组件必须在Struts MVC框架中实现,所以必须进行附加地开发工作。 Struts MVC本身就是一个非常复杂的系统,所以采用Struts MVC实现Web应用时,最好选一个现成的MVC框架,在此之下进行开发,从而取得事半功倍的效果。现在有很多可供使用的MVC框架,由于Struts有完整的文档并且相对来讲比较简单,所以用它开发MVC系统还是比较方便地。 2Struts的结构和处理流程简介 Struts是Apache组织的一个项目,像其他的Apache组织的项目一样,它也是开放源码项目。Struts是一个比较好的MVC框架提供了对开发MVC系统的底层支持,它采用的主要技术是Servlet,JSP和custom tag library。获取它的使用版本和具体信息可以查阅网站。 Struts框架的基本构成由下图所示: 图 1 struts uml图作为一个MVC的框架,Struts对Model、View和Controller都提供了对应的实现组件,对应上面的UML图,分别进行介绍,并且看看它们是如何结合在一起的。 Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中Controller功能由图中ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。 Model: Struts MVC系统中的Model部分从概念上可以分为两类系统的内部状态,和改变系统状态的动作。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是开发者从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端表单数据。开发者可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts通常建议使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用像Entity EJB 和 Session EJB等组件来实现系统状态。Struts建议在实现时把做什么(Action)和如何做(业务逻辑)分离。这样可以实现业务逻辑的重用。 View:Struts应用中的View部分是通过JSP技术实现的。Struts提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装,同时这些自定义标记还提供了像模板定制等多种显示功能。 Struts MVC框架的处理流程清楚的体现了MVC系统的特点,简单的Struts组件结构如图2所示。Struts Controller ActionServlet处理客户请求,利用配置的ActionMapping对象把请求映射到Action处理器对象进行处理。Action处理对象访问ActionForm中的数据,处理和响应客户请求,它还调用后台的Bean组件,这些组件封装了具体的业务逻辑。Action处理器对象根据处理结果通知Controller,Controller进行下一步的处理。 图2 Struts框架的组件结构图3利用Struts框架开发Struts MVC系统要做的工作 由于Struts已经为我们提供了一个非常好的MVC框架,我们利用Struts开发MVC系统时可以大大加快开发的速度。在开发时可以采用的一个开发流程如下(引自资料3): 收集和定义应用需求。 基于数据采集和显示的原则定义和开发屏幕显示需求 。 为每一个屏幕显示定义访问路径。 定义ActionMappings建立到应用业务逻辑之间的联系。 开发满足屏幕显示需求的所有支持对象。 基于每一个屏幕显示需求提供的数据属性来创建对应的ActionForm对象 开发被ActionMapping调用的Action对象。 开发应用业务逻辑对象 (Bean,EJB,等等)。 对应ActionMapping设计的流程创建JSP页面。 建立合适的配置文件struts-config.xml , web.xml。 开发/测试/部署 具体在使用Struts框架时,对应各个部分的开发工作主要包括: Model部分:采用JavaBean和EJB组件,设计和实现系统的业务逻辑。根据不同的请求从Action派生具体Action处理对象。完成做什么的任务来调用由Bean构成的业务组件。创建由ActionForm 的派生类实现对客户端表单数据的封装。 Controller部分:Struts为我们提供了核心控制部分的实现。我们只需要配置ActionMapping对象 View部分:为了使用Model中的ActionForm 对象,我们必须用Struts提供的自定义标记创建HTML 表单。利用Struts提供的自定义标记库编写用户界面把应用逻辑和显示逻辑分离。Struts框架通过这些自定义标记建立了View和Model之间的联系。Struts的自定义标记还提供了很多定制页面的功能。 同时需要编辑两个配置文件:web.xml和struts-config.xml。通过它们配置Struts系统中的各个模块之间的交互。下面对这两个配置文件做一些介绍: web.xml文件的配置: web应用中的web.xml是第一个要配置的地方,它描述了系统的Controller对象。在web.xml中增加如下标记 actionorg.apache.struts.action.ActionServlet application 说明:这个servlet对象就是Struts提供的Controller,还可以为它指定初始化参数,比如对系统应用属性的支持。 a ction*.do说明:实现客户请求的url信息和服务器端具体处理的映射关系。 /WEB-INF/struts-bean.tld /WEB-INF/struts-bean.tld说明:添加对Struts提供的应用所使用的自定义标记库的引用。 struts-config.xml文件的配置: struts-config.xml是用于建立Controller和Model之间的关系的。它描述了Controller所使用的把请求对应到具体处理的法则,同时它还描述了客户提供的数据与ActionForm组件的对应映射关系。 在struts-config.xml中增加如下标记 说明:标记描述一个具体的ActionForm子类对象,通过它和JSP页面中的自定标记的结合使用可以实现ActionForm和View之间的数据映射。 说明:标记描述了请求和处理的一对一映射关系。input和path属性唯一的标记了客户端的一个请求,name属性描述封装客户端的数据的ActionForm子类对象。Type属性描述处理这个请求的Action子类对象。 通过对两个配置文件的配置,把Struts MVC框架中MVC的各个部分联系起来,实现一个真正的Struts MVC系统。 spring和hibernate集成我们以项目中的订单Order为例简要说明一下Spring与Hibernate的集成。关于如何使用Hibernate来对数据库表做映射,我们在前面已经做了介绍,这里我们关心的是如何配置Spring,使它能管理Hibernate。其实,只要在Spring的配置文件(我们这里是applicationContext.xml)中配置一个叫做sessionFactory的bean,Spring就可以和Hibernate联系起来了。 com/ascent/bean/hibernate.cfg.xml 这样,Spring和Hibernate的第一步整合就完成了,现在到了关键的地方如何让Spring和Hibernate双剑合璧来实现业务逻辑?还是在applicationContext.xml文件中先做一个配置。 在上面你大概可以感觉到Spring给我们带来的好处了,Spring的IoC模式可以统一管理各层,而又使各层松散耦合在一起,使各层之间实现最大的解耦性,这也是Web架构一向的追求。但是,Spring带来的好处还不止于此,除了IoC还有AOP,Spring可以运用AOP来实现很多功能,最常用的就是事务处理。这里我们用了业务服务(business service)层和数据存取对象(Data Access Object)层,在业务服务层我们增加事务处理,数据存取对象层负责数据读写。首先,组装配置好Service Beans。 PROPAGATION_REQUIRED,readOnly,-OrderException PROPAGATION_REQUIRED,-OrderException,-OrderMinimum AmountException 之后,需要把业务服务对象和数据存取对象也组装起来,并把这些对象配到一个事务管理器(transaction manager)里。在Spring中的配置信息。 图6-10是项目对象搭建的一个提纲。从中可以看出,每个对象都联系着Spring,并且能通过Spring注入到其他对象。把它与Spring的配置文件比较,观察他们之间的关系。Spring就是这样基于配置文件,将各个Bean搭建在一起的。这里我们使用一个TransactionProxyFactoryBean,它定义了一个setTransactionManager(),这个对象很有用,它能很方便地处理你申明的Service Object中的事物,你可以通过transaction Attributes属性来定义怎样处理。TransactionProxyFactoryBean还有个setter,这会被业务服务对象(orderTarget)引用,orderTarget定义了业务服务层,并且它还有个属性,由setOrderDAO()引用这个属性。还有一点要注意,bean可以用两种方式创造,这些都在单例模式(Sington)和原型模式(propotype)中定义了。默认的方式是singleton,这意味着共享的实例将被束缚,而原型模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得到他们自己Bean的Copy时,你应该仅使用prototype模式。这样,Spring和Hibernate就完成了对业务对象的管理。理解了以上的配置,有了整体框架,我们来进行具体代码实现。首先,开发我们的DAO类。先说明一点,由于Spring是提倡面向接口编程的,所以我们先为每个DAO类都定义一个接口。例如,com/ascent/dao目录下的IOrderDAO是业务接口,而com/ascent/dao/hibernate目录下的OrderHibernateDAO是业务接口的实现类。在DAO的实现中,我们使用了Spring对Hibernate的集成类HibernateTemplate。典型的应用经常会被重复的资源管理代码搞乱。很多项目尝试创造自己的方案解决这个问题,有时会为了编程方便牺牲适当的故障处理。对于恰当的资源处理,Spring提倡令人瞩目的简单的解决方案:使用templating的IoC,比如基础的class和回调接口,或者提供AOP拦截器。基础的类负责固定的资源处理,以及将特定的异常转换为unchecked异常体系。Spring引进了DAO异常体系,可适用于任何数据访问策略。Spring提供了对Hibernate的支持:HibernateTemplate、HibernateInterceptor,以及一个Hibernate transaction manager。这样做的主要目的是能够清晰地划分应用层次,而不管使用何种数据访问和事务技术,使应用对象之间的耦合松散。业务对象(Business Object)不再依赖于数据访问和事务策略,不再有硬编码的资源查找(lookup),不再有难于替换的单点模式(singletons),不再有自定义的服务注册。一个简单且坚固的方案连接了应用对象,并且使它们可重用,尽可能地不依赖容器。虽然所有的数据访问技术都能独立使用,但是,它与Spring application context结合更好一些,它提供了基于xml的配置和普通的与Spring无关的JavaBean实例。在典型的Spring app中,很多重要的对象都是JavaBeans:数据访问template、数据访问对象(使用template)、transaction managers、业务对象(使用数据访问对象和transaction managers)、web view resolvers、web controller(使用业务对象)等。/* */package com.ascent.dao;import java.util.List;import com.ascent.bean.Orders;/* author */public interface IOrderDAO /* * * param Order * return Order */ public Orders saveOrder(Orders order); /* * * param id Integer * * return Order */ public Orders getOrder(Integer id); /* * * return List */ public List findOrderAll(); /* * * param type String * * return List */ public List findOrderByCust(Integer custId); /* * * param Order * */ public void removeOrder(Orders order);/* */package com.ascent.dao.hibernate;import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator;import java.util.List;import net.sf.hibernate.HibernateException;import net.sf.hibernate.Session;import net.sf.hibernate.Transaction;import org.springframework.orm.hibernate.support.HibernateDaoSupport;import com.ascent.bean.Orders;import com.ascent.bean.Orderitem;import com.ascent.dao.IOrderDAO;/* author */public class OrderHibernateDAO extends HibernateDaoSupport implements IOrderDAO private static final String LOAD_ALL = from Order ord order by ord.orderId desc; private static final String LOAD_BY_CUST = from Order ord where ore.CustId = ? order by ord.orderId desc; /* * */ public OrderHibernateDAO() super(); /* * * param Order * return Order */ public Orders saveOrder(Orders order) try this.getHibernateTemplate().save(order); Iterator it = order.getOrderItems().iterator(); while(it.hasNext() Orderitem item = (Orderitem)it.next(); this.getHibernateTemplate().save(item); return order; catch(Exception ex) ex.printStackTrace(); return null; /* * * param id Integer * * return Order */ public Orders getOrder(Integer id) return (Orders)this.getHibernateTemplate().get(Orders.class,id); /* * * return List */ public List findOrderAll() try return this.getHibernateTemplate().find(LOAD_ALL); catch(Exception ex) ex.printStackTrace(); return new ArrayList(); /* * * param type String * * return List */ public List findOrderByCust(Integer custId) try return this.getHibernateTemplate().find(LOAD_BY_CUST,custId); catch(Exception ex) ex.printStackTrace(); return new ArrayList(); /* * * param Order * */ public void removeOrder(Orders order) this.getHibernateTemplate().delete(order); service的实现如下。/* */package com.ascent.business;import java.util.List;import com.ascent.bean.Orders;/* author */public interface IOrderService /* * * param order * return */ public abstract Orders saveNewOrder(Orders order); /* Find an order by the user that placed the order* param user Person that placed the order* return Order*/public abstract List findOrderByCustomer(Integer id);/* Find an order by ID* param id* return Order*/public abstract Orders findOrderById(int id);/* * param order*/public abstract void removeOrder(Orders order);/* */package com.ascent.business.service;import java.util.Iterator;import java.util.List;import java.util.Set;import com.ascent.bean.Orders;import com.ascent.bean.Orderitem;import com.ascent.business.IOrderService;import com.ascent.dao.IOrderDAO;/* author */public class OrderServiceImpl implements IOrderServ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年摄影技巧试题题库及答案
- 2025年凉山州林业局考试试题及答案
- 旅游类专业试题及答案
- 临床专业试题模板及答案
- 公卫专业试题及答案
- 外包加工合同范本2025年版2篇
- 转数学专业试题及答案
- 2025年育婴师(初级)职业技能鉴定答辩技巧高频考点试卷及答案
- 2025年吉林口腔助理医师考试答案-吉林口腔助理医师考试答案解析
- 口腔专业三基试题及答案
- 一年级上册语文晨读课件
- 高职院校教师职业发展规划指南
- 2025重庆市专业应急救援总队应急救援人员招聘28人考试参考题库及答案解析
- 黑龙江省龙东地区2025届中考数学试卷(含解析)
- 2025-2026学年人教版(2024)小学美术二年级上册(全册)教学设计(附目录P144)
- 2025高考地理试题分类汇编:地球上的水含解析
- 2026届高考作文写作素材:《感动中国》2024年度十大人物素材及其运用
- GB/T 28121-2011非热封型茶叶滤纸
- 2023年廊坊市投资控股集团有限公司招聘笔试模拟试题及答案解析
- 苹果栽培学完整版课件
- 湿性愈合和新型敷料选择课件
评论
0/150
提交评论