




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Good is good, but better carries it.精益求精,善益求善。Struts210+Spring25+Hibernate32框架Struts2.0+Spring2.5+Hibernate3.2框架1.系统架构:采用J2EE的三层结构,分为表现层、业务逻辑层和数据服务层。三层体系将业务规则、数据访问等工作放到中间层处理,客户不直接与数据库交互,而是通过控制器与中间层建立连接,再由中间层与数据库交互。中间层采用Spring+Hibernate,为了分离控制器与业务层,又可细分为:控制器层,负责表现层与业务逻辑层的交互,调用业务逻辑层,并将业务数据返回给表现层作显示。MV
2、C框架采用流行的struts2Service层(业务逻辑层),负责实现业务,对DAO对象进行正面模式的封装DAO(数据访问层),负责与持久化对象交互,封装了数据的增、删、查、改原子操作PO层(持久化对象层),通过实体/关系的映射工具,将关系型数据库的数据映射成对象,实现以面向对象方式操作数据库,这个系统采用Hibernate作为O/RMapping框架。中间层是这个系统的关键所在,而Spring的作用贯穿了整个中间层,将web层、Service层、DAO、PO无缝整合。用户界面业务数据组织和表示MVC架构模式的控制层控制业务逻辑层与表现层的交互业务逻辑的实现层数据访问对象与持久化对象交互通过实
3、体-关系映射O-RMapping由数据库表得来对象存放数据视图层Web层Service层DAO层持久化对象数据服务层Struts2Spring2.5+Hibernate3.2系统架构图中间层MVC框架Web浏览器JSP页面Struts的核心控制器业务控制器ActionActionManager后台服务系统业务流程图应用程序的分层,多数web应用程序都能至少分为4个各负其责层次,这些层次依次为:表现层、业务层、领域模型层、持久层,每个层次在应用程序中都有明确的责任,不应该和其它层次的职责发生混淆。每个层次功能是彼此独立的,但是都应提供通讯接口,以便其它层次使用本层次的功能。Struts负责的:为
4、用户管理请求和响应;提供一个控制器代理调用业务逻辑和其它上层处理;处理从其它层掷出给一个StrutsAction的异常;为显示提供一个模型;执行用户接口验证。业务层在一个典型的web应用程序的中间的组件是业务层或服务层。从编码的视角来看,这个服务层是最容易被忽视的一层。不难在用户接口层或者持久层里找到散布在其中的这种类型的代码。这不是正确的地方,因为这导致了应用程序的紧耦合,这样一来,随着时间推移代码将很难维护。在这个领域两个最流行的框架是HYPERLINK/z/spring/index.htmlt_blankSpring和PicoContainer,它们叫作微容器,可以不费力不费神的把你的对
5、象连在一起。所有这些框架都工作在一个简单的叫作“依赖注入”(也通称“控制反转”)的概念上。业务层应该负责下面这些事情:处理应用程序的业务逻辑和业务验证;管理事务;预留和其它层交互的接口;管理业务层对象之间的依赖;增加在表现层和持久层之间的灵活性,使它们互不直接通讯;从表现层中提供一个上下文给业务层获得业务服务;管理从业务逻辑到持久层的实现。领域模型层基于web的应用程序,需要一组能在不同的层之间移动的对象。领域对象层由那些代表现实世界中的业务对象的对象们组成。这个层让开发者停止建立和维护不必要的数据传输对象(或者叫作DTOs),来匹配他们的领域对象。例如,Hibernate允许你把数据库信息读
6、进领域对象的一个对象图,这样可以在连接断开的情况下把这些数据显示到UI层。那些对象也能被更新和送回到持久层并在数据库里更新。而且,不必把对象转化成DTOs,因为DTOs在不同的应用层间移动,可能在转换中丢失。这个模型使得Java开发者自然地以一种面向对象的风格和对象打交道,没有附加的编码。持久层在典型web应用的另一端是持久层。查询相关的信息成为对象。保存、更新、删除储存在数据库中的信息。其中模型层、持久化层、数据库层之间的关系是上层依赖下层,而下层对上一层依赖很少。模型层实际上又分为数据访问层(DAO)和数据管理层(Manager)。系统使用Hibernate来实现持久化层,在这一层使用DA
7、O模式。DAO模式是J2EE核心模式中的一种,其主要行为就是在业务核心方法和具体数据源之间在再加一层,用这一层来连接业务方法和数据源,从而实现解耦,使得系统非常容易在各个数据库之间移植。在DAO模式种,每一个持久化类都对应一个DAO,而一个DAO包括接口和实现。接口说明持久化类的操作方法,如CRUD操作,在接口的实现中则是具体使用hibernateAPI来实现接口。对与上层来说,只需要调用接口中的方法即可。DAO模式一般和工厂方法联合使用的。通过一个工厂方法来产生所有DAO接口。DAO是DataAccessObject数据访问接口,位于业务层和数据层之间。DAO的主要功能:(1)DAO用来封装
8、DataSource的,比如Connectionconn=DAOFactory.createConnection().这样就可以把Drive.URL.username,password这一些放在DAO中。以后要改变数据库的类型,比如把MSSQL换为Oracle的话,只需更该DAOFactory里面的getConnection()的Driver.URL就行。(2)DAO也是把对数据库的操作(比如最为基本的CRUD操作)全部封装在里面。要插入一个新的用户,那么在DAO中只需提供一个insertUser(Useruser)这个方法就可以了。具体操作在DAO中实现。一般DAO是与AbstrFactor
9、y模式一起使用的。Factory用来建立数据库和定位具体的DAO(比如是UserDao还是CustomerDao)。一般将getConnection设置为static,也可以把HibernateSessionFactory这个公共类放在AbstractFactory类中去。PublicclassDAOFactoryPrivatestaticfinalSessionFactorysessionFactory;StaticSessioncurrentSession()PublicUserDaogetUserDAO()ReturnnewUserDaoImpl(session);Publicother
10、DaogetOtherDAO()PublicinterfaceUserDaoPublicinsertUser(FormBean);PublicupdateUser(FormBean);/然后实现DAO接口PublicclassUserDaoImplimplementsUserDaoPrivateSessionsession;PublicUserDaoImpl(Sessionsession)This.session=session;PublicinsertUser(FormBean)/Session.save(UserPO);/ReturnFormBean;PublicFormBeanupdat
11、eUser(FormBean)/Session.update(UserPO);/ReturnFormBean;最后定义POPublicclassuserPOStringfirstname,lastname,password开发工具:myeclipse6.5Web服务器:Tomcat6.0数据库服务器SQLServer20002Struts2.0框架Struts2框架可以分为3个部分,即核心控制器FilterDispatcher、业务控制器action和用户实现的企业业务逻辑组件。核心控制器FilterDispatcher是struts2框架的基础,包含框架内部的控制流程和处理机制。业务控制器a
12、ction和企业业务逻辑组件是要用户自己实现的。业务逻辑控制器action的execute()返回一个String类型的值,Struts2提供一个ActionSupport工具类,该类实现了action接口和validate()方法,一般开发人员编写action可以直接继承ActionSupport类。编写Action类之后,还要在xml文件中配置action,一个action包括一下几个方面:该action的name,即用户请求所指向的URLAction所对应的class名称,对应于action类的位置指定result逻辑名称和实际资源的定位注意:Action中,不实现任何的业务逻辑,只是负
13、责组织调度业务逻辑组件。Struts2框架是基于MVC模式开发的,提供一个核心的控制器,用于对所有的请求进行统一的处理。这个控制器的名字就是FilterDispatcher的servlet过滤器来充当。需要在web.xml文件中配置FilterDispatcher,制定要映射到FilterDispatcher的URL样式,匹配这个URL请求,都将被web容器交由FilterDispatcher进行处理。Struts2使用action代理,Action代理可以根据系统配置,加载一系列拦截器,由拦截器将HttpServletRequest参数解析出来,再传入action。同样action处理结果也
14、通过拦截器传入HttpServletResponse,然后由HttpServletRequest传给用户,这个过程就是典型的AOP。Action就是一段只有特定的URL被请求时才会执行的代码。当一个action创建完成之后,需要为其配置一个URL,只有这样FilterDispatcher才知道是哪个URL对应哪个action,当截获访问该URL的请求时,FilterDispatcher就知道调用对应的action对请求进行处理。FilterDispatcher根据请求URL不同,来执行不同的action,action执行的结果通常都对应一个要呈现给用户的result,这个result就是HTM
15、L页面,也可以是一个PDF或是Excel电子表,action与其对应的result是在struts.xml的配置文件中进行配置的。业务控制器Action,是由用户自己开发的,Action类实际就是一个简单的Java类,与ServletAPI完全分离。Action方法一般都有一个execute()方法,同时也可以定义其他的业务控制,execute()方法返回一个String类型的值。Struts2提供一个ActionSupport工具类,该类实现Action接口和Validate()方法。一般开发人员编写action类时,可以直接继承ActionSupport类。编写完Action类之后,必须在
16、配置文件中培植action,一个action的配置应该包含以下几个方面:该action的name,即用户请求所指向的URLaction所对应的class元素,对应action类的位置。指定result逻辑名称和实际的资源的定位。Action是业务控制器,因此应避免将业务逻辑处理放在其中,减少action与业务逻辑模块的耦合程度。业务模型组件,实现业务逻辑的模块,可以是EJB、POJO、或者Javabean。Struts2框架的目的就是使用action来调用业务逻辑模块。21Struts2配置文件Struts2核心的配置文件是缺省的struts.xml,这个文件也是struts2框架主动加载的文
17、件,在这个文件中可以定义自己的一些action、interceptor、package等。Package通常继承struts-default包。struts文件可以放入jar中,并自动插入应用程序,这样每个模块可以包含自己的配置文件并自动配置。Struts2框架一般包含两个配置文件,struts2.xml和perties文件。前者定义了包、包的名称、action、拦截器、和拦截器栈等信息,主要用于struts2框架的action映射。后者是一个属性定义文件,定义struts2框架中的大量属性值、常量,开发者一般可以修改这个文件。Struts2配置文件是整个框架的联系的纽带,是配置文件将stru
18、ts2的核心控制器FilterDispatcher、业务控制器action、视图组件等联系在一起。配置文件的分类:(1)管理元素bean配置常量配置包配置命名空间配置包含配置(2)用户请求处理元素拦截器配置action配置result配置(3)错误处理异常错误包配置,配置包的时候必须要指定包的name属性,这个属性就是应用该包的key,同时还要指定包的,该属性为可选,extends属性必须是另一个包的name属性。指定extends属性说明该包继承了其它包,同时继承其它包中的action、拦截器和拦截器栈等配置。ShowRenyuanAction.action/jsp/error.jsp/js
19、p/renyuanShow.jsp/jsp/error.jsp/jsp/renyuanUpdt.jspShowRenyuanActionShowRenyuanAction.action/jsp/error.jspStruts.xml配置元素说明:(1)PackagesPackages:packages把actions、results、resultstypes、interceptors和interceptor-stacks组装到一个逻辑单元中,从概念上讲,packages就像一个对象,可以被其它子包从写,而且可以拥有自己独立的部分。Name属性是packages的必填元素,它作为一个关键字被后边
20、的包引用;extends元素是可选的,它允许包扩展一个和多个前边定义的包。注意,struts.xml文件是至上而下处理的,所有被扩展的包,需要在扩展包前定义。Abstract元素是可选的,它可以申明一个不包含actions的配置文件。(2)NamespaceNamespace元素把actions细分到逻辑模块,每一个namespace都有自己的前缀(prefix),namespace避免了action之间的名字冲突,当前缀出现在URI中时,这些标签都是名字空间感知的(“namespaceaware”),所以这些namespaceprefix不必嵌入到表单或连接中。Default的namespa
21、ce是一个空字符串“”,如果在指定的配置文件中,没有找到action,缺省的namespace也会被查找。Local/global策略允许应用程序在action“extends”元素层次结构之外,有全局的action配置。缺省的namespace也可以不在package中申明。Namespaceprefix可以注册为java的申明式HYPERLINK/o安全t_blank安全,以确保授权的用户才能访问namespace的资源。Rootnamespace(“/”)也被支持,root就是当直接请求contextpath的时候的namespace。Namespace:可选属性,该属性定义该包的命名空
22、间,指定用户请求的URL目录路径,实际上也就是action的包名字。指定了命名空间后,用户请求访问该包下所有action时,URL应该是命名空间(namespace)+action.Struts2寻找一个action的搜索顺序是:查找指定的命名空间下的action如果找不到,则转入默认命名空间中查找action如果找不到,则报错(3)IncludeInclude元素使得框架能应用“divideandconquer”来配置文件。被include的每个配置文件必须和struts.xml有一样的格式,一个大的项目可以采用这样方式来组织程序模块。Include元素也可以和package交替出现,框架将
23、按照顺序加载配置文件。(4)InterceptorconfigurationInterceptor允许应用程序在Action方法执行前后定义执行代码,Interceptor在应用程序开发中十分重要,对于Interceptor有许多用例,如validation,propertypopulation,security,logging,和profiling。Interceptor被定义为一个Java类,Interceptor也可以组装成Interceptor-stack,他们将按照定义的顺序执行。在struts-default.xml中定义了一些缺省的Interceptor-stack,以便框架能很
24、好地运行。(5)ActionAction是框架的“工作单元”。Action可以指定一个Interceptor-stack、一序列的returntype和一序列的异常处理,但只有name属性是必须的。22配置web.xml文件web应用项目都需要一个web.xml配置文件,该文件负责对整个项目进行配置。针对struts2web.xml配置文件里有两个比较重要的元素分别是和。定义struts2的核心控制器org.apache.struts2.dispatcher.FilterDispatcher,并将定义为名称struts2;配置说明,使用上面定义的名称为struts2的Filter来处理所有的用
25、户URL请求。注意:如果web应用使用Servlet2.3以前的规范,web应用不会自动加载struts2的标签库,必须在web.xml中显示指定加栽。/s/WEN-INF/struts-tags.tld如果在WEB-INF目录下没有发现struts-tags.tld标签库文件,就需要手动进行复制。标签库包含在struts2-core-2.0.11.jar文件中。如果使用Servlet2.4规范,标签库自动加载。23拦截器的配置拦截器是struts2核心内容之一,拦截器的作用是在执行action处理用户请求之前或之后,执行拦截器来进行某些操作,例如判断用户的合法身份,这样在action中就不用
26、处理和判断用户身份的问题,将功能交给拦截器来管理。这就是AOP(面向切面编程)的编程思想。拦截器的定义interceptorname=”chatAuthentication”class=”org.apache.struts2.showcase.chat.ChatAuthenticationInteceptor”/上面定义了一个拦截器chatAuthentication和拦截器栈chatAuthenticationStack。在action中使用上述的拦截器或者拦截器栈,/chat/userAvailable.flt如果配置了拦截器,在执行拦截器在usersAvailable的execute()
27、方法之前,需要执行拦截器chatAuthenticationStack的相关处理。3Spring2.5框架Spring框架由一个容器,一个配置和组织组件的框架,和一组内置的为事务、持久化和Web用户接口提供的服务组成。作为一种轻量级的J2EE框架,Spring提供了一种有效的方式来建立和组织J2EE应用程序。31Spring特性IoC(InversionofControl;控制反转);又称DI(DependencyInjection;依赖注入);是面向对象领域新兴的编程思想;也是Spring的精髓所在。简单地说;IoC就是指程序之间的关系由容器来控制;而不是传统实现中由程序代码直接操控。这也就
28、是所谓“控制反转”的概念所在:控制权由应用代码转到外部容器,控制权的转移,也就是所谓的反转。IoC将控制创建的职责搬进了框架中;并把它从应用代码脱离开来。当使用Spring的IoC容器时只需指出组件需要的对象,在运行时Spring的IoC容器会根据XML配置数据提供给它。SpringIoC,借助于依赖注入设计模式,使得开发者不用理会对象自身的生命周期及其关系,而且能够改善开发者对模式的使用。对于一个对象的管理不是什么困难,难就难在对整个对象群的管理。依赖注入可以让容器管理对象,即“Dontcallme,Iwillcallyou”。这样对象本身的生命周期以及对象之间的关系就不再让开发者费神了。S
29、pringAOP,借助于Spring实现拦截器,开发者能够实现以声名方式使用企业级服务,比如安全性服务、事务服务。AOP合理的补充了OOP,借助于SpringAOP,开发者能够高效的使用J2EE服务。Spring服务抽象,借助于各种J2EEAPI抽象,使得开发者能够一致地使用J2EE技术,而不管具体是使用什么J2EEAPI,借助于Spring服务抽象,使代码大大减少,满足“更少代码,更少BUG”的软件设计原则。SpringIoC+SpringAOP+Spring服务抽象,一起形成Spring,这样一个有机体,使构建轻量级J2EE成为可能。32SpringIoC容器Spring提供两种IoC容器
30、,BeanFactory和ApplicationContext。SpringIoC容器提供IoC功能的实现,负责读取配置、装配Bean、管理Bean的生命周期和维护各个Bean之间的关系,同时为永和获取、管理的Bean提供接口。BeanFactory是SpringIoC容器的基本实现,ApplicationContext继承于BeanFactory,提供比BeanFactory更丰富的功能。321BeanFactory容器BeanFactory是整个SpringIoC容器的核心,它是一个接口,定义IoC容器的基本功能,实现从配置文件中读取配置、装配Bean、管理Bean的生命周期、Bean之间
31、的关系维护等IoC容器的基本功能,这些实现类通过Java的反射机制和工厂模式来实现装配和管理Bean的过程,从而使被管对象无需知道Spring的存在,无需实现任何Spring接口、使用任何Spring提供的API,这就降低了Spring与受管Bean之间的耦合度。BeanFactory是一个接口,被放在org.springframework.beans.factory中。Spring提供了多种实现类,其中XmlBeanFactory是最简单、最常用的实现类之一。322ApplicationContext容器ApplicationContext容器继承BeanFactory容器,除了提供的所有功
32、能之外,还提供比BeanFactory更丰富的功能。在Spring官方的文档种,推荐使用ApplicationContext容器。一个简单的理解SpringIoC和DI的例子:有一个Person类和Axe类,Person类使用Axe类。首先是两个类的接口定义:/定义Person类接口PublicinterfacePerson/Person接口定义一个使用斧子的方法PublicvoiduseAxe();/定义Axe接口PublicinterfaceAxe/Axe接口有一个砍的方法Publicvoidchop();/Chinese实现Person接口PulicclassChineseimpleme
33、ntsPerson/面向Axe接口编程,而不是具体的实现类PrivateAxeaxe;/默认的构造器PublicChinses()/设置注入所需的setter方法PublicvoidsetAxe(Axeaxe)This.axe=axe;/实现Person接口的useAxe方法PublicvoiduseAxe()System.out.println(axe.chop();Axe的第一个实现类PublicclassstoneAxeimplementsAxe/默认的构造器PublicstoneAxe()/实现Axe的接口chop方法Publicvoidchop()Return“石斧砍柴好慢!”;Sp
34、ring配置文件将Person实例和Axe实例组织在一起。主程序部分PublicclassBeanTest/主方法,程序的入口Publicstaticvoidmain(Stringargs)throwsException/因为是独立的应用程序,显示地实例化Spring的上下文ApplicationContextctx=newFileSystemApplicationContext(“bean.xml”);/通过Personbean的id来获取bean的实例,面向接口的编程,/因此,此处强制类型转换为接口类型Personp=(Person)ctx.getBean(“chinese”);/直接执行
35、Person的useAxe()方法p.useAxe();如果改写Axe的实现类,或是提供另一个实现类给Person实例使用。Person接口、Chinese类都无需改变,只需提供另一个Axe的实现,然后对配置文件进行简单的修改即可。Axe的另一个实现:PublicclassSteelAxeimplementsAxe/默认的构造器PublicSteelAxe()/实现Axe的接口chop方法Publicvoidchop()Return“钢斧砍柴好快!”;然后修改Spring的配置文件,在其中增加一行:该行重新定义一个Axe的实现,SteelAxe。然后修改chinesebean的配置,将原来的s
36、toneAxe的地方改为steelAxe。构造注入:构造注入指的是,通过构造函数来完成以来关系的设定,而不是通过setter方法。对前面Chinese类代码的修改:PulicclassChineseimplementsPerson/面向Axe接口编程,而不是具体的实现类PrivateAxeaxe;/默认的构造器PublicChinses(Axeaxt)This.axe=axe;/构造注入所需的带参数的构造器PublicvoidChinese(Axeaxe)This.axe=axe;/实现Person接口的useAxe方法PublicvoiduseAxe()System.out.println(
37、axe.chop();Spring配置文件将Person实例和Axe实例组织在一起。在spring中,我们可以使用多个配置文件,将不同的bean配置放在不同的文件中,这样便于维护与管理。比如数据库相关配置在DataConfig.xml中定义,Action在ActionConfig.xml定义,然后在appicationContext.xml中利用标签引入即可,spring在加载配置文件时会自动的加载这些文件:在配置文件中,可以使用标签来为各个配置文件增加注释,方便阅读和管理。是标签的子标签,另一种注释方式是。标签是标签的子标签,用来定义一个受管的Bean,最简单的Bean必须要指定用class
38、属性来指定该JavaBean的类(必须包含类路径)。同时如果不是内部Bean,则必须要指定其id或name属性之一来标识该bean,这样才能引用到它。除此之外,标签有很多其它属性,为受管的bean注入值使用标签中定义好一个受管的bean后,就可以为该bean的属性注入其依赖的对象,spring中有两个标签为我们提供了这一功能:一个是,通过setter方法注入;另一个是,通过构造方式注入。它们都是的子标签。设值注入:设值注入就是springIoC容器首先通过无参数构造子实例化受管bean,再调用标准的setter方法为其受管的bean成员注入其依赖对象。可以使用标签注入java基本类型的值,也可
39、以使用标签注入对象。猴子guagua2注意:如果要使用设值注入的方式,受管的bean就必须要有一个无参数的构造函数,否则容器就会抛出BeanCreationException异常,提示没有找到默认的构造方法。构造注入:构造注入是通过想bean的构造方法中传入若干个参数的方法,把其依赖的对象注入到受管的bean中,构造的参数都必须是该受管bean所依赖的对象。姗姗Autowire自动装配在应用中,经常使用标签为受管bean注入所依赖的对象。Spring提供了一个自动装配的机制,在应用中结合标签,减少程序员的劳动强度。定义bean时,标签有一个属性即autowire,通过它来指定容器为受管Java
40、Bean自动注入依赖对象。Autowire属性有六个取值即:No:不启用自动装配。默认值Byname:通过属性的名字的方式查找受管Bean依赖的对象并为其注入。byType:通过属性的类型查找受管Bean依赖的对象并为其注入。constructor:与byType一样,也是通过类型查找依赖的对象。区别在于它不是使用setter方法注入,而是使用构造注入。autodetect:在byType和constructor之间自动选择注入方式default:由上级标签的default-autowire属性确定使用赋值标签使用标签为受管的bean属性直接赋值,使用标签只是能够给基本的java数据库类型注入
41、值,比如int、String、float等,而给复杂的javaBean属性注入值,就要使用一下几种标签:(1)标签使用这个标签可以为受管bean注入一个其他的受管bean的实例的引用,当受管bean的要引用其它类的实例时,使用该标签。(2)标签这个标签可以为受管bean注入list类型或者数组类型的值,当要给某个受管bean的list或者数组类型的属性值注入值时,使用该标签,用法:(3)标签这个标签可以为受管bean注入set类型的值,和list类似,用法:(4)标签Map是java中一个重要的接口,有hashmap、Properties等很多实现类。由于它以键、值对的形式存储数据,所以要用标
42、签来为其key和value赋值。用法:spring(5)标签在java中properties继承实现了map接口,因此它也是用键值对的形式存放数据,与map不同的是它的键(key)、值(value)是java.lang.String类型,无法为其赋Object类型的值。用法:李老师85(6)标签这个标签可以为受管bean的属性注入空值。语法:323Spring事务管理Spring中的事务管理是通过AOP思想来实现的,AOP针对的是方法层面上的实现,对于有接口的类,使用java内部提供的Proxy,而没有接口的,使用的是cglib库,动态建立一个子类来实现。在springAOP中体统4种处理切入
43、类型:around、before、after、introduction。理解spring声明式事务管理最重要的概念是:spring的事务管理是通过AOP代理实现的。其中的事务通知由元数据(目前是基于XML或注解)驱动。代理对象与事务元数据结合产生了一个AOP代理,使用一个platformTransactionManager实现配合TransactionInceptor。在方法调用前后实施事务。Spring提供的事务管理,可以分为两种形式即编程式和声明式。编程式比较灵活,但代码量大,存在重复的代码比较多;声明式的比编程式的更灵活方便。Spring提供编程式的事务处理:Spring提供几个关于事务
44、处理的类:TransactionDefinition/事务属性定义TransactionStatus/代表当前的事务、可以提交和回滚PlatformTransactionManager这是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager。Spring声明式事务处理Spring声明式事务处理主要使用的IoC、AOP思想,提供TransactionIterceptor拦截器呵呵常用的代理类TransactionManagerProxyFactoryBean,可以直接对组件进行事务代理。使用TransactionIn
45、terceptor的步骤:定义数据源,事务管理类定义事务拦截器com.test.UserManager.*r=PROPAGATION_REQUIRED为组件说明一个代理类:ProxyFactoryBeancom.test.UserManager使用TransactionProxyBeanpropspropkey=insert*PROPAGATION_REQUIRED/proppropkey=update*PROPAGATION_REQUIRED/proppropkey=*PROPAGATION_REQUIRED,readOnly/prop/propsTransactionProxyFactor
46、yBean只是为组件的事务代理,如果我们要给组件添加一些业务方面的验证等,可以使用TransactionTemplate加拦截器方式,为组件添加多个拦截器,springAOP中提供了三类Advice,即前增强,后增强,抛出异常时的增强,可以灵活使用。Spring声明式事物管理关于声明式事物管理的配置通常采用三种方式:使用TransactionProxyFactoryBean为目标bean生成事物代理的配置,此方法式最传统,配置文件最臃肿、难以阅读的方式采用bean继承的事物代理配置方式,比较简单,但依然是增量式配置使用BeanNameAutoProxycreator,根据beanname自动生
47、成事务代理的方式。建议采用第三种配置方式。324Spring+HibernateHibernate的持久层的访问必须按如下的步骤进行Step1创建Configuration实例Step2创建SessionFactory实例Step3创建Session实例Step4打开事物Step5开始持久化的访问Step6提交事物Step7如果遇到异常,回滚事物Step8关闭session使用HibernateTemplateHibernateTemplate提供持久化层访问模板化,使用HibernateTemplate无需实现特定接口,它值需要提供一个SessFactory的引用,就可以执行持久化操作,Se
48、ssionFactory对象可通过构造参数传入,或通过设值方式传入。在web应用中,通常启动时自动加载ApplicationContext,SessionFactory和DAO对象都处在Spring上下文管理下,因此无需在代码中显示设置,可以采用依赖注入解耦SessionFactory和DAO。Spring+hibernate配置Spring+Hibernate的配置,就是对ApplicationContext.Xml文件进行配置。实质就是Bean的配置组件列表和注入过程,要使用hibernateTemplate进行开发,需要在Bean配置文件中添加一系列的组件,这些组件相互注入。需要如下一些
49、组件:dataSource:为sessionFactory提供数据源sessionFactory:Hibernate管理工厂,为具体DAO的事务管理策略对象transactionManager提供sessionFactorytransactionManager:为具体DAO的事务管理策略对象xxxDAOProxy提供事务管理器对象xxxDAO:为xxxDAO提供POJO类;利用被注入的数据源,定义一系列的业务操作函数,使用hibernateTemplate来操作POJO类,实现对数据库的操作xxxDAOProxy:xxxDAO的事务管理策略对象,该对象规定了xxxDAO的管理策略,因此它需要注
50、入xxxDAO作为被管理的对象。进行事务管理也需要提供事务管理器,因此需要注入transactionManager作为事务管理器。Action类:该类是响应处理类,负责调用xxxDAO函数即可以实现对数据库的访问,而对于xxxDAO的访问都将在xxxDAOProxy监督下进行。该过程的执行顺序:创建数据源dataSource创建sessionFactory,并注入数据源dataSource创建事务管理对象transactionManager,并注入sessionFactory;创建xxxDAO,并注入sessionFactory;创建事务管理策略对象xxxDAOProxy,并注入所管理对象xx
51、xDAO和所用事务管理器transactionManager创建Action,并注入xxxDAO。详细的配置代码:com.mysql.jdbc.driverjdbc:mysql:/wonder:3306/j2eerootpasslee/Person.xmlorg.hibernate.dialect.MySQLDialectupdatePROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnlyPROPAGATION_REQUIREDtransactionInterceporTransactionInterceptor是一个事务拦截器bean,需要传入一个T
52、ransactionManager的引用。配置中使用Spring依赖注入该属性。事务拦截器的事务属性通过transactionAttributes来指定,该属性有props子元素,配置文件中定义如下3个事务的传播原则。所有以insert开始的方法,采用PROPAGATION_REQUIRED的事务传播规则,程序抛出MyException异常及其子异常时,自动回滚事务。所有以find开头的方法,采用PROPAGATION_REQUIRED事务传播规则,并且只读。其它方法,则采用PROPAGATION_REQUIRED的事务传播规则。BeanBNameAutoProxyCteator是根据bean
53、名自动生成代理的代理创建器,该bean通常需要接受两个参数,第一个是beanName属性,该属性用来设置哪些bean需要自动生成代理。另一个属性是interceptorNames,该属性则指定事务拦截器。自动创建代理时,系统会根据这些事务拦截器的属性来生成对应的事务代理。4Hibernate框架41Hibernate体系结构Hibernate是通过配置文件和映射文件来为应用层和数据库层提供持久化服务的。类路径问题:基于Java平台开发的web应用来说,其类路径有两个分别是全局类路径(globalclasspath)和上下文类路径(Contextclasspath)。基于Tomcat的web应用
54、,全局库文件搜索路径是(Tomcat/common/lib)和本web应用程序上下文的类装载器搜索路径(对于jar文件来说是webapps/quickstart/WEB-INF/lib,对于class文件来说是webapps/qickstart/WEB-INF/classes)文件的拷贝数据库需要的JDBC驱动程序拷贝到全局类路径,这是tomcat附带的DBCP连接池软件需要的,Hibernate使用JDBC来连接数据库。其它的一些文件,不要拷贝到全局类路径里,一般放置在上下文类路劲里。创建持久化类Hibernate最好的使用方法是使用普通的java对象(PlainOldJavaObjects
55、)POJO。一个POJO就像JavaBean,属性是通过setter和getter方法访问。Hibernate对属性使用的类型不加限制,所有的JavaJDK类型和原始类型(stringchardate等)都可以被映射,也包括Java集合类型框架(JavaCollectionsFramework)中的类。可以把它们映射为值、值集合、或者与其它实体关联。Id是一个特殊的属性,代表这个类的数据库标识符(主键)。每个持久化类都应该需要有一个标识属性,这个属性用来区分持久化对象。HibernatesessionHibernate的session是持久化管理接口,用来从数据库中存取数据。首先是从sessi
56、onFactory中获取一个session。sessionFactorysession=newConfiguration().configure().buildSessionFactory();sessionFactory负责一个数据库,对应一个XML配置文件的(hibertenate.cfg.xml)。sessionFactory配置Congigurationcfg=newConfiguration();Sessionfactorysession=cfg.buildSessonFactory();事务策略配置使用Hibernate的TransactionAPI,必须通过hibernate.t
57、ransaction.factory_class属性指定一个Transaction实例工厂类。内置两个标准选择是net.sf.hibernate.transaction.JDBCTransactionFactory使用数据库(JDBC)事务(默认)Net.sf.hibernate.transaction.JTATransactionFactory使用JTA42ORM(ObjectRelationMapping)421多对一(many-to-one)通过多对一元素(many-to-one),可以定义一种常见的与另一个持久化类的关联,这种关联模型是多对一关联。(实际上就是对象引用)422one-t
58、o-one持久化对象之间一对一的关联关系是通过one-to-one元素定义的:有两种不同形式的一对一关联:主键关联惟一外键关联主键关联不需要额外的表字段:两行是通过这种一对一关系相关联,那么这两行就共享同样的主关键字值。因此,如果希望两个对象通过一对一关联,必须确认它们被赋以同样的标识值。比如说对下面的Employee和person进行主键一对一关联:因此,必须确保Person和Employee中相关的字段是相等的。使用一个特别的称为foreign的hibernate标识符生成器策略:employee.另一种方式是外键和一个惟一关键字对应,上面的例子,如果使用外键方式,应表达成:如果在pers
59、on的映射加入下面几句,这种就是双向的:43HQL语句学习一个简单的代码演示from查询:PublicclassHqlQueryPublicstaticvoidmain(Stringargs)throwsException/实例化HqlQuery对象HqlQuerymgr=newHqlQuery();/调用HQL查询方法mgr.findPersons();mgr.findPersonsbByHappenDate();PrivatevoidfindPersons()/通过工具类HibernianUtil的currentSession方法开始sessionSessionsess=Hibernate
60、Util.currentSession();/开始事物Transactiontx=sess.beginTransaction();/使用Session的createQuery方法创建查询对象Queryq=sess.createQuery(“fromPersonp”);/执行Query对象的list方法,返回查询的全部实例q.list();/遍历结果集,返回全部的查询记录for(Iteratorpit=p.iterator();pit.hasNext();)Personp=(Person)pit.next();System.out.println(p.getName();/提交事物Tmit();
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第12课《词四首:破阵子为陈同甫赋壮词以寄之》教学设计 2023-2024学年统编版语文九年级下册
- 9正确认识广告 教学设计-2024-2025学年道德与法治四年级上册统编版
- 小学五年级机器人编程课 6.《投石机》教学设计
- 不含括号的三步计算式题(教学设计)-2024-2025学年四年级上册数学苏教版
- 全国闽教版初中信息技术八年级上册第二单元活动八《体验顺序、分支结构程序设计》教学设计
- Module 1 Unit 1 Do you use chopsticks in the UK (教学设计)-2024-2025学年外研版(一起)英语三年级上册
- 全国山西经济版小学信息技术第一册第三单元活动2《小蘑菇》教学设计
- Unit7 Days of the Week(教学设计)-2023-2024学年北师大版(三起)英语五年级下册
- 河南水利管理业市场前景及投资研究报告
- 稀土节能灯粉项目可行性研究报告
- 10kV配网工程变配电(台架变、箱变、电缆分接箱)的安装设计施工精细化标准
- Opera、绿云、西软、中软酒店管理系统对比分析
- Q∕GDW 12118.3-2021 人工智能平台架构及技术要求 第3部分:样本库格式
- 广东省义务教育阶段学生转学转出申请表(样本)
- 毕业论文牛仔布染色工艺和质量控制
- 机耕路工程施工方案与技术措施
- 如何成为一个优秀的生产经理
- 国经贸企[1996]895号(城镇集体所有制企业、单位清产核资产权界定暂行办法)
- 飞机总体课程设计
- 现场组织机构框图及职责
- 世界梁氏家族世系表
评论
0/150
提交评论