﻿<?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-勇于挑战-随笔分类-J2EE</title><link>http://www.blogjava.net/gp213/category/39568.html</link><description>不畏艰辛</description><language>zh-cn</language><lastBuildDate>Tue, 23 Jun 2009 18:26:02 GMT</lastBuildDate><pubDate>Tue, 23 Jun 2009 18:26:02 GMT</pubDate><ttl>60</ttl><item><title>WebWork 2.1 / 2.2 与 Spring 集成方法总结</title><link>http://www.blogjava.net/gp213/archive/2009/06/23/283721.html</link><dc:creator>郭鹏</dc:creator><author>郭鹏</author><pubDate>Tue, 23 Jun 2009 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/gp213/archive/2009/06/23/283721.html</guid><wfw:comment>http://www.blogjava.net/gp213/comments/283721.html</wfw:comment><comments>http://www.blogjava.net/gp213/archive/2009/06/23/283721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gp213/comments/commentRss/283721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gp213/services/trackbacks/283721.html</trackback:ping><description><![CDATA[<h4>第一部分：WebWork2.1与<a target="_self"><span style="text-decoration: underline"><strong>Spring</strong></span></a>集成</h4>
<p>两种方法：</p>
<h5>法一：先<a target="_self"><span style="text-decoration: underline"><strong><span class="hilite1">WebWork</span></strong></span></a>后Spring（利用webwork2-spring.jar集成）</h5>
<p>该方法的执行顺序是先<span class="hilite1">WebWork</span>，后Spring。<br />
即，首先在xwork.xml中找到待执行的action，如果该action依赖其他bean，再到applicationContext.xml中查找被依赖的bean。</p>
<p>WebWork2的IoC功能实现是在xwork.xml中，指定action类与其他bean的依赖关系。即：<br />
(1)xwork.xml文件<br />
&lt;action name="myAction" class="com.ryandaigle.web.actions.MyAction"&gt;<br />
&lt;external-ref name="DAO"&gt;myDAO&lt;/external-ref&gt;<br />
&lt;result name="success" type="dispatcher"&gt;<br />
&lt;param name="location"&gt;/success.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>(2)applicationContext.xml文件<br />
&lt;bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" /&gt;</p>
<p>具体集成步骤如下：</p>
<p>1. <a target="_self"><span style="text-decoration: underline"><strong>下载</strong></span></a>以下文件：<br />
<span class="nobr"><a title="Visit page outside Confluence" href="http://www.ryandaigle.com/pebble/images/webwork2-spring.jar" rel="nofollow">http://www.ryandaigle.com/pebble/images/webwork2-spring.jar<sup><img class="rendericon" title="点击图片可在新窗口打开" style="cursor: pointer" height="7" alt="" src="http://hi.baidu.com/fc/editor/" width="7" align="absMiddle" border="0" /></sup></a></span></p>
<p>2. 配置xwork.xml</p>
<p>2.1 在xwork.xml中定义action时，采用external-ref来指定依赖的spring bean</p>
<p>&lt;action name="myAction" class="com.foo.Action"&gt;<br />
&lt;external-ref name="someDao"&gt;someDao&lt;/external-ref&gt;</p>
<p>&lt;result name="success" type="dispatcher"&gt;<br />
&lt;param name="location"&gt;/success.jsp&lt;/param&gt;<br />
&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>2.2 在&lt;package&gt;中指定外部引用解析器</p>
<p>&lt;package name="default" extends="<span class="hilite1">webwork</span>-default"<br />
externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver"/&gt;</p>
<p>SpringServletContextReferenceResolver作用是在applicationContext.xml中解析外部引用的bean</p>
<p>2.3 增加一个拦截器，允许引用作为外部资源进行解析<br />
&lt;interceptors&gt;<br />
&lt;interceptor name="reference-resolver" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/&gt;<br />
&lt;interceptor-stack name="myDefaultWebStack"&gt;<br />
&lt;interceptor-ref name="defaultStack"/&gt;<br />
&lt;interceptor-ref name="reference-resolver"/&gt;<br />
&lt;/interceptor-stack&gt;<br />
&lt;/interceptors&gt;<br />
&lt;default-interceptor-ref name="myDefaultWebStack"/&gt;</p>
<p>3. 在web.xml中配置Spring与XWork的外部解析器在同一个Web Context中工作<br />
&lt;!--载入spring配置文件--&gt;<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; classpath:/applicationContext.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/context-param&gt;<br />
<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>&lt;listener&gt;<br />
&lt;listener-class&gt;com.atlassian.xwork.ext.ResolverSetupServletContextListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>第一个侦听器是spring必需的，无论是否与<span class="hilite1">WebWork</span>集成，都要<a target="_self"><span style="text-decoration: underline"><strong>定义</strong></span></a>该侦听器；第二个侦听器是外部解析器所需要的，作用是通过ServletContext来取出Spring的ApplicationContext，作为<span class="hilite1">WebWork</span>与Spring的&#8220;桥梁&#8221;。</p>
<p>4.applicationContext.xml文件跟xwork.xml文件的存放路径一下，都在classpath下<br />
在applicationContext.xml中定义被引用的bean<br />
&lt;bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" /&gt;</p>
<p>说明：<br />
如果不使用WebWork2，完全使用Spring，达到上述<a target="_self"><span style="text-decoration: underline"><strong>效果</strong></span></a>，在applicationContext.xml中采取类似定义：<br />
&lt;bean id="myAction" class="com.ryandaigle.web.actions.MyAction" singleton="false"&gt;<br />
&lt;property name="DAO"&gt;<br />
&lt;ref bean="myDAO"/&gt;<br />
&lt;/property&gt;<br />
&lt;bean id="myDAO" class="com.ryandaigle.persistence.MyDAO" singleton="true" /&gt;</p>
<p>&nbsp;</p>
<h5>法二：先Spring后<span class="hilite1">WebWork</span>（利用spring-xwork-integration.jar集成）</h5>
<p>该方法的执行顺序是先Spring，后<span class="hilite1">WebWork</span>。<br />
即，首先由Spring负责wire所有的依赖关系，再由XWork来执行action。</p>
<p>注意：因为XWork为每个action调用生成一个新的类实例，action在Spring的applicationContext.xml中应该<a target="_self"><span style="text-decoration: underline"><strong>配置</strong></span></a>为prototype。</p>
<p>1. 配置SpringObjectFactory</p>
<p>(0)下载<a href="https://xwork-optional.dev.java.net/files/documents/1475/11992/spring-xwork-integration.jar">https://xwork-optional.dev.java.net/files/documents/1475/11992/spring-xwork-integration.jar</a></p>
<p>(1) 可以在web.xml配置</p>
<p>&lt;listener&gt;<br />
&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>&lt;listener&gt;<br />
&lt;listener-class&gt;com.opensymphony.xwork.spring.SpringObjectFactoryListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>(2) 或者：在applicationContext.xml配置<br />
&lt;bean id="springObjectFactory"<br />
class="com.opensymphony.xwork.spring.SpringObjectFactory"<br />
init-method="initObjectFactory"/&gt;</p>
<p>以上两种方法任选一种即可</p>
<p>2. 在applicationContext.xml中定义bean<br />
&lt;bean name="some-action" class="fully.qualified.class.name" singleton="false"&gt;<br />
&lt;property name="someProperty"&gt;&lt;ref bean="someOtherBean"/&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>3. 在xwork.xml中定义action（注意action的class与bean的id相同）</p>
<p>&lt;action name="myAction" class="some-action"&gt;<br />
&lt;result name="success"&gt;view.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>说明：<br />
该方法与<span class="hilite1">WebWork</span> 2.2中的方法基本相同。</p>
<p>&nbsp;</p>
<h4>第二部分：WebWork2.2与Spring的集成</h4>
<p>Spring是WebWork2.2中唯一支持的IoC容器。</p>
<p>1 配置<span class="hilite1">webwork</span>.properties文件，指定spring作为<span class="hilite1">webwork</span>的IoC容器<br />
<span class="hilite1">webwork</span>.objectFactory = spring<br />
(1)默认的autowiring模式是：by name<br />
即如果applicationContext.xml文件中的bean id与xwork.xml文件中的action name相同，就<br />
(2)如果要改为其他模式：<br />
<span class="hilite1">webwork</span>.objectFactory.spring.autoWire = name|type|auto|constructor</p>
<p>2 配置web.xml文件，启动Spring侦听器<br />
&lt;listener&gt;<br />
&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&lt;/listener&gt;</p>
<p>3 在WEB-INF目录下增加applicationContext.xml文件<br />
例：<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
&lt;beans default-autowire="autodetect"&gt;<br />
&lt;bean id="personManager" class="com.acme.PersonManager"/&gt;<br />
...<br />
&lt;/beans&gt;</p>
<p>4 设置由Spring来初始化action<br />
4.1&nbsp;&nbsp;&nbsp;&nbsp; 在Spring的applicationContext.xml文件中配置bean（即action类）<br />
4.2&nbsp;&nbsp;&nbsp;&nbsp; 将xwork.xml中的action的class属性，由class名改为Spring中定义的bean名<br />
例如：<br />
(1)applicationContext.xml中，定义bean id是bar<br />
&lt;beans default-autowire="autodetect"&gt;<br />
&lt;bean id="bar" class="com.my.BarClass" singleton="false"/&gt;<br />
...<br />
&lt;/beans&gt;<br />
(2)xwork.xml中，action的class="bar"，而不是通常的类名<br />
&lt;package name="secure" namespace="/secure" extends="default"&gt;<br />
&lt;action name="bar" class="bar"&gt;<br />
&lt;result&gt;bar.ftl&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;/package&gt;</p>
<img src ="http://www.blogjava.net/gp213/aggbug/283721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gp213/" target="_blank">郭鹏</a> 2009-06-23 12:37 <a href="http://www.blogjava.net/gp213/archive/2009/06/23/283721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>