??xml version="1.0" encoding="utf-8" standalone="yes"?>国产亚洲精品资在线,亚洲无线观看国产精品,亚洲中文字幕第一页在线http://www.tkk7.com/zzs/category/37922.htmlzh-cnMon, 02 Mar 2009 14:11:03 GMTMon, 02 Mar 2009 14:11:03 GMT60深入探讨 Spring ?Struts 的集成方?/title><link>http://www.tkk7.com/zzs/articles/257388.html</link><dc:creator>ID刀</dc:creator><author>ID刀</author><pubDate>Mon, 02 Mar 2009 10:02:00 GMT</pubDate><guid>http://www.tkk7.com/zzs/articles/257388.html</guid><wfw:comment>http://www.tkk7.com/zzs/comments/257388.html</wfw:comment><comments>http://www.tkk7.com/zzs/articles/257388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zzs/comments/commentRss/257388.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zzs/services/trackbacks/257388.html</trackback:ping><description><![CDATA[<span id="brzhhj5" class="a14c" id="zoom"> <p style="text-indent: 2em"> <p><font face="Times New Roman" size="3">Spring是一个轻量(大小和系l开支的角度)的IoC和AOP容器.它力囄化J2EE开发即J2EE without EJB.而且作ؓ(f)帮助企业U开发的核心支柱,Spring为模型层(OR持久?Hibernate、JDO、iBatis{?服务?EJB、JNDI、WebService)以及(qing)表现?Struts、JSF、Velocity)都提供了良好的支持和集成Ҏ(gu). 讉KSpring官方?</font></p> <p><font face="Times New Roman" size="3">Jakarta-Struts是Apache软gl织提供的一个开源项?它ؓ(f)Java Web应用提供了基于Model-View-Controller的MVC框架,其适用于开发大型可扩展的Web应用.管ZJava的MVC框架层出不穷,事实上Spring的MVC模型也提供了驱动应用pȝWeb层的能力,但Jakarta-Struts仍然是所有这些框架中的佼D? </font></p> <p><font face="Times New Roman" size="3">下面,如何整合这两个J2EE领域的经兔R目给Z套详的集成Ҏ(gu). </font></p> <font face="Times New Roman" size="3"> <p><br /> 1.首先我们来看一个Spring-Struts整合应用下的控制器ActioncL代码. </p> <p><br /> public class CourceAction extends Action {<br /> private CourceService courceService;<br /> public ActionForward execute(<br /> ActionMapping mapping,<br /> ActionForm form,<br /> HttpServletRequest request,<br /> HttpServletResponse response) throws Exception {<br /> Set allCources = courceService.getAllCources();<br /> //..........the other statements<br /> request.setAttribute("cources", allCources);<br /> return mapping.findForward("jspView");<br /> } }</p> <p><br /> 分析:CourceServiceZ个业务实现的接口,此接口声明了一pd的业务处理方?该方法的实现配置为Spring上下问的一个Bean.由此看来,我们大家都可能会(x)产生一个疑?Struts action如何取得一个包含在Spring上下文中的Bean?Z回答q个问题,Spring提供了两U与Struts集成的方? </p> <p>(1).从一个知晓Spring上下文的基类z我们自己的Struts Actionc?然后,在派生类中就可以使用super.XX()Ҏ(gu)来获得一个对Spring受控Bean的引? </p> <p>(2).请求委托给作ؓ(f)Spring Bean理的Struts Action来处? </p> <p>2.注册Spring插g:Z使Struts Action能够讉K由Spring理的Bean,我们必要注册一个知道Spring应用上下文的Struts插g.可以在struts-config.xml中通过如下的方式来完成注册. </p> <p><br /> < plug-in classname="org.springframework.web.struts.ContextLoadPlugin"><br /> < set-property value="WEB-INF/Yhcip.xml,......" property="contextConfigLocation"><br /> < /PLUG-IN></p> <p><br /> ContextLoadPlugin()负责装蝲一个Spring应用上下?(具体的说:是一个WebApplicationContext).value属性gؓ(f)要加载的配置Spring受控Bean的xml文g的URI. </p> <p>3.完成W一U集成方?实现一个知晓Spring的Action基类. </p> <p>q种集成Ҏ(gu)是从一个公q能够讉KSpring应用上下文的基类中派生所有的Struts Action,但值得庆幸的是:我们不用自己ȝ写这个知晓Spring应用上下文的基类,因ؓ(f)Spring已经提供了org.springframework.web.struts.ActionSupport:一个org.apache.struts.action.Action的抽象实?它重载了setServlet()Ҏ(gu)以从ContextLoaderPlugin中获取WebapplicationContext.因此,M时候我们只需要调用super.getBean()Ҏ(gu)卛_获得一Spring上下文中的一个Bean的引? </p> <p>我们再来看一DA(ch)ction源代? </p> <p><br /> public class CourceAction extends ActionSupport {<br /> public ActionForward execute(<br /> ActionMapping mapping,<br /> ActionForm form,<br /> HttpServletRequest request,<br /> HttpServletResponse response) throws Exception {<br /> //取得Spring上下?br /> ApplicationContext context = super.getWebApplicationContext();<br /> //取得CourceService Bean <br /> CourseService courseService = (CourseService) context.getBean("courseService");<br /> Set allCources = courceService.getAllCources(); request.setAttribute("cources", allCources);<br /> //..........the other statements.<br /> return mapping.findForward("jspView");<br /> }}</p> <p><br /> 分析:q个ActioncȝActionSupportz,当CourceAction需要一个Spring受控Bean?它首先调用基cȝgetWebApplicationContext()Ҏ(gu)以取得一个Spring应用上下文的引用;接着它调用getBean()Ҏ(gu)来获取由Spring理的courceService Bean的一个引? </p> <p>结 </p> <p>x,我们已经用第一U方案圆满的完成了Spring与Struts的集成工?q种集成方式的好处在于直观简z容易上?除了需要从ActionSupport中派?以及(qing)需要从应用上下文中获取Bean之外,其他都与在非Spring的Struts中编写和配置Action的方法相?但这U集成方案也有不利的一?最为显著的?我们的Actioncd直接使用Spring提供的特定类,q样?x)我们的Struts Action(x制层)的代码与Spring紧密耦合在一?q是我们不情愿看到的.另外,ActioncM负责查找由Spring理的Bean,q违背了反向控制(IoC)的原? </p> <p>4.实现W二U集成方?代理和委托Action. </p> <p>q种集成Ҏ(gu)要求我们~写一个Struts Action,但它只不q是一个包含在Spring应用上下文中的真正Struts Action的一个代?该代理Action从Struts插gContextLoaderPlugIn中获取应用上下文,从中查找真正的Struts Action,然后处理委托给真正的Struts Action.q个Ҏ(gu)的幽雅之处在?只有代理action才会(x)包含Spring特定的处?真正的Action可以作ؓ(f)org.apache.struts.Action的子cL~写. </p> <p>下面我们来看一D在之中集成方式下的Struts Action源代? </p> <p><br /> public class CourceAction extends Action {<br /> private CourceService courceService;<br /> public ActionForward execute(<br /> ActionMapping mapping,<br /> ActionForm form,<br /> HttpServletRequest request,<br /> HttpServletResponse response) throws Exception {<br /> Set allCources = courceService.getAllCources();<br /> request.setAttribute("cources", allCources);<br /> //..........the other statements.<br /> return mapping.findForward("jspView");<br /> }<br /> /* 注入CourceService */<br /> public void setCourceService(CourceService courceService) {<br /> this.courceService = courceService;<br /> }}</p> <p><br /> 分析:大家可以看到,在这U方式之?我们的Struts ActioncdSpring是低耦合?它仅仅依赖了Spring提供的反向控?IoC)机制把CourceService注入C我们的Action?到此,大家肯定?x)有一个疑?那就是Spring到底是如何提供IoC反向控制的呢?回答q个问题,我们需要完成两个步骤的配置: </p> <p>(1).在struts-config.xml中注册Struts Action.但要注意的是我们在这里注册的是代理Action.q运的是,我们不必亲自~写q个c?因ؓ(f)Spring已经通过org.springframework.web.struts.DelegatingActionProxy提供了这个代理的Action.具体的配|方法如? </p> <p><br /> < action type="org.springframework.web.struts.DelegatingActionProxy" path="/listCourses"></p> <p><br /> (2)真正的Struts Action作ؓ(f)一个Spring Beanq在Spring上下文配|文件中作ؓ(f)一个Bean注册?q将Action所要引用的courceService注入l它. </p> <p><br /> < bean class="com.eRedCIP.web.CourceAction" name="/listCourses"><br /> < property name=""><br /> < ref bean="courseService"><br /> < /property><br /> < /bean></p> <p><br /> 注意:name属性的值是非常重要?它必dstruts-config.xml中的path属性完全一?q是因ؓ(f)DelegatingActionProxy?x)用path属性值在Spring上下文中查找真正的Action.使用DelegatingActionProxy的好处在于我们可以不使用MSpring特定的类来编写Struts Action.同时,Struts动作能够利用IoC取得和他合作的对?唯一不之处是不太直观,配置相对复杂.Z使action委托昑־更ؓ(f)直观一?我们可对q种集成Ҏ(gu)做进一步的改进:使用h委托. </p> <p>5.使用h委托. </p> <p>Z使action委托看上L为直观一?Spring提供了DelegatingRequestProcessor,另一U专门用于Spring的请求处理器.需要在struts-config.xml中做如下配置: </p> <p><br /> < controller processorclass="org.springframework.web.struts.DelegatingRequestProcessor"></p> <p><br /> q样,DelegatingRequestProcessor告诉Struts自动动作请求委托给Spring上下文中的Action来处?q得我们可以在struts-config.xml中用struts action的真正类型来声明它们.例如: </p> <p><br /> < action type="com.eRedCIP.web.CourceAction" path="/listCourses"></p> <p><br /> 当接受到一个针?listCourses的请求时,DelegatingRequestProcessor?x)自动从Spring上下文配|文件中查找一个名?listCourses的Bean(实ؓ(f)一个Struts Action)c? </p> <p><br /> < action type="com.eRedCIP.web.CourceAction" path="/listCourses"><br /> (?<br /> </font></p> </span> <img src ="http://www.tkk7.com/zzs/aggbug/257388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zzs/" target="_blank">ID刀</a> 2009-03-02 18:02 <a href="http://www.tkk7.com/zzs/articles/257388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING框架——由来和发展Q{Q?/title><link>http://www.tkk7.com/zzs/articles/257366.html</link><dc:creator>ID刀</dc:creator><author>ID刀</author><pubDate>Mon, 02 Mar 2009 09:11:00 GMT</pubDate><guid>http://www.tkk7.com/zzs/articles/257366.html</guid><wfw:comment>http://www.tkk7.com/zzs/comments/257366.html</wfw:comment><comments>http://www.tkk7.com/zzs/articles/257366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/zzs/comments/commentRss/257366.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/zzs/services/trackbacks/257366.html</trackback:ping><description><![CDATA[SPRING框架——由来和发展 <p>  <strong>Spring</strong>?strong>java</strong>q_上的一?strong>开源应用框?/strong>。它的第一个版本是?strong>Rod Johnson</strong>写出来的。Rod在他的Expert One-On-One Java EE Design and Development(Java企业应用设计与开发的专家一对一)一书中首次发布了这个框架。该框架也可以移植到.NET的环境下?/p> <p>  Spring的框枉ơ在2003q?月的Apache 2.0的用许可中发布。第一个具有里E碑意义的版本是2004q?月发布的1.0?004q?月和2005q?月先后又有重要的版本面世?/p> <p>  Spring框架本nq没有强制实行Q何特别的~程模式。在JavaC֌里,Spring作ؓ(f)EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看QSpringl予了JavaE序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于用的Ҏ(gu)?/p> <p>  Spring框架的核心功能在MJava应用中都是适用的。在ZJava企业q_上的web应用中,大量的拓展和改进得以形成。ؓ(f)此,Spring获得了广泛的Ƣ迎Qƈ被许多公司认可ؓ(f)h战略意义的重要框架?/p> <p>  1. Spring框架的历?/p> <p>  Spring框架最开始的部分是由Rod Johnson?000qؓ(f)伦敦的金融界提供独立咨询业务时写出来的。在《Java企业应用设计与开发的专家一对一》一书中QRodq一步拓展了他的代码Q以阐述“如何让应用程序能以超出当时大众所惯于接受的易用性和E_性与J2EEq_上的不同lg合作”的观炏V?/p> <p>  ?001q_(d)web应用的主编E模式ؓ(f)Java Servlet API和EJB。两者都是由太阳微系l公怸其他一些开发商和利益团体提出的Qƈ在Java业界里获得了q泛的共识。那些非Web的应用,比如用户端的或批处理的应用,也可以基于能够提供所需功能的开源或商用工具和项目?/p> <p>  Z最优方法ƈ适用于各U应用类型的Spring框架的徏立要归功于Rod Johnson。这些想法也在他的书中得以阐q。书发表后,Z读者的要求Q源代码在开源用协议下得以提供?/p> <p>  一批自愿拓展Spring框架的程序开发员l成了团队,2003q?月在Sourceforge上构Z一个项目。在Spring框架上工作了一q之后,q个团队?004q?月发布了W一个版?1.0)。这个版本之后,Spring框架在JavaC֌里变得异常流行,部分的要归结于它好于一般水准的文档功能和参考文献,特别是对于一个开源项目而言其如此?/p> <p>  但是QSpring框架?004q也备受批评Q有时它也成为热烈争论的主题。Spring的第一个版本发布时Q许多程序员和领先的设计人员把它看作是远Ml编E模式的一?特别是对于EJB而言其如此。Spring框架的一个重要设计目标就是更Ҏ(gu)C已有的J2EE标准和商用工h合。在很大E度上,q个目标使得通过受争议的官方委员?x)控制的规范文档来定义功能变得可有可无?/p> <p>  Spring框架使之前ƈ不受Ƣ迎的技术在短时间内q速走U,最有名的例子就是反向控?IOC)?004q_(d)Spring框架的采用率非常之高;通过推出自n的AOP(面向方向的编E?QSpring使AOP整体而言在JavaC֌里广受欢q?/p> <p>  2005q_(d)Spring因具有里E碑意义的新的版本的推出Q更多功能的dQ从而得C?004q更高的采用率?004q底创徏的Spring论坛也对框架的推q而推波助澜。论坛对q大用户而言已经成ؓ(f)最重要的信息和帮助的源泉?/p> <p>  2005q_(d)Spring框架的开发h员成立了自己的公司,来提供对Spring的商业支持,其中最显著的就是与BEA的合作?005q?2 月,W一个Spring?x)议在迈阿密举行Q?天的评吸引?00名开发h员?006q?月在安特卫普召开的会(x)议有400多名开发h员?/p> <p>  2. Spring框架的主要功?/p> <p>  • ZJava Beans的配|管理,采用IOC的原理,特别是对依赖注射技术的使用。这些都用来减少各组仉对实施细则的怺依赖性?/p> <p>  • 一个核心的Q全局适用的bean工厂</p> <p>  • 一个一般抽象化的层面来理数据库间的数据处?/p> <p>  • 建立在框架内的,对Java数据处理API和单独的JDBC数据源的一般性策略。因此,在数据处理支持上对Java企业版本环境的依赖性得以消?/p> <p>  • 和一些可持箋性的框架Q如HibernateQJDOQiBATIS和db4oQ的整合</p> <p>  • web应用中的MVC框架Q基于核心的Spring功能Q支持多U生视囄技术,包括JSPQFreeMarkerQVelocityQTilesQiTextQ和POI</p> <p>  • 大量的AOP框架以提供诸如数据处理管理的服务。同IOC的功能一P目的是提高系l的模块化程?/p> Spring 框架的七个模? <p>  Spring 框架是一个分层架构,?7 个定义良好的模块l成。Spring 模块构徏在核心容器之上,核心容器定义了创建、配|和理 bean 的方式,如图 1 所C?/p> <p>  </p> <p align="center"><img height="288" alt="" src="http://www.bccn.net/Article/UploadFDL05/200805/20080514153733721.jpg" width="555" /></p> <p>  l成 Spring 框架的每个模?或组?都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下Q?/p> <p>  核心容器Q核心容器提?Spring 框架的基本功能。核心容器的主要lg?BeanFactoryQ它是工厂模式的实现。BeanFactory 使用控制反{ (IOC) 模式应用程序的配置和依赖性规范与实际的应用程序代码分开?/p> <p>  Spring 上下文:(x)Spring 上下文是一个配|文Ӟ?Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电(sh)子邮件、国际化、校验和调度功能?/p> <p>  Spring AOPQ通过配置理Ҏ(gu),Spring AOP 模块直接面向方面的~程功能集成C Spring 框架中。所以,可以很容易地?Spring 框架理的Q何对象支?AOP。Spring AOP 模块为基?Spring 的应用程序中的对象提供了事务理服务。通过使用 Spring AOPQ不用依?EJB lgQ就可以声明性事务管理集成到应用E序中?/p> <p>  Spring DAOQJDBC DAO 抽象层提供了有意义的异常层次l构Q可用该l构来管理异常处理和不同数据库供应商抛出的错误消息。异常层ơ结构简化了错误处理Qƈ且极大地降低了需要编写的异常代码数量(例如打开和关闭连?。Spring DAO 的面?JDBC 的异帔R从通用?DAO 异常层次l构?/p> <p>  Spring ORMQSpring 框架插入了若q个 ORM 框架Q从而提供了 ORM 的对象关pdP其中包括 JDO、Hibernate ?iBatis SQL Map。所有这些都遵从 Spring 的通用事务?DAO 异常层次l构?/p> <p>  Spring Web 模块QWeb 上下文模块徏立在应用E序上下文模块之上,为基?Web 的应用程序提供了上下文。所以,Spring 框架支持?Jakarta Struts 的集成。Web 模块q简化了处理多部分请求以?qing)将h参数l定到域对象的工作?/p> <p>  Spring MVC 框架QMVC 框架是一个全功能的构?Web 应用E序?MVC 实现。通过{略接口QMVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText ?POI?/p> <p>  Spring 框架的功能可以用在Q?J2EE 服务器中Q大多数功能也适用于不受管理的环境。Spring 的核心要Ҏ(gu)Q支持不l定到特?J2EE 服务的可重用业务和数据访问对象。毫无疑问,q样的对象可以在不同 J2EE 环境 (Web ?EJB)、独立应用程序、测试环境之间重用?/p>  Spring框架的主要功? <p>  l成 Spring 框架的每个模?或组?都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下Q?/p> <p>  核心容器Q核心容器提?Spring 框架的基本功能。核心容器的主要lg?BeanFactoryQ它是工厂模式的实现。BeanFactory 使用控制反{ (IOC) 模式应用程序的配置和依赖性规范与实际的应用程序代码分开?/p> <p>  Spring 上下文:(x)Spring 上下文是一个配|文Ӟ?Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电(sh)子邮件、国际化、校验和调度功能?/p> <p>  Spring AOPQ通过配置理Ҏ(gu),Spring AOP 模块直接面向方面的~程功能集成C Spring 框架中。所以,可以很容易地?Spring 框架理的Q何对象支?AOP。Spring AOP 模块为基?Spring 的应用程序中的对象提供了事务理服务。通过使用 Spring AOPQ不用依?EJB lgQ就可以声明性事务管理集成到应用E序中?/p> <p>  Spring DAOQJDBC DAO 抽象层提供了有意义的异常层次l构Q可用该l构来管理异常处理和不同数据库供应商抛出的错误消息。异常层ơ结构简化了错误处理Qƈ且极大地降低了需要编写的异常代码数量(例如打开和关闭连?。Spring DAO 的面?JDBC 的异帔R从通用?DAO 异常层次l构?/p> <p>  Spring ORMQSpring 框架插入了若q个 ORM 框架Q从而提供了 ORM 的对象关pdP其中包括 JDO、Hibernate ?iBatis SQL Map。所有这些都遵从 Spring 的通用事务?DAO 异常层次l构?/p> <p>  Spring Web 模块QWeb 上下文模块徏立在应用E序上下文模块之上,为基?Web 的应用程序提供了上下文。所以,Spring 框架支持?Jakarta Struts 的集成。Web 模块q简化了处理多部分请求以?qing)将h参数l定到域对象的工作?/p> <p>  Spring MVC 框架QMVC 框架是一个全功能的构?Web 应用E序?MVC 实现。通过{略接口QMVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText ?POI?/p> <p>  Spring 框架的功能可以用在Q?J2EE 服务器中Q大多数功能也适用于不受管理的环境。Spring 的核心要Ҏ(gu)Q支持不l定到特?J2EE 服务的可重用业务和数据访问对象。毫无疑问,q样的对象可以在不同 J2EE 环境 (Web ?EJB)、独立应用程序、测试环境之间重用?/p> Spring事务理 <p>  在学?fn)spring事务理?我忍不住要问,springZ么进行事务管?spring怎么q行的事务管?</p> <p>  首先,Z么要q行事务,接下来说说spring是怎样q行事务理?</p> <p>  ?Spring事务{略</p> <p>  Spring事务{略,也就是spring事务理的实现方?它有一个统一的抽象是由实C面这个接口完成的.</p> <p>  org.springframework.transaction.PlatformTransactionManager</p> <p>  此接口的内容如下:</p> <p>  Public interfacePlatformTransactionManager()...{</p> <p>  TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;</p> <p>  Void commit(TransactionStatus status) throws TransactionException;</p> <p>  Void rollback(TransactionStatus status) throws TransactionException;</p> <p>  }</p> <p>  不管是声明式的还是编E式的事务管理都需要此抽象来完?</p> <p>  解释一下这个接?q样可以更好的理解spring的事务控制的原理.</p> <p>  getTransaction()Ҏ(gu)cd为TransactionDefinition的参数返回一个TransactionStatus对象.q回的TransactionStatus对象可能代表一个新的或已经存在的事?如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下?一个TransactionStatus也是和执行的U程兌?</p> <p>  同时,在框架中q存在TransactionDefinition接口,即上边的参数cd.此接口指定了事务隔离E度、事务传播、事务超时、只ȝ态?/p> <p>  另外Q还有TransactionStatus接口。这个接口ؓ(f)处理事务提供单的控制事务执行和查询事务状态的Ҏ(gu)?/p> <p>  ?两种事务理方式Q编E式、声明式?/p> <p>  Spring提供两种方式的编E式事务理Q分别是Q用TransactionTemplate和直接用PlatformTransactionManager?/p> <p>  ? TransactionTempale采用和其他Spring模板Q如JdbcTempalte和HibernateTemplate一L(fng)Ҏ(gu)。它使用回调Ҏ(gu)Q把应用E序从处理取得和释放资源中解脱出来。如同其他模板,TransactionTemplate是线E安全的?/p> <p>  代码片段Q?/p> <p>  Object result =tt.execute(newTransactionCallback()...{</p> <p>  publicObject doTransaction(TransactionStatus status)...{</p> <p>  updateOperation();</p> <p>  returnresultOfUpdateOperation();</p> <p>  }</p> <p>  });</p> <p>  使用TransactionCallback()可以q回一个倹{?/p> <p>  如果使用TransactionCallbackWithoutResult则没有返回倹{?/p> <p>  ? 也可以用PlatformTransactionManager直接理事务。简单地通过一个bean引用l你的bean传递一个你使用?PlatformTransaction对象。然后,使用TransactionDefinition和TransactionStatus对象可以发赗回滚、提交事务?/p> <p>  如下片段Q?/p> <p>  DefaultTransactionDefinition def=newDefaultTransactionDefinition(); //new 一个事?/p> <p>  def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); //初始化事?参数定义事务的传播类?</p> <p>  TransactionStatus status =transactionManager.getTransaction(def); //获得事务状?/p> <p>  try...{</p> <p>  ……………..</p> <p>  transactionManager.commit(status); //提交事务;</p> <p>  }catch(…..)...{</p> <p>  transactionManager.rollback(status); //回滚事务;</p> <p>  }</p> <p>  Spring也提供声明式事务理。这是通过AOP实现的?/p> <p>  大多数Spring用户选择声明式事务管理,q是最媄响应用代码的选择Q因而这是和非R入性的轻量U容器的观念是一致的?/p> <p>  ?通常通过TransactionProxyFactoryBean讄Spring事务代理。需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Javabean。当我们定义TransactionProxyFactoryBeanӞ必须提供一个相关的 PlatformTransactionManager的引用和事务属性。事务属性含有事务定义。例?</p> <p>  PROPAGATION_REQUIRED,-MyCheckedException</p> <p>  PROPAGATION_REQUIRED</p> <p>  PROPAGATION_REQUIRED,readOnly</p> <p>  事务代理?x)实现目标对象的接?q里是属性名是target的引用。id是transactionServiceControl?●?CGLIB也可以实现具体类的代理。只要设|proxyTargetClass属性ؓ(f)true卛_。如果目标对象没有实CQ何接口,q将自动讄该属性ؓ(f) true。通常Q我们希望面向接口编E? ●用proxyInterfaces属性来限定事务代理来代理指定接口也是可以?●也可以通过从org.springframework.aop.framework.ProxyConfigl承或所有AOP代理工厂׃n的属性来定制 TransactionProxyFactoryBean行ؓ(f)?/p> <p>  然后Q说说属性名是transactionAttributes意义Q?/p> <p>  q里的transactionAttributes属性是定义?org.springframework.transaction.interceptor.NameMathTransactionAttributeSource 中的属性格式设|。这个包括通配W的Ҏ(gu)名称映射是很直观的,?#8221;insert*”。注意insert*的映的值包括回滚规则?#8221;- MyCheckException”指定如果Ҏ(gu)抛出MyCheckException或它的子c,事务?x)自动回滚。可以用逗号分隔多个回滚规则?#8220;-” 前缀强制回滚Q?#8220;+”前缀指定提交(q允许即使抛出unchecked异常时也可以提交事务)?#8220;PROPAGATION_REQUIRED”指定事务传播范围?/p> <p>  TransactionProxyFactoryBean允许你通过“preInterceptors”?“postInterceptors”属性设|前或后的拦截操作。可以设|Q意数量的前和后通过Q它们的cd可以是Advistor(切入?QMethodInterceptor或被当前Spring配置支持的通知cd。例如:(x)ThrowAdviceQAfterReturningAdvice或BeforeAdvice。这些通知必须支持实例׃n模式。如果你需要高U?AOPҎ(gu)操作事务,通过org.springframework.aop.framework.ProxyFactoryBeanQ而不?TransactionProxyFactory实用代理创徏者?/p> <p>  ?另一U声明方式:(x)BeanNameAutoProxyCreator</p> <p>  使用TransactionProxyFactoryBean当事务代理包装对象,你可以完全控制代理。如果需要用一致方式包装大量bean。用一个BeanFactoryPostProcessor的一个实玎ͼBeanNameAutoProxyCreatorQ可以提供另外一U方法?Spring中,一旦ApplicationContextd它的初始化信息,它将初始化所有实现BeanPostProcessor接口?beanQƈ且让它们后处理ApplicationContext中所有其他的bean。所以用这U机Ӟ正确配置?BeanNameAutoProxyCreator可以用来后处理所有ApplicationContext中所有其他的bean),q且把它们用事务代理包装h。真正生成的事务代理和用TransactionProxyFactoryBean生成的基本一致?/p> <p>  最后,ȝ一下Spring的优点:(x)</p> <p>  Spring是javaq_上的一个开源应用框架?Spring框架本nq没有强制实行Q何特别的~程模式。在JavaC֌里,Spring作ؓ(f)EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看QSpringl予了JavaE序员许多的自由度,但同时对业界常见的问题也提供了良好的文档和易于用的Ҏ(gu)?Spring框架的核心功能在MJava应用中都是适用的。在ZJava企业q_上的web应用中,大量的拓展和改进得以形成。ؓ(f)此,Spring获得了广泛的Ƣ迎Qƈ被许多公司认可ؓ(f)h战略意义的重要框架?/p> <img src ="http://www.tkk7.com/zzs/aggbug/257366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/zzs/" target="_blank">ID刀</a> 2009-03-02 17:11 <a href="http://www.tkk7.com/zzs/articles/257366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2+Hibernate+Spring程http://www.tkk7.com/zzs/articles/257079.htmlID刀ID刀Fri, 27 Feb 2009 10:03:00 GMThttp://www.tkk7.com/zzs/articles/257079.htmlhttp://www.tkk7.com/zzs/comments/257079.htmlhttp://www.tkk7.com/zzs/articles/257079.html#Feedback0http://www.tkk7.com/zzs/comments/commentRss/257079.htmlhttp://www.tkk7.com/zzs/services/trackbacks/257079.html1) 准备好如下jar?
Oracle数据库的jar:
Ojdbc14.jar

struts2的jar:
commons-pool.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xwork-2.0.4.jar

struts2整合spring的jar:
struts2-spring-plugin-2.0.9.jar

Hibernate整合需要的jar:
commons-logging-1.0.4.jar

2) Jndiq接池配|?以TomcatZ)
<Resource name="jdbc/ehangtian_jndi" auth="Container"
     type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="EHT" password="eht"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:Orcl"/>

3) 创徏工程,加入准备好的jar?
   通过IDE自动导入Spring,Hibernate框架,
   删除asm-2.2.3.jarq个冲突的Jar

创徏model,dao,service,action,inteceptor?
建立相应的类:
modelc?daoc?l承HibernateDaoSupport),servicec?Actionc?l承ActionSupport),
interceptorc?依据拦截方式实现不同接口,常用的是实现MethodInteceptor环绕拦截接口);
 
 
4) 修改web.xml,加入Spring的装载器与Struts2.0的过滤器,~码qo(h)?

<!-- Spring的装载器 -->
<listener>
    <listener-class>
         org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
<!--ContextLoaderListener?x)去找contextConfigLocationq个参数的,选择spring的配|文?-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/applicationContext.xml</param-value>
</context-param>

<!-- struts的过滤器 -->
<filter>
    <filter-name>struts2</filter-name>
     <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
     </filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 著名的Character Encoding filter,讄转换~码为gbk -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>gbk</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>

5) 创徏struts.xml文档;

6) 在根目录下创建daoContext.xml,strutsContext.xml,serviceContext.xml,aopContext.xml;

7) Z步创建的4个文档引入如下申?

<?xml version="1.0" encoding="UTF-8"?>
<beans
   xmlns="
http://www.springframework.org/schema/beans"
   xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
http://www.springframework.org/schema/beans
  
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"></beans>

8) 创徏JSP界面,建立表单,定义好表单的action属?与下一步的<action/>配置的name属性匹?;

若要使用struts2标签,可引?lt;%@ taglib prefix="s" uri="/struts-tags" %>

9) 配置struts.xml:
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     "
http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- GBK~码 -->
    <constant name="struts.i18n.encoding" value="GBK" />
    <!--通过Spring理Struts-->
    <constant name="struts.objectFactory" value="spring" />

    <package name="default" extends="struts-default">
       
        <action name="user" class="loginAction">
            <result name="input">/login.jsp</result>
            <result name="error">/login.jsp</result>
            <result name="success">/index.jsp</result>
            <interceptor-ref name="params"></interceptor-ref>
        </action>
       
    </package>
   
</struts>

10) 配置strutsContext.xml:

<!—未加AOP的配|?->
<bean id="loginAction" class="com.company.action.LoginAction" scope="prototype">
    <property name="userService" ref="userService" />
</bean>

11) 配置serviceContext.xml:

<!—未加事务的配置-->
<bean id="userService" class="com.company.service.UserService">
    <property name="userDao" ref="userDao"/>
</bean>

12) 配置daoContext.xml:

<!-- 数据源配|?-->
 <bean id="dataSource"
  class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName"
   value="java:comp/env/jdbc/ehangtian_jndi" />
  <property name="lookupOnStartup" value="false" />
  <property name="cache" value="true" />
  <property name="proxyInterface" value="javax.sql.DataSource" />
 </bean>

<!-- sessionFactory -->
<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">
            org.hibernate.dialect.Oracle9Dialect
        </prop>
        <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
    <property name="mappingDirectoryLocations">
         <list>
             <value>classpath:/com/company /model/User.hbm.xml</value>
         </list>
    </property>      
</bean>

<bean id="userDao" class="com.company.dao.UserDao">
       <property name="sessionFactory" ref="sessionFactory"/>
</bean>

13) 修改自动生成的applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
       xmlns="
http://www.springframework.org/schema/beans"
       xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
      
       <import resource="aopContext.xml"/>
       <import resource="daoContext.xml"/>
       <import resource="serviceContext.xml"/>
       <import resource="strutsContext.xml"/>
</beans>

14) src下加入Log4J资源文g: log4j.properties

15) 可以开始写业务逻辑与数据库操作Ҏ(gu)?

ActioncM获得各范围对象的Ҏ(gu)Q?/span>

1.获得Session对象:
Map sessionMap = ActionContext.getContext().getSession();
//信息放入session?br /> sessionMap.put("user", "valid");

2.获得request对象         
HttpServletRequest request = ServletActionContext.getRequest();        
request.setAttribute("username", "helloworld");

3.获得response对象       
HttpServletResponse response = ServletActionContext.getResponse();               

Cookie cookie = new Cookie("username",this.getUsername());
//如果讄?则ؓ(f)?x)话Cookie;
cookie.setMaxAge(1000);
response.addCookie(cookie);

字段驱动:

本例采用字段驱动, 它一般用在页面表单比较简单的情况使用.界面表单文本框的name属性必采用user.username形式


模型驱动:

界面表单文本框比较复? 用普通java对象充当模型部分
struts.xml的action配置加上<interceptor-ref name="model-driven"/>
q且让Actioncd现ModelDriven接口,重写getModel()Ҏ(gu)

public Object getModel(){
    return user;
}
JSP界面表单文本框的name属性的user.L


附加qo(h)?

<!-- 容器负责session的开启和关闭 -->
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class><!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>



ID刀 2009-02-27 18:03 发表评论
]]>
վ֩ģ壺 ޾ƷavƬ| С˵ͼƬ| һëƬƵվ| ˾Ʒ| AVרAVԾ| ĻƵ߿| ɫվ߹ۿ| aëƬȫƵ| ߹ۿ| ëƬ߿Ƭ˿Ƶ| Ƶ| ձһѵӰ| ؼaaaaaaaaaëƬƵ| ޹СƵƷþþ| Ů18ëƬƵ| ޾Ʒ͵Ƶѹۿ| պAVһ | Ƶ߲Ŵȫ| һԿĿ | ˾þۺӰԺ| þþþӰԺŮ | 44rt| ޸Ƶ| Ůʮ·Ůbbw| ߾ƷƵ| ĻȫѰ | ޾ƷƵ| ձ߿Ƭ˳Ƶ1000| ޸Ӱ߹ۿ| ĻƵ| ѹۿŮƵ| ޾Ʒ߲| ޵һվ| Ůɫվ| ޴Ƭ߹ۿ| ƶ߹ۿ| ƷһƵ߹ۿ| ޸Ƶվ| Ļ޾Ʒ| ѿٶ޵վ| ˬָ߳ˮƵ|