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