﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ID刀-文章分类-Spring</title><link>http://www.blogjava.net/zzs/category/37922.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 02 Mar 2009 14:11:03 GMT</lastBuildDate><pubDate>Mon, 02 Mar 2009 14:11:03 GMT</pubDate><ttl>60</ttl><item><title>深入探讨 Spring 与 Struts 的集成方案</title><link>http://www.blogjava.net/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.blogjava.net/zzs/articles/257388.html</guid><wfw:comment>http://www.blogjava.net/zzs/comments/257388.html</wfw:comment><comments>http://www.blogjava.net/zzs/articles/257388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzs/comments/commentRss/257388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzs/services/trackbacks/257388.html</trackback:ping><description><![CDATA[<span class="a14c" id="zoom">
<p style="text-indent: 2em">
<p><font face="Times New Roman" size="3">Spring是一个轻量级(大小和系统开支的角度)的IoC和AOP容器.它力图简化J2EE开发即J2EE without EJB.而且作为帮助企业级开发的核心支柱,Spring为模型层(OR持久层:Hibernate、JDO、iBatis等)服务层(EJB、JNDI、WebService)以及表现层(Struts、JSF、Velocity)都提供了良好的支持和集成方案.　访问Spring官方站 </font></p>
<p><font face="Times New Roman" size="3">Jakarta-Struts是Apache软件组织提供的一个开源项目.它为Java Web应用提供了基于Model-View-Controller的MVC框架,尤其适用于开发大型可扩展的Web应用.尽管基于Java的MVC框架层出不穷,事实上Spring的MVC模型也提供了驱动应用系统Web层的能力,但Jakarta-Struts仍然是所有这些框架中的佼佼者. </font></p>
<p><font face="Times New Roman" size="3">下面,将如何整合这两个J2EE领域的经典项目给出两套详尽的集成方案. </font></p>
<font face="Times New Roman" size="3">
<p><br />
1.首先我们来看一个Spring-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 />
//..........the other statements<br />
request.setAttribute("cources", allCources);<br />
return mapping.findForward("jspView");<br />
} }</p>
<p><br />
分析:CourceService为一个业务实现的接口,此接口声明了一系列的业务处理方法.该方法的实现配置为Spring上下问的一个Bean.由此看来,我们大家都可能会产生一个疑问:Struts action如何取得一个包含在Spring上下文中的Bean呢?为了回答这个问题,Spring提供了两种与Struts集成的方式: </p>
<p>(1).从一个知晓Spring上下文的基类派生我们自己的Struts Action类.然后,在派生类中就可以使用super.XX()方法来获得一个对Spring受控Bean的引用. </p>
<p>(2).将请求委托给作为Spring Bean管理的Struts Action来处理. </p>
<p>2.注册Spring插件:为了使Struts Action能够访问由Spring管理的Bean,我们就必须要注册一个知道Spring应用上下文的Struts插件.可以在struts-config.xml中通过如下的方式来完成注册. </p>
<p><br />
&lt; plug-in classname="org.springframework.web.struts.ContextLoadPlugin"&gt;<br />
&lt; set-property value="WEB-INF/Yhcip.xml,......" property="contextConfigLocation"&gt;<br />
&lt; /PLUG-IN&gt;</p>
<p><br />
ContextLoadPlugin()负责装载一个Spring应用上下文.(具体的说:是一个WebApplicationContext).value属性值为要加载的配置Spring受控Bean的xml文件的URI. </p>
<p>3.完成第一种集成方案:实现一个知晓Spring的Action基类. </p>
<p>这种集成方案是从一个公共的能够访问Spring应用上下文的基类中派生所有的Struts Action,但值得庆幸的是:我们不用自己去编写这个知晓Spring应用上下文的基类,因为Spring已经提供了org.springframework.web.struts.ActionSupport:一个org.apache.struts.action.Action的抽象实现.它重载了setServlet()方法以从ContextLoaderPlugin中获取WebapplicationContext.因此,任何时候我们只需要调用super.getBean()方法即可获得一Spring上下文中的一个Bean的引用. </p>
<p>我们再来看一段Action源代码: </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 />
分析:这个Action类由ActionSupport派生,当CourceAction需要一个Spring受控Bean时:它首先调用基类的getWebApplicationContext()方法以取得一个Spring应用上下文的引用;接着它调用getBean()方法来获取由Spring管理的courceService Bean的一个引用. </p>
<p>小结 </p>
<p>至此,我们已经用第一种方案圆满的完成了Spring与Struts的集成工作.这种集成方式的好处在于直观简洁容易上手.除了需要从ActionSupport中派生,以及需要从应用上下文中获取Bean之外,其他都与在非Spring的Struts中编写和配置Action的方法相似.但这种集成方案也有不利的一面.最为显著的是:我们的Action类将直接使用Spring提供的特定类,这样会使我们的Struts Action(即控制层)的代码与Spring紧密耦合在一起.这是我们不情愿看到的.另外,Action类也负责查找由Spring管理的Bean,这违背了反向控制(IoC)的原则. </p>
<p>4.实现第二种集成方案:代理和委托Action. </p>
<p>这种集成方案要求我们编写一个Struts Action,但它只不过是一个包含在Spring应用上下文中的真正Struts Action的一个代理.该代理Action从Struts插件ContextLoaderPlugIn中获取应用上下文,从中查找真正的Struts Action,然后将处理委托给真正的Struts Action.这个方法的幽雅之处在于:只有代理action才会包含Spring特定的处理.真正的Action可以作为org.apache.struts.Action的子类来编写. </p>
<p>下面我们来看一段在之中集成方式下的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 />
分析:大家可以看到,在这种方式之下,我们的Struts Action类和Spring是低耦合的,它仅仅依赖了Spring提供的反向控制(IoC)机制把CourceService注入到了我们的Action中.到此,大家肯定会有一个疑问:那就是Spring到底是如何提供IoC反向控制的呢?回答这个问题,我们需要完成两个步骤的配置: </p>
<p>(1).在struts-config.xml中注册Struts Action.但要注意的是我们在这里注册的是代理Action.幸运的是,我们不必亲自编写这个类.因为Spring已经通过org.springframework.web.struts.DelegatingActionProxy提供了这个代理的Action.具体的配置方法如下: </p>
<p><br />
&lt; action type="org.springframework.web.struts.DelegatingActionProxy" path="/listCourses"&gt;</p>
<p><br />
(2)将真正的Struts Action作为一个Spring Bean并在Spring上下文配置文件中作为一个Bean注册之.并将Action所要引用的courceService注入给它. </p>
<p><br />
&lt; bean class="com.eRedCIP.web.CourceAction" name="/listCourses"&gt;<br />
&lt; property name=""&gt;<br />
&lt; ref bean="courseService"&gt;<br />
&lt; /property&gt;<br />
&lt; /bean&gt;</p>
<p><br />
注意:name属性的值是非常重要的,它必须和struts-config.xml中的path属性完全一致.这是因为DelegatingActionProxy会使用path属性值在Spring上下文中查找真正的Action.使用DelegatingActionProxy的好处在于我们可以不使用任何Spring特定的类来编写Struts Action.同时,Struts动作能够利用IoC取得和他合作的对象.唯一不足之处就是不太直观,配置相对复杂.为了使action委托显得更为直观一些,我们可对这种集成方案做进一步的改进:使用请求委托. </p>
<p>5.使用请求委托. </p>
<p>为了使action委托看上去更为直观一些,Spring提供了DelegatingRequestProcessor,另一种专门用于Spring的请求处理器.需要在struts-config.xml中做如下配置: </p>
<p><br />
&lt; controller processorclass="org.springframework.web.struts.DelegatingRequestProcessor"&gt;</p>
<p><br />
这样,DelegatingRequestProcessor将告诉Struts自动将动作请求委托给Spring上下文中的Action来处理.这使得我们可以在struts-config.xml中用struts action的真正类型来声明它们.例如: </p>
<p><br />
&lt; action type="com.eRedCIP.web.CourceAction" path="/listCourses"&gt;</p>
<p><br />
当接受到一个针对/listCourses的请求时,DelegatingRequestProcessor会自动从Spring上下文配置文件中查找一个名为/listCourses的Bean(实为一个Struts Action)类. </p>
<p><br />
&lt; action type="com.eRedCIP.web.CourceAction" path="/listCourses"&gt;<br />
(转)<br />
</font></p>
</span>
 <img src ="http://www.blogjava.net/zzs/aggbug/257388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzs/" target="_blank">ID刀</a> 2009-03-02 18:02 <a href="http://www.blogjava.net/zzs/articles/257388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING框架——由来和发展（转）</title><link>http://www.blogjava.net/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.blogjava.net/zzs/articles/257366.html</guid><wfw:comment>http://www.blogjava.net/zzs/comments/257366.html</wfw:comment><comments>http://www.blogjava.net/zzs/articles/257366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzs/comments/commentRss/257366.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzs/services/trackbacks/257366.html</trackback:ping><description><![CDATA[SPRING框架——由来和发展
<p>　　<strong>Spring</strong>是<strong>java</strong>平台上的一个<strong>开源应用框架</strong>。它的第一个版本是由<strong>Rod Johnson</strong>写出来的。Rod在他的Expert One-On-One Java EE Design and Development(Java企业应用设计与开发的专家一对一)一书中首次发布了这个框架。该框架也可以移植到.NET的环境下。</p>
<p>　　Spring的框架首次在2003年6月的Apache 2.0的使用许可中发布。第一个具有里程碑意义的版本是2004年3月发布的1.0。2004年9月和2005年3月先后又有重要的版本面世。</p>
<p>　　Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里，Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看，Spring给予了Java程序员许多的自由度，但同时对业界常见的问题也提供了良好的文档和易于使用的方法。</p>
<p>　　Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中，大量的拓展和改进得以形成。为此，Spring获得了广泛的欢迎，并被许多公司认可为具有战略意义的重要框架。</p>
<p>　　1. Spring框架的历史</p>
<p>　　Spring框架最开始的部分是由Rod Johnson于2000年为伦敦的金融界提供独立咨询业务时写出来的。在《Java企业应用设计与开发的专家一对一》一书中，Rod进一步拓展了他的代码，以阐述&#8220;如何让应用程序能以超出当时大众所惯于接受的易用性和稳定性与J2EE平台上的不同组件合作&#8221;的观点。</p>
<p>　　在2001年，web应用的主流编程模式为Java Servlet API和EJB。两者都是由太阳微系统公司与其他一些开发商和利益团体提出的，并在Java业界里获得了广泛的共识。那些非Web的应用，比如用户端的或批处理的应用，也可以基于能够提供所需功能的开源或商用工具和项目。</p>
<p>　　基于最优方法并适用于各种应用类型的Spring框架的建立要归功于Rod Johnson。这些想法也在他的书中得以阐述。书发表后，基于读者的要求，源代码在开源使用协议下得以提供。</p>
<p>　　一批自愿拓展Spring框架的程序开发员组成了团队，2003年2月在Sourceforge上构建了一个项目。在Spring框架上工作了一年之后，这个团队在2004年3月发布了第一个版本(1.0)。这个版本之后，Spring框架在Java社区里变得异常流行，部分的要归结于它好于一般水准的文档功能和参考文献，特别是对于一个开源项目而言尤其如此。</p>
<p>　　但是，Spring框架在2004年也备受批评，有时它也成为热烈争论的主题。Spring的第一个版本发布时，许多程序员和领先的设计人员把它看作是远离传统编程模式的一步;特别是对于EJB而言尤其如此。Spring框架的一个重要设计目标就是更容易地与已有的J2EE标准和商用工具整合。在很大程度上，这个目标使得通过受争议的官方委员会控制的规范文档来定义功能变得可有可无。</p>
<p>　　Spring框架使之前并不受欢迎的技术在短时间内迅速走红，最有名的例子就是反向控制(IOC)。2004年，Spring框架的采用率非常之高;通过推出自身的AOP(面向方向的编程)，Spring使AOP整体而言在Java社区里广受欢迎。</p>
<p>　　2005年，Spring因具有里程碑意义的新的版本的推出，更多功能的添加，从而得到了比2004年更高的采用率。2004年底创建的Spring论坛也对框架的推广而推波助澜。论坛对广大用户而言已经成为最重要的信息和帮助的源泉。</p>
<p>　　2005年，Spring框架的开发人员成立了自己的公司，来提供对Spring的商业支持，其中最显著的就是与BEA的合作。2005年12 月，第一个Spring会议在迈阿密举行，3天的课程吸引了300名开发人员。2006年6月在安特卫普召开的会议有400多名开发人员。</p>
<p>　　2. Spring框架的主要功能</p>
<p>　　&#8226; 基于Java Beans的配置管理，采用IOC的原理，特别是对依赖注射技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。</p>
<p>　　&#8226; 一个核心的，全局适用的bean工厂</p>
<p>　　&#8226; 一个一般抽象化的层面来管理数据库间的数据处理</p>
<p>　　&#8226; 建立在框架内的，对Java数据处理API和单独的JDBC数据源的一般性策略。因此，在数据处理支持上对Java企业版本环境的依赖性得以消除</p>
<p>　　&#8226; 和一些可持续性的框架，如Hibernate，JDO，iBATIS和db4o，的整合</p>
<p>　　&#8226; web应用中的MVC框架，基于核心的Spring功能，支持多种产生视图的技术，包括JSP，FreeMarker，Velocity，Tiles，iText，和POI</p>
<p>　　&#8226; 大量的AOP框架以提供诸如数据处理管理的服务。同IOC的功能一样，目的是提高系统的模块化程度</p>
Spring 框架的七个模块
<p>　　Spring 框架是一个分层架构，由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上，核心容器定义了创建、配置和管理 bean 的方式，如图 1 所示。</p>
<p>　　</p>
<p align="center"><img height="288" alt="" src="http://www.bccn.net/Article/UploadFDL05/200805/20080514153733721.jpg" width="555" /></p>
<p>　　组成 Spring 框架的每个模块(或组件)都可以单独存在，或者与其他一个或多个模块联合实现。每个模块的功能如下：</p>
<p>　　核心容器：核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory，它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。</p>
<p>　　Spring 上下文：Spring 上下文是一个配置文件，向 Spring 框架提供上下文信息。Spring 上下文包括企业服务，例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。</p>
<p>　　Spring AOP：通过配置管理特性，Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以，可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP，不用依赖 EJB 组件，就可以将声明性事务管理集成到应用程序中。</p>
<p>　　Spring DAO：JDBC DAO 抽象层提供了有意义的异常层次结构，可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理，并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。</p>
<p>　　Spring ORM：Spring 框架插入了若干个 ORM 框架，从而提供了 ORM 的对象关系工具，其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。</p>
<p>　　Spring Web 模块：Web 上下文模块建立在应用程序上下文模块之上，为基于 Web 的应用程序提供了上下文。所以，Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。</p>
<p>　　Spring MVC 框架：MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口，MVC 框架变成为高度可配置的，MVC 容纳了大量视图技术，其中包括 JSP、Velocity、Tiles、iText 和 POI。</p>
<p>　　Spring 框架的功能可以用在任何 J2EE 服务器中，大多数功能也适用于不受管理的环境。Spring 的核心要点是：支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问，这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。</p>
　Spring框架的主要功能
<p>　　组成 Spring 框架的每个模块(或组件)都可以单独存在，或者与其他一个或多个模块联合实现。每个模块的功能如下：</p>
<p>　　核心容器：核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory，它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。</p>
<p>　　Spring 上下文：Spring 上下文是一个配置文件，向 Spring 框架提供上下文信息。Spring 上下文包括企业服务，例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。</p>
<p>　　Spring AOP：通过配置管理特性，Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以，可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP，不用依赖 EJB 组件，就可以将声明性事务管理集成到应用程序中。</p>
<p>　　Spring DAO：JDBC DAO 抽象层提供了有意义的异常层次结构，可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理，并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。</p>
<p>　　Spring ORM：Spring 框架插入了若干个 ORM 框架，从而提供了 ORM 的对象关系工具，其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。</p>
<p>　　Spring Web 模块：Web 上下文模块建立在应用程序上下文模块之上，为基于 Web 的应用程序提供了上下文。所以，Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。</p>
<p>　　Spring MVC 框架：MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口，MVC 框架变成为高度可配置的，MVC 容纳了大量视图技术，其中包括 JSP、Velocity、Tiles、iText 和 POI。</p>
<p>　　Spring 框架的功能可以用在任何 J2EE 服务器中，大多数功能也适用于不受管理的环境。Spring 的核心要点是：支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问，这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。</p>
Spring事务管理
<p>　　在学习spring事务管理时,我忍不住要问,spring为什么进行事务管理,spring怎么进行的事务管理?</p>
<p>　　首先,为什么要进行事务,接下来说说spring是怎样进行事务管理的.</p>
<p>　　① Spring事务策略</p>
<p>　　Spring事务策略,也就是spring事务管理的实现方式.它有一个统一的抽象是由实现下面这个接口完成的.</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>　　不管是声明式的还是编程式的事务管理都需要此抽象来完成.</p>
<p>　　解释一下这个接口,这样可以更好的理解spring的事务控制的原理.</p>
<p>　　getTransaction()根据类型为TransactionDefinition的参数返回一个TransactionStatus对象.返回的TransactionStatus对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务).如同J2EE事务上下文,一个TransactionStatus也是和执行的线程关联的.</p>
<p>　　同时,在框架中还存在TransactionDefinition接口,即上边的参数类型.此接口指定了事务隔离程度、事务传播、事务超时、只读状态。</p>
<p>　　另外，还有TransactionStatus接口。这个接口为处理事务提供简单的控制事务执行和查询事务状态的方法。</p>
<p>　　② 两种事务管理方式：编程式、声明式。</p>
<p>　　Spring提供两种方式的编程式事务管理，分别是：使用TransactionTemplate和直接使用PlatformTransactionManager。</p>
<p>　　ⅰ. TransactionTempale采用和其他Spring模板，如JdbcTempalte和HibernateTemplate一样的方法。它使用回调方法，把应用程序从处理取得和释放资源中解脱出来。如同其他模板，TransactionTemplate是线程安全的。</p>
<p>　　代码片段：</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()可以返回一个值。</p>
<p>　　如果使用TransactionCallbackWithoutResult则没有返回值。</p>
<p>　　ⅱ. 也可以使用PlatformTransactionManager直接管理事务。简单地通过一个bean引用给你的bean传递一个你使用的 PlatformTransaction对象。然后，使用TransactionDefinition和TransactionStatus对象就可以发起、回滚、提交事务。</p>
<p>　　如下片段：</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>　　&#8230;&#8230;&#8230;&#8230;&#8230;..</p>
<p>　　transactionManager.commit(status); //提交事务;</p>
<p>　　}catch(&#8230;..)...{</p>
<p>　　transactionManager.rollback(status); //回滚事务;</p>
<p>　　}</p>
<p>　　Spring也提供声明式事务管理。这是通过AOP实现的。</p>
<p>　　大多数Spring用户选择声明式事务管理，这是最少影响应用代码的选择，因而这是和非侵入性的轻量级容器的观念是一致的。</p>
<p>　　① 通常通过TransactionProxyFactoryBean设置Spring事务代理。需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Javabean。当我们定义TransactionProxyFactoryBean时，必须提供一个相关的 PlatformTransactionManager的引用和事务属性。事务属性含有事务定义。例如:</p>
<p>　　PROPAGATION_REQUIRED,-MyCheckedException</p>
<p>　　PROPAGATION_REQUIRED</p>
<p>　　PROPAGATION_REQUIRED,readOnly</p>
<p>　　事务代理会实现目标对象的接口:这里是属性名是target的引用。id是transactionServiceControl。(●使用 CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true即可。如果目标对象没有实现任何接口，这将自动设置该属性为 true。通常，我们希望面向接口编程。) ●使用proxyInterfaces属性来限定事务代理来代理指定接口也是可以。 ●也可以通过从org.springframework.aop.framework.ProxyConfig继承或所有AOP代理工厂共享的属性来定制 TransactionProxyFactoryBean行为。</p>
<p>　　然后，说说属性名是transactionAttributes意义：</p>
<p>　　这里的transactionAttributes属性是定义在 org.springframework.transaction.interceptor.NameMathTransactionAttributeSource 中的属性格式设置。这个包括通配符的方法名称映射是很直观的，如&#8221;insert*&#8221;。注意insert*的映射的值包括回滚规则。&#8221;- MyCheckException&#8221;指定如果方法抛出MyCheckException或它的子类，事务会自动回滚。可以用逗号分隔多个回滚规则。&#8220;-&#8221; 前缀强制回滚，&#8220;+&#8221;前缀指定提交(这允许即使抛出unchecked异常时也可以提交事务)。&#8220;PROPAGATION_REQUIRED&#8221;指定事务传播范围。</p>
<p>　　TransactionProxyFactoryBean允许你通过&#8220;preInterceptors&#8221;和 &#8220;postInterceptors&#8221;属性设置前或后的拦截操作。可以设置任意数量的前和后通过，它们的类型可以是Advistor(切入点)，MethodInterceptor或被当前Spring配置支持的通知类型。例如：ThrowAdvice，AfterReturningAdvice或BeforeAdvice。这些通知必须支持实例共享模式。如果你需要高级 AOP特性操作事务，通过org.springframework.aop.framework.ProxyFactoryBean，而不是 TransactionProxyFactory实用代理创建者。</p>
<p>　　② 另一种声明方式：BeanNameAutoProxyCreator</p>
<p>　　使用TransactionProxyFactoryBean当事务代理包装对象，你可以完全控制代理。如果需要用一致方式包装大量bean。使用一个BeanFactoryPostProcessor的一个实现，BeanNameAutoProxyCreator，可以提供另外一种方法。(Spring中，一旦ApplicationContext读完它的初始化信息，它将初始化所有实现BeanPostProcessor接口的 bean，并且让它们后处理ApplicationContext中所有其他的bean。所以使用这种机制，正确配置的 BeanNameAutoProxyCreator可以用来后处理所有ApplicationContext中所有其他的bean),并且把它们用事务代理包装起来。真正生成的事务代理和使用TransactionProxyFactoryBean生成的基本一致。</p>
<p>　　最后，总结一下Spring的优点：</p>
<p>　　Spring是java平台上的一个开源应用框架。 Spring框架本身并没有强制实行任何特别的编程模式。在Java社区里，Spring作为EJB模型之外的另外一个选择甚至是替代品而广为流行。从设计上看，Spring给予了Java程序员许多的自由度，但同时对业界常见的问题也提供了良好的文档和易于使用的方法。 Spring框架的核心功能在任何Java应用中都是适用的。在基于Java企业平台上的web应用中，大量的拓展和改进得以形成。为此，Spring获得了广泛的欢迎，并被许多公司认可为具有战略意义的重要框架。</p>
<img src ="http://www.blogjava.net/zzs/aggbug/257366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzs/" target="_blank">ID刀</a> 2009-03-02 17:11 <a href="http://www.blogjava.net/zzs/articles/257366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2+Hibernate+Spring流程</title><link>http://www.blogjava.net/zzs/articles/257079.html</link><dc:creator>ID刀</dc:creator><author>ID刀</author><pubDate>Fri, 27 Feb 2009 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/zzs/articles/257079.html</guid><wfw:comment>http://www.blogjava.net/zzs/comments/257079.html</wfw:comment><comments>http://www.blogjava.net/zzs/articles/257079.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zzs/comments/commentRss/257079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzs/services/trackbacks/257079.html</trackback:ping><description><![CDATA[<p><span style="font-size: small; color: #993300"><span style="color: #000000">1) 准备好如下jar包:<br />
Oracle数据库的jar: <br />
Ojdbc14.jar</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">struts2的jar:<br />
commons-pool.jar<br />
freemarker-2.3.8.jar<br />
ognl-2.6.11.jar<br />
struts2-core-2.0.11.jar<br />
xwork-2.0.4.jar</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">struts2整合spring的jar:<br />
struts2-spring-plugin-2.0.9.jar</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">Hibernate整合需要的jar:<br />
commons-logging-1.0.4.jar</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">2) Jndi连接池配置(以Tomcat为例)<br />
&lt;Resource name="jdbc/ehangtian_jndi" auth="Container" <br />
&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource"<br />
&nbsp;&nbsp;&nbsp; maxActive="100" maxIdle="30" maxWait="10000"<br />
&nbsp;&nbsp;&nbsp; username="EHT" password="eht"<br />
&nbsp;&nbsp;&nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"<br />
&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@localhost:1521:Orcl"/&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">3) 创建工程,加入准备好的jar包,<br />
&nbsp;&nbsp; 通过IDE自动导入Spring,Hibernate框架,<br />
&nbsp;&nbsp; 删除asm-2.2.3.jar这个冲突的Jar</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">创建model,dao,service,action,inteceptor包,<br />
建立相应的类:<br />
model类,dao类(继承HibernateDaoSupport),service类,Action类(继承ActionSupport),<br />
interceptor类(依据拦截方式实现不同接口,常用的是实现MethodInteceptor环绕拦截接口);<br />
&nbsp;<br />
&nbsp;<br />
4) 修改web.xml,加入Spring的装载器与Struts2.0的过滤器,编码过滤器:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- Spring的装载器 --&gt;<br />
&lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.context.ContextLoaderListener<br />
&nbsp;&nbsp;&nbsp; &lt;/listener-class&gt;<br />
&lt;/listener&gt;<br />
&lt;!--ContextLoaderListener会去找contextConfigLocation这个参数的，选择spring的配置文件 --&gt;<br />
&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;classpath:/applicationContext.xml&lt;/param-value&gt;<br />
&lt;/context-param&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- struts的过滤器 --&gt;<br />
&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;<br />
&lt;/filter&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- 著名的Character Encoding filter,设置转换编码为gbk --&gt;<br />
&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.filter.CharacterEncodingFilter<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;param-value&gt;gbk&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&lt;/filter&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">5) 创建struts.xml文档;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">6) 在根目录下创建daoContext.xml,strutsContext.xml,serviceContext.xml,aopContext.xml;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">7) 为上步创建的4个文档引入如下申明:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;&nbsp; xmlns="</span></span><a href="http://www.springframework.org/schema/beans"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"<br />
&nbsp;&nbsp; xmlns:xsi="</span></span><a href="http://www.w3.org/2001/XMLSchema-instance"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.w3.org/2001/XMLSchema-instance</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"<br />
&nbsp;&nbsp; xsi:schemaLocation="</span></span><a href="http://www.springframework.org/schema/beans"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000"> <br />
&nbsp;&nbsp; </span></span><a href='http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"></beans' href_cetemp='http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"></beans'><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;&lt;/beans</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">8) 创建JSP界面,建立表单,定义好表单的action属性(与下一步的&lt;action/&gt;配置的name属性匹配);</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">若要使用struts2标签,可引入&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">9) 配置struts.xml:<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp; "</span></span><a href="http://struts.apache.org/dtds/struts-2.0.dtd"><span style="font-size: small; color: #993300"><span style="color: #000000">http://struts.apache.org/dtds/struts-2.0.dtd</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"&gt;<br />
&lt;struts&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!-- GBK编码 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;constant name="struts.i18n.encoding" value="GBK" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--通过Spring管理Struts--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;constant name="struts.objectFactory" value="spring" /&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&nbsp;&nbsp;&nbsp; &lt;package name="default" extends="struts-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="user" class="loginAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;/login.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="error"&gt;/login.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;/index.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="params"&gt;&lt;/interceptor-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;/struts&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">10) 配置strutsContext.xml:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!—未加AOP的配置--&gt;<br />
&lt;bean id="loginAction" class="com.company.action.LoginAction" scope="prototype"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="userService" ref="userService" /&gt;<br />
&lt;/bean&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">11) 配置serviceContext.xml:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!—未加事务的配置--&gt;<br />
&lt;bean id="userService" class="com.company.service.UserService"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="userDao" ref="userDao"/&gt;<br />
&lt;/bean&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">12) 配置daoContext.xml:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- 数据源配置 --&gt;<br />
&nbsp;&lt;bean id="dataSource"<br />
&nbsp;&nbsp;class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="jndiName"<br />
&nbsp;&nbsp;&nbsp;value="java:comp/env/jdbc/ehangtian_jndi" /&gt;<br />
&nbsp;&nbsp;&lt;property name="lookupOnStartup" value="false" /&gt;<br />
&nbsp;&nbsp;&lt;property name="cache" value="true" /&gt;<br />
&nbsp;&nbsp;&lt;property name="proxyInterface" value="javax.sql.DataSource" /&gt;<br />
&nbsp;&lt;/bean&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- sessionFactory --&gt;<br />
&lt;bean id="sessionFactory"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="dataSource" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.hibernate.dialect.Oracle9Dialect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="mappingDirectoryLocations"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;classpath:/com/company /model/User.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/property&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&lt;/bean&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;bean id="userDao" class="com.company.dao.UserDao"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory" ref="sessionFactory"/&gt;<br />
&lt;/bean&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">13) 修改自动生成的applicationContext.xml:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns="</span></span><a href="http://www.springframework.org/schema/beans"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="</span></span><a href="http://www.w3.org/2001/XMLSchema-instance"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.w3.org/2001/XMLSchema-instance</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="</span></span><a href="http://www.springframework.org/schema/beans"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000"> </span></span><a href="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"><span style="font-size: small; color: #993300"><span style="color: #000000">http://www.springframework.org/schema/beans/spring-beans-2.0.xsd</span></span></a><span style="font-size: small; color: #993300"><span style="color: #000000">"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="aopContext.xml"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="daoContext.xml"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="serviceContext.xml"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="strutsContext.xml"/&gt;<br />
&lt;/beans&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">14) src下加入Log4J资源文件: log4j.properties</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">15) 可以开始写业务逻辑与数据库操作方法了.</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">Action类中获得各范围对象的方法：</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">1.获得Session对象:<br />
Map sessionMap = ActionContext.getContext().getSession();<br />
//将信息放入session中<br />
sessionMap.put("user", "valid");</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">2.获得request对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
HttpServletRequest request = ServletActionContext.getRequest();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
request.setAttribute("username", "helloworld");</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">3.获得response对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
HttpServletResponse response = ServletActionContext.getResponse();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">Cookie cookie = new Cookie("username",this.getUsername());<br />
//如果设置为负数,则为会话Cookie;<br />
cookie.setMaxAge(1000);<br />
response.addCookie(cookie);</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">字段驱动:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">本例采用字段驱动, 它一般用在页面表单比较简单的情况使用.界面表单文本框的name属性必须采用user.username形式</span></span></p>
<p><br />
<span style="font-size: small; color: #993300"><span style="color: #000000">模型驱动:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">界面表单文本框比较复杂, 用普通java对象充当模型部分<br />
struts.xml的action配置加上&lt;interceptor-ref name="model-driven"/&gt;<br />
并且让Action类实现ModelDriven接口,重写getModel()方法</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">public Object getModel(){<br />
&nbsp;&nbsp;&nbsp; return user;<br />
}<br />
将JSP界面表单文本框的name属性的user.去掉</span></span></p>
<p><br />
<span style="font-size: small; color: #993300"><span style="color: #000000">附加过滤器:</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;!-- 容器负责session的开启和关闭 --&gt;<br />
&lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.orm.hibernate3.support.OpenSessionInViewFilter<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;&lt;!-- singleSession默认为true,若设为false则等于没用OpenSessionInView --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;singleSession&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&lt;/filter&gt;</span></span></p>
<p><span style="font-size: small; color: #993300"><span style="color: #000000">&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</span></span></p>
<img src ="http://www.blogjava.net/zzs/aggbug/257079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzs/" target="_blank">ID刀</a> 2009-02-27 18:03 <a href="http://www.blogjava.net/zzs/articles/257079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>