WebWork2.2中結(jié)合Spring:"新的方式"

          本文最后更新為2005-11-28

          請(qǐng)以英文版本為準(zhǔn),謝謝.本文不可能實(shí)時(shí)更新.

          本文大部分內(nèi)容來自http://wiki.opensymphony.com/display/WW/Spring,本文主要是把內(nèi)容翻譯過來并補(bǔ)充一下內(nèi)容,請(qǐng)以英文版本為準(zhǔn). :) 

          在WebWork2.2中,spring已經(jīng)作為IOC的支持基礎(chǔ),原有的Spring結(jié)合的方法已經(jīng)分別溶入到XWork和WebWork的源碼中.XWork的IoC將要被拋棄了.

          當(dāng)然原有的組合辦法依然有效,一些類改了包名和類名,但是使用方法類似.

          在WebWork2.2中,還有一種新的辦法來結(jié)合Spring.


          開啟Spring組合

           在WebWork中開啟Spring支持是非常簡(jiǎn)單的,把最新版本的Spring的jar放到你的classpath中,然后在webwork.properties里面設(shè)置如下選項(xiàng):

          webwork.objectFactory = spring 

          此時(shí)使用的類是: com.opensymphony.webwork.spring.WebWorkSpringObjectFactory,也可以指定為其他SpringObjectFactory.

          缺省Spring的裝配策略是 by name,可以修改webwork.properties改為其他方式,例如type,name,auto等


           
           這時(shí)所有對(duì)象都首先來用Spring來創(chuàng)建.如果Spring沒有創(chuàng)建這些對(duì)象,WebWork會(huì)自己創(chuàng)建這些對(duì)象. 然后,你需要在web.xml里面設(shè)置Spring的listener:

            <listener>
                <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener> 

          Spring配置示例

           這時(shí),你可以添加一個(gè)標(biāo)準(zhǔn)的Spring配置文件:WEB-INF/applicationContext.xml,舉例如下:

          <?xml version="1.0" encoding="UTF-8"?>
                      <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
                      <beans default-autowire="autodetect">
                      <bean id="personManager" class="com.acme.PersonManager"/>
                      ...
                      </beans>

          使用Spring初始化Action 

          一般來說,你在xwork.xml里面為每個(gè)Action指定類.當(dāng)使用SpringObjectFactory的時(shí)候(如果按照上面的方法配置了), 這意味著WebWork會(huì)首先請(qǐng)求Spring創(chuàng)建這個(gè)Action并按照缺省的自動(dòng)裝配策略設(shè)定依賴的屬性.SpringObjectFactory還會(huì)調(diào)用所有bean的處理器來處理事務(wù),安全等方面的代理機(jī)制.不需要特殊的設(shè)置Spring就可以自動(dòng)確定.對(duì)大多數(shù)的應(yīng)用,這會(huì)配置你的Action所需的服務(wù)和依賴,來達(dá)到你的所有要求.

           我們強(qiáng)烈推薦你找到一種聲明的方法來讓spring知道該為你的Action提供什么.這包括把你的Action里的屬性命名為在Spring配子文件里定義的Bean的名字一致,這樣可以實(shí)現(xiàn)基于名字的自動(dòng)裝配,還可以使用JDK5的標(biāo)注來聲明事務(wù)和安全層需要.如果你能找到方法讓Spring知道你的Action需要什么而且不需要在applicationContext.xml里面進(jìn)行外部配置的話,你就不需要在2個(gè)地方維護(hù)配置了.

           

          然而,有時(shí)你可能想要Spring來完全管理Bean.這是有實(shí)際意義的,例如,你如果想對(duì)你的Bean使用AOP或者Spring的相關(guān)技術(shù),例如Acegi.為了達(dá)到這個(gè)目的,你僅僅要做的就是在xwork.xml里移除你的WebWork Action的類的屬性,然后在applicationContext.xml里面配置這個(gè)Bean.
           
           你的xwork.xml文件里面的action應(yīng)該這樣定義: 

          <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
          <xwork>
            <include file="webwork-default.xml"/>
            <package name="default" extends="webwork-default">
              <action name="foo" class="foo">
                <result>foo.ftl</result>
              </action>
            </package>
            <package name="secure" namespace="/secure" extends="default">
              <action name="bar" class="bar">
                <result>bar.ftl</result>
              </action>
            </package>
          </xwork>

          Where you have a Spring bean defined in your applicationContext.xml named "bar". Note that the com.acme.Foo action did not need to be changed, because it can be autowired. 

          (你需要在你的applicationContext.xml里定義一個(gè)名字為"bar"的bean. 注意 com.acme.Foo不需要被改變,因?yàn)樗亲詣?dòng)裝配的.)


           記住:這個(gè)不是必須的.僅僅當(dāng)你需要使用Spring的攔截器或者IoC來修飾Action以便覆蓋Webwork的缺省行為時(shí),這才是必要的.要記住一點(diǎn),WebWork的Spring組合會(huì)執(zhí)行標(biāo)準(zhǔn)的IoC,使用你指定的自動(dòng)裝配策略,即使你沒有明確第在Spring中映射每個(gè)Action.所以通常你不需要做這個(gè),但是知道怎么做對(duì)你是有好處的,如果你需要的話.


          和以前版本的區(qū)別

           其實(shí)本質(zhì)上是一樣的,主要區(qū)別如下:

          •  可以不配置SpringObjectFactoryListenter,直接在webwork.properties里指定.
          •  在webwork.properties里可以指定autoWire策略.
          •  SpringObjectFactory里面多了一個(gè)buildAction,用來根據(jù)前面提到的命名習(xí)慣查找action. (已經(jīng)刪除)


          其他 

          其實(shí)通過查看源碼可以知道,還有幾個(gè)其他的類,可以做其他的設(shè)置,例如SpringProxyableObjectFactory,SessionContextSpringProxyableObjectFactory等,至于如何使用,那就慢慢研究吧 :)

           

          posted on 2005-09-21 18:28 Scud(飛云小俠) 閱讀(6369) 評(píng)論(13)  編輯  收藏 所屬分類: WEB

          評(píng)論

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-21 19:43 flyingbug

          這次可以在Tomcat5.X上運(yùn)行嗎?
          webwork2.1.x和Spring結(jié)合似乎不能運(yùn)行在Tomcat5.x下  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-21 19:46 scud

          一直都可以啊
          webwork2.1.x也可以的.你的是什么問題哪?  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-21 19:53 flyingbug

          在Tomcat5.0和Tomcat5.5的最新release的版本上
          配置好后啟動(dòng)Tomcat
          Tomcat插件在Eclipse的console中不停的彈出使用apache.common.Digester解析TLD的log
          Tomcat始終無法啟動(dòng)成功  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-21 20:51 scud(飛云小俠)

          那和webwork,spring都沒關(guān)系啊. 那應(yīng)該是tomcat插件的問題.
          單獨(dú)發(fā)布有沒有問題? 反正我從來沒有遇到過這個(gè)問題

          或者試試別的插件,例如eclipse的wtp或者myeclipse  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-22 10:46 flyingbug

          恩,我再試一下WTP吧:)  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2005-09-22 11:17 flyingbug

          WTP下沒問題,用WTP開發(fā)了N久的Web Service程序,今天經(jīng)你提醒才想起它也可以開發(fā)J2EE的程序,真是暈啊~人果然是習(xí)慣性的動(dòng)物^_^  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式"(已更新) 2005-10-17 13:57 gf

          為什么配置成功了,執(zhí)行了action,但看不到結(jié)果啊,在控制臺(tái)里也看不到輸出  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式"(已更新) 2005-10-17 14:23 scud(飛云小俠)

          這個(gè)最好貼出你的程序,否則我也不清楚啊 或者把程序發(fā)郵件給我,最好能run起來的程序  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式"(已更新) 2005-10-17 15:29 gf

          好的,飛云小俠,請(qǐng)問你的E-mail多少啊?
          是不是這個(gè)?cnscud@gmail.com  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式"(已更新) 2005-10-17 16:30 scud(飛云小俠)

          是的  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式"(已更新) 2005-11-17 15:39 to flyingbug

          Tomcat插件在Eclipse的console中不停的彈出使用apache.common.Digester解析TLD的log 是以為你的Log等級(jí)為DEBUG,級(jí)別很低,所以N多的信息要打印出來,而你的機(jī)器配置估計(jì)有問題,或者Eclipse截獲這些數(shù)據(jù)到緩沖中受不了。所以你的程序啟動(dòng)不了。把LOG的級(jí)別設(shè)置為ERROR再試一下。  回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2006-05-03 16:24 aaaaaaaaaaaaaaaaaaaaaaaaaaaaa

          在web.xml中一添加
          <listener><listener-class> org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>
          然后起動(dòng)tomcat就出現(xiàn)如下錯(cuò)誤
          2006-5-3 16:17:32 org.apache.catalina.core.StandardContext listenerStart
          嚴(yán)重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
          java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
          at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1338)
          at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1187)
          at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3640)
          at org.apache.catalina.core.StandardContext.start(StandardContext.java:4127)
          at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
          at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
          at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
          at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:603)
          at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:535)
          at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
          at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1118)
          at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
          at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1020)
          at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
          at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
          at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
          at org.apache.catalina.core.StandardService.start(StandardService.java:450)
          at org.apache.catalina.core.StandardServer.start(StandardServer.java:680)
          at org.apache.catalina.startup.Catalina.start(Catalina.java:536)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:585)
          at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
          at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
          2006-5-3 16:17:32 org.apache.catalina.core.StandardContext listenerStart

          好像是jar包的問題,但我找不出,希望給予幫助!!謝謝
            回復(fù)  更多評(píng)論   

          # re: WebWork2.2中結(jié)合Spring:"新的方式" 2007-03-05 01:13 haike

          spring-web-2.0.1.jar  回復(fù)  更多評(píng)論   

          <2005年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          文章發(fā)布許可
          創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致

          我的郵件
          cnscud # gmail


          常用鏈接

          留言簿(15)

          隨筆分類(113)

          隨筆檔案(103)

          相冊(cè)

          友情鏈接

          技術(shù)網(wǎng)站

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 洛南县| 阜城县| 宁都县| 宿松县| 安庆市| 开封市| 鹰潭市| 泰兴市| 容城县| 蚌埠市| 蓬溪县| 游戏| 荃湾区| 唐海县| 大洼县| 阳原县| 拜城县| 开封市| 东乡县| 汤原县| 称多县| 博乐市| 赤水市| 武宁县| 澜沧| 东辽县| 弥勒县| 盘山县| 邻水| 辽阳市| 荆门市| 天气| 金溪县| 洛扎县| 乌拉特中旗| 东兰县| 庆安县| 福安市| 聊城市| 尉犁县| 沧源|