﻿<?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-Hafeyang's Tech Space-随笔分类-struts</title><link>http://www.blogjava.net/Hafeyang/category/39346.html</link><description>长于前端开发。乐意分享。</description><language>zh-cn</language><lastBuildDate>Mon, 29 Nov 2010 14:53:11 GMT</lastBuildDate><pubDate>Mon, 29 Nov 2010 14:53:11 GMT</pubDate><ttl>60</ttl><item><title>整合struts2,spring-struts2的spring插件使用及简单剖析</title><link>http://www.blogjava.net/Hafeyang/archive/2010/11/28/integration_of_spring_struts2_using_struts-spring-plugin_and_how_it_works.html</link><dc:creator>阳衡锋</dc:creator><author>阳衡锋</author><pubDate>Sun, 28 Nov 2010 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2010/11/28/integration_of_spring_struts2_using_struts-spring-plugin_and_how_it_works.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/339277.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2010/11/28/integration_of_spring_struts2_using_struts-spring-plugin_and_how_it_works.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/339277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/339277.html</trackback:ping><description><![CDATA[<p>struts2与spring的整合中有一种方法是通过struts-spring-plugin，使用该插件指定struts中的objectfactory为spring的beanfactory,简单的说，就是使用spring 的bean容器管理struts的Action的实例化。<br />
<br />
使用步骤：<br />
1.引入struts2-spring-plugin-x-x-x.jar 到classpath<br />
2.在struts.xml或者struts2.properties中指定objectFactory</p>
<pre style="text-align: left; padding-bottom: 0px; overflow-x: auto; overflow-y: auto; margin: 10px 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" class="code-java">&lt;struts&gt;
&lt;constant name=<span class="code-quote">"struts.objectFactory"</span> value=<span class="code-quote">"org.apache.struts2.spring.StrutsSpringObjectFactory"</span> /&gt;
...
&lt;/struts&gt;
</pre>
事实上这个步骤可以省略，在struts2-spring-plugin-x-x-x.jar 有一个struts-plugins.xml，格式与struts.xml的格式一致，struts的配置文件加载顺序，显示struts-default.xml，定义在struts-core.jar中。然后加载struts.xml，最后加载struts-plugin.xml。<br />
3.在Action的就可以使用@Autowired之类的Annotation注入Bean，如<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">@Component<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PandoraAction&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Inject<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;TestService&nbsp;testService;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<br />
探究其原理，自然需要从StrutsSpringObjectFactory类开始了。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;StrutsSpringObjectFactory&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;SpringObjectFactory&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ObjectFactoryInitializable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Log&nbsp;log&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;LogFactory.getLog(StrutsSpringObjectFactory.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;(non-Javadoc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.apache.struts2.util.ObjectFactoryInitializable#init(javax.servlet.ServletContext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(ServletContext&nbsp;servletContext)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(</span><span style="color: #000000">"</span><span style="color: #000000">Initializing&nbsp;Struts-Spring&nbsp;integration<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;appContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WebApplicationContextUtils.getWebApplicationContext(servletContext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(appContext&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;uh&nbsp;oh!&nbsp;looks&nbsp;like&nbsp;the&nbsp;lifecycle&nbsp;listener&nbsp;wasn't&nbsp;installed.&nbsp;Let's&nbsp;inform&nbsp;the&nbsp;user</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">**********&nbsp;FATAL&nbsp;ERROR&nbsp;STARTING&nbsp;UP&nbsp;SPRING-STRUTS&nbsp;INTEGRATION&nbsp;**********\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Looks&nbsp;like&nbsp;the&nbsp;Spring&nbsp;listener&nbsp;was&nbsp;not&nbsp;configured&nbsp;for&nbsp;your&nbsp;web&nbsp;app!&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Nothing&nbsp;will&nbsp;work&nbsp;until&nbsp;WebApplicationContextUtils&nbsp;returns&nbsp;a&nbsp;valid&nbsp;ApplicationContext.\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">You&nbsp;might&nbsp;need&nbsp;to&nbsp;add&nbsp;the&nbsp;following&nbsp;to&nbsp;web.xml:&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener&gt;\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;\n</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/listener&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.fatal(message);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setApplicationContext(appContext);</span></div>
<br />
StrutsSpringObjectFactory继承自SpringObjectFactory类，在初始化时从ServletContext取到ApplicationContext。<br />
<br />
SpringObjectFactory 继承自com.opensymphony.xwork2.ObjectFactory，ObjectFactory提供Action的默认实例话功能。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SpringObjectFactory&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ObjectFactory&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ApplicationContextAware</span></div>
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Looks&nbsp;up&nbsp;beans&nbsp;using&nbsp;Spring's&nbsp;application&nbsp;context&nbsp;before&nbsp;falling&nbsp;back&nbsp;to<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;method&nbsp;defined&nbsp;in&nbsp;the&nbsp;{</span><span style="color: #808080">@link</span><span style="color: #008000">&nbsp;ObjectFactory}.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;beanName<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;name&nbsp;of&nbsp;the&nbsp;bean&nbsp;to&nbsp;look&nbsp;up&nbsp;in&nbsp;the&nbsp;application&nbsp;context<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;A&nbsp;bean&nbsp;from&nbsp;Spring&nbsp;or&nbsp;the&nbsp;result&nbsp;of&nbsp;calling&nbsp;the&nbsp;overridden<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;buildBean(String&nbsp;beanName)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;<strong style="color: red">appContext.getBean(beanName);<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(NoSuchBeanDefinitionException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;beanClazz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getClassInstance(beanName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;buildBean(beanClazz);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;clazz<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;buildBean(Class&nbsp;clazz)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;bean&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;autoWiringFactory.autowire(clazz,&nbsp;AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(UnsatisfiedDependencyException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Fall&nbsp;back</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.buildBean(clazz);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;autoWiringFactory.applyBeanPostProcessorsBeforeInitialization(bean,&nbsp;bean.getClass().getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;We&nbsp;don't&nbsp;need&nbsp;to&nbsp;call&nbsp;the&nbsp;init-method&nbsp;since&nbsp;one&nbsp;won't&nbsp;be&nbsp;registered.</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;autoWiringFactory.applyBeanPostProcessorsAfterInitialization(bean,&nbsp;bean.getClass().getName());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;autoWireBean(bean);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
appContext就是在初始化中setApplicationContext注入进去的。<br />
通过重载struts2中默认的buildBean方法，通过spring的bean容器实例化action bean。<br />
<br />
参考资料:<br />
&nbsp;
<p>1.Struts<span style="font-family: 宋体">中其实也有一些</span>IOC<span style="font-family: 宋体">的概念，看看他的</span>bean<span style="font-family: 宋体">的配置：</span></p>
<p><a href="http://struts.apache.org/2.0.14/docs/bean-configuration.html">http://struts.apache.org/2.0.14/docs/bean-configuration.html</a></p>
<p>2.struts-spring-plugin<span style="font-family: 宋体">的介绍：</span></p>
<p><a href="http://struts.apache.org/2.x/docs/spring-plugin.html">http://struts.apache.org/2.x/docs/spring-plugin.html</a></p>
<p>3.struts-spring-plugin<span style="font-family: 宋体">关键类</span>&nbsp;StrutsSpringObjectFactory (<span style="font-family: 宋体">继承自</span>SpringObjectFactory),SpringObjectFactory(<span style="font-family: 宋体">继承自</span><span style="font-family: 'Courier New'; color: black; font-size: 12pt">ObjectFactory</span>)<span style="font-family: 宋体">的关键代码</span>:</p>
<p><a href="http://www.koders.com/java/fid5C3A785273DB48FACE6A555235E29EB629F18284.aspx">http://www.koders.com/java/fid5C3A785273DB48FACE6A555235E29EB629F18284.aspx</a></p>
<p><a href="http://www.koders.com/java/fid8FB58F1A37336CC84161E3A655F9D4F73A36EC6F.aspx">http://www.koders.com/java/fid8FB58F1A37336CC84161E3A655F9D4F73A36EC6F.aspx</a></p>
<br />
<img src ="http://www.blogjava.net/Hafeyang/aggbug/339277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">阳衡锋</a> 2010-11-28 23:45 <a href="http://www.blogjava.net/Hafeyang/archive/2010/11/28/integration_of_spring_struts2_using_struts-spring-plugin_and_how_it_works.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2中的mode-driven体验</title><link>http://www.blogjava.net/Hafeyang/archive/2009/05/01/model_driven_in_struts2.html</link><dc:creator>阳衡锋</dc:creator><author>阳衡锋</author><pubDate>Fri, 01 May 2009 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/Hafeyang/archive/2009/05/01/model_driven_in_struts2.html</guid><wfw:comment>http://www.blogjava.net/Hafeyang/comments/268557.html</wfw:comment><comments>http://www.blogjava.net/Hafeyang/archive/2009/05/01/model_driven_in_struts2.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/Hafeyang/comments/commentRss/268557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Hafeyang/services/trackbacks/268557.html</trackback:ping><description><![CDATA[<p>在很久之前我就体验(所谓体验，就是写一个demo跑跑，算不上学习)过一把struts2。但是我发现虽然struts2相对struts1.x有很大的不同，但是还是没有解决困扰我的这个问题。就是model就究竟怎么写。在一个spring-hibernate-struts的典型项目中，通常会在Hibernate中定义一个pojo实体类做ORM，但是在struts的Action同样要定义model,不会再把那个实体类再写一遍，我觉得很难受，我知道可以在Action里面声明一个实体类，但是这样总觉得不是很优雅，因为在我看来，实体类没有得到很好的复用，我曾经对struts2很冷漠。但是最近了解到struts2里面有一个Model-Driven,虽然对模型驱动开发了之甚少，但是通过自己做的简单的代码，我发现这个世界真的是缺少发现。 <br />
</p>
这也是第一次用上了maven2，最开始用到maven2是因为他可以管理依赖(dependency),我们只要在maven2的pom.xml 文件中添加一个依赖，maven&#160;就会自动到网上下载struts所依赖的包并设置好classpath。<br />
<br />
tip:要使用maven2的eclipse插件m2eclipse必须将eclipse3.4升级到最新的版本，不然会被报错的，update站点为:http://m2eclipse.sonatype.org/update/<br />
<br />
新建完项目之后，在项目的右键菜单中 maven2 -> add maven2 management。整个项目的目录结构都会有变化，注意两点，添加了maven2支持后，在build path中的source没有了，需要手动添加文件夹。还有一个问题就是你必须在"Order and export"中将maven dependencies勾上,否则部署tomcat上面的时候会有包缺失。<br />
<br />
进入正题：其实model-driven在strtus中的用法没有什么特别的地方。就是在定义Action的时候稍有不同。<br />
<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><span style="color: #008080">&#160;1</span>&#160;<span style="color: #0000ff">public</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">class</span><span style="color: #000000">&#160;UserAction&#160;&#160;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&#160;ActionSupport&#160;<strong>&#160;</strong></span><span style="color: #0000ff"><span style="color: red"><strong>implements&#160;ModelDriven</strong></span></span><span style="color: #000000">{<br />
</span><span style="color: #008080">&#160;2</span>&#160;<span style="color: #000000"><br />
</span><span style="color: #008080">&#160;3</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">private</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">static</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">final</span><span style="color: #000000">&#160;</span><span style="color: #0000ff">long</span><span style="color: #000000">&#160;serialVersionUID&#160;</span><span style="color: #000000">=</span><span style="color: #000000">&#160;</span><span style="color: #000000">6863420763993646296L</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&#160;4</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><strong><span style="color: #0000ff">private</span><span style="color: #000000">&#160;User&#160;user</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span></strong><strong><span style="color: #000000">&#160;User();<br />
</span><span style="color: #008080">&#160;5</span>&#160;</strong><strong><span style="color: #000000">&#160;&#160;&#160;&#160;<br />
</span><span style="color: #008080">&#160;6</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span></strong><strong><span style="color: #000000">&#160;Object&#160;getModel()&#160;{<br />
</span><span style="color: #008080">&#160;7</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span></strong><strong><span style="color: #000000">&#160;user;<br />
</span><span style="color: #008080">&#160;8</span>&#160;</strong><span style="color: #000000"><strong>&#160;&#160;&#160;&#160;}<br />
</strong></span><span style="color: #008080">&#160;9</span>&#160;<span style="color: #000000"><br />
</span><span style="color: #008080">10</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">public</span><span style="color: #000000">&#160;String&#160;execute()&#160;{<br />
</span><span style="color: #008080">11</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">.user.getAge()</span><span style="color: #000000">==</span><span style="color: #000000">20</span><span style="color: #000000">)&#160;</span><span style="color: #0000ff">this</span><span style="color: #000000">.user.setAge(</span><span style="color: #000000">22</span><span style="color: #000000">);<br />
</span><span style="color: #008080">12</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">return</span><span style="color: #000000">&#160;SUCCESS;<br />
</span><span style="color: #008080">13</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;}<br />
</span><span style="color: #008080">14</span>&#160;<span style="color: #000000">}</span></div>
<br />
其实变化就是在定义Action的时候实现ModelDriven接口实现getModel方法。注意在声明实体对象的时候需要实例化。但是在jsp页面上也是有不同的。<br />
<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left-color: #cccccc; width: 98%; word-break: break-all; padding-top: 4px; background-color: #eeeeee; "><span style="color: #008080">1</span>&#160;<span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form&#160;</span><span style="color: #ff0000">action</span><span style="color: #0000ff">="UserAction"</span><span style="color: #ff0000">&#160;theme</span><span style="color: #0000ff">="css_xhtml"</span><span style="color: #0000ff">></span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&#160;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="name"</span><span style="color: #ff0000">&#160;label</span><span style="color: #0000ff">="姓名"</span><span style="color: #0000ff">>&lt;/</span><span style="color: #800000">s:textfield</span><span style="color: #0000ff">></span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield&#160;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="age"</span><span style="color: #ff0000">&#160;label</span><span style="color: #0000ff">="年龄"</span><span style="color: #0000ff">>&lt;/</span><span style="color: #800000">s:textfield</span><span style="color: #0000ff">></span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span>&#160;<span style="color: #000000">&#160;&#160;&#160;&#160;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit&#160;</span><span style="color: #ff0000">value</span><span style="color: #0000ff">="GO"</span><span style="color: #0000ff">>&lt;/</span><span style="color: #800000">s:submit</span><span style="color: #0000ff">></span><span style="color: #000000"><br />
</span><span style="color: #008080">5</span>&#160;<span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">></span></div>
<p><br />
如果按照通常的做法在Action中定义一个User对象，那么在jsp页面上文本框的属性就应该是user.name,user.age.这样做显然更加简单。</p>
<h3>结论</h3>
<p>使用model-driven的方式能够将现有的实体类简单的复用为mvc模型中的model,减少代码。<br />
<br />
疑问：虽然解决了这么个问题，但是我还是对struts有些不放心，就是tag生成的html,很难获得dom的id属性，这样给javascript的一些逻辑控制带来了麻烦，这也是我对struts不太放心的地方，不知道大家在这方面是怎么做的。</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/Hafeyang/aggbug/268557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Hafeyang/" target="_blank">阳衡锋</a> 2009-05-01 23:29 <a href="http://www.blogjava.net/Hafeyang/archive/2009/05/01/model_driven_in_struts2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>