WebWork2.2中结合Spring:"新的方式"

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

请以英文版本为准,谢谢.本文不可能实时更新.

本文大部分内容来自http://wiki.opensymphony.com/display/WW/Spring,本文主要是把内容翻译过来并补充一下内容,请以英文版本为准. :) 

在WebWork2.2中,spring已经作为IOC的支持基础,原有的Spring结合的方法已经分别溶入到XWork和WebWork的源码中.XWork的IoC将要被抛弃了.

当然原有的组合办法依然有效,一些类改了包名和类名,但是使用方法类似.

在WebWork2.2中,还有一种新的办法来结合Spring.


开启Spring组合

 在WebWork中开启Spring支持是非常简单的,把最新版本的Spring的jar放到你的classpath中,然后在webwork.properties里面设置如下选项:

webwork.objectFactory = spring 

此时使用的类是: com.opensymphony.webwork.spring.WebWorkSpringObjectFactory,也可以指定为其他SpringObjectFactory.

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


 
 这时所有对象都首先来用Spring来创建.如果Spring没有创建这些对象,WebWork会自己创建这些对象. 然后,你需要在web.xml里面设置Spring的listener:

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

Spring配置示例

 这时,你可以添加一个标准的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里面为每个Action指定类.当使用SpringObjectFactory的时候(如果按照上面的方法配置了), 这意味着WebWork会首先请求Spring创建这个Action并按照缺省的自动装配策略设定依赖的属性.SpringObjectFactory还会调用所有bean的处理器来处理事务,安全等方面的代理机制.不需要特殊的设置Spring就可以自动确定.对大多数的应用,这会配置你的Action所需的服务和依赖,来达到你的所有要求.

 我们强烈推荐你找到一种声明的方法来让spring知道该为你的Action提供什么.这包括把你的Action里的属性命名为在Spring配子文件里定义的Bean的名字一致,这样可以实现基于名字的自动装配,还可以使用JDK5的标注来声明事务和安全层需要.如果你能找到方法让Spring知道你的Action需要什么而且不需要在applicationContext.xml里面进行外部配置的话,你就不需要在2个地方维护配置了.

 

然而,有时你可能想要Spring来完全管理Bean.这是有实际意义的,例如,你如果想对你的Bean使用AOP或者Spring的相关技术,例如Acegi.为了达到这个目的,你仅仅要做的就是在xwork.xml里移除你的WebWork Action的类的属性,然后在applicationContext.xml里面配置这个Bean.
 
 你的xwork.xml文件里面的action应该这样定义: 

<!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里定义一个名字为"bar"的bean. 注意 com.acme.Foo不需要被改变,因为它是自动装配的.)


 记住:这个不是必须的.仅仅当你需要使用Spring的拦截器或者IoC来修饰Action以便覆盖Webwork的缺省行为时,这才是必要的.要记住一点,WebWork的Spring组合会执行标准的IoC,使用你指定的自动装配策略,即使你没有明确第在Spring中映射每个Action.所以通常你不需要做这个,但是知道怎么做对你是有好处的,如果你需要的话.


和以前版本的区别

 其实本质上是一样的,主要区别如下:

  •  可以不配置SpringObjectFactoryListenter,直接在webwork.properties里指定.
  •  在webwork.properties里可以指定autoWire策略.
  •  SpringObjectFactory里面多了一个buildAction,用来根据前面提到的命名习惯查找action. (已经删除)


其他 

其实通过查看源码可以知道,还有几个其他的类,可以做其他的设置,例如SpringProxyableObjectFactory,SessionContextSpringProxyableObjectFactory等,至于如何使用,那就慢慢研究吧 :)

 

posted on 2005-09-21 18:28 Scud(飞云小侠) 阅读(6351) 评论(13)  编辑  收藏 所属分类: WEB

评论

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-21 19:43 flyingbug

这次可以在Tomcat5.X上运行吗?
webwork2.1.x和Spring结合似乎不能运行在Tomcat5.x下  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-21 19:46 scud

一直都可以啊
webwork2.1.x也可以的.你的是什么问题哪?  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-21 19:53 flyingbug

在Tomcat5.0和Tomcat5.5的最新release的版本上
配置好后启动Tomcat
Tomcat插件在Eclipse的console中不停的弹出使用apache.common.Digester解析TLD的log
Tomcat始终无法启动成功  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-21 20:51 scud(飞云小侠)

那和webwork,spring都没关系啊. 那应该是tomcat插件的问题.
单独发布有没有问题? 反正我从来没有遇到过这个问题

或者试试别的插件,例如eclipse的wtp或者myeclipse  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-22 10:46 flyingbug

恩,我再试一下WTP吧:)  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2005-09-22 11:17 flyingbug

WTP下没问题,用WTP开发了N久的Web Service程序,今天经你提醒才想起它也可以开发J2EE的程序,真是晕啊~人果然是习惯性的动物^_^  回复  更多评论   

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

为什么配置成功了,执行了action,但看不到结果啊,在控制台里也看不到输出  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式"(已更新) 2005-10-17 14:23 scud(飞云小侠)

这个最好贴出你的程序,否则我也不清楚啊 或者把程序发邮件给我,最好能run起来的程序  回复  更多评论   

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

好的,飞云小侠,请问你的E-mail多少啊?
是不是这个?cnscud@gmail.com  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式"(已更新) 2005-10-17 16:30 scud(飞云小侠)

是的  回复  更多评论   

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

Tomcat插件在Eclipse的console中不停的弹出使用apache.common.Digester解析TLD的log 是以为你的Log等级为DEBUG,级别很低,所以N多的信息要打印出来,而你的机器配置估计有问题,或者Eclipse截获这些数据到缓冲中受不了。所以你的程序启动不了。把LOG的级别设置为ERROR再试一下。  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2006-05-03 16:24 aaaaaaaaaaaaaaaaaaaaaaaaaaaaa

在web.xml中一添加
<listener><listener-class> org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
然后起动tomcat就出现如下错误
2006-5-3 16:17:32 org.apache.catalina.core.StandardContext listenerStart
严重: 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包的问题,但我找不出,希望给予帮助!!谢谢
  回复  更多评论   

# re: WebWork2.2中结合Spring:"新的方式" 2007-03-05 01:13 haike

spring-web-2.0.1.jar  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2005年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

文章发布许可
创造共用协议:署名,非商业,保持一致

我的邮件
cnscud # gmail


常用链接

留言簿(15)

随笔分类(113)

随笔档案(103)

相册

友情链接

技术网站

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜