﻿<?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-JAVA学习随笔-随笔分类-WebWork</title><link>http://www.blogjava.net/wangzhouyu/category/13946.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 29 Feb 2012 02:57:24 GMT</lastBuildDate><pubDate>Wed, 29 Feb 2012 02:57:24 GMT</pubDate><ttl>60</ttl><item><title>WebWork2.2结合spring的Action测试</title><link>http://www.blogjava.net/wangzhouyu/archive/2012/02/28/370946.html</link><dc:creator>小小~咖啡豆</dc:creator><author>小小~咖啡豆</author><pubDate>Tue, 28 Feb 2012 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/wangzhouyu/archive/2012/02/28/370946.html</guid><wfw:comment>http://www.blogjava.net/wangzhouyu/comments/370946.html</wfw:comment><comments>http://www.blogjava.net/wangzhouyu/archive/2012/02/28/370946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangzhouyu/comments/commentRss/370946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangzhouyu/services/trackbacks/370946.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; display: inline !important; font: 14px/21px verdana, 'courier new'; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">在WebWork2.2中和Spring的结合变得简单了，WebWork的Action的也可以由Spring来管理。但是如何进行测试了，在google上搜了一下，其代码都是如下形式： 
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;params&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.put(</span><span style="color: #000000">"</span><span style="color: #000000">a</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;paramCtx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap();<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paramCtx.put(ActionContext.PARAMETERS,&nbsp;params);<br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionProxy&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionProxyFactory.getFactory().createActionProxy(</span><span style="color: #000000">"</span><span style="color: #000000">/organiz</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">new_depart</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;paramCtx,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.setExecuteResult(</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(proxy.execute(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">success</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyTestAction&nbsp;action&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MyTestAction)&nbsp;proxy.getAction();<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(action.getA(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);</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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">paramCtx.put(ActionContext.DEV_MODE,&nbsp;Boolean.FALSE);</span></div><br />其次需要加载spring的applicationContext，代码如下：
<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">SpringObjectFactory&nbsp;objectFactory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SpringObjectFactory();<br /></span><span style="color: #008080">2</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;appContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectFactory.setApplicationContext(appContext);<br /></span><span style="color: #008080">4</span><span style="color: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectFactory.setObjectFactory(objectFactory);</span></div><br /><br /></span><img src ="http://www.blogjava.net/wangzhouyu/aggbug/370946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangzhouyu/" target="_blank">小小~咖啡豆</a> 2012-02-28 22:53 <a href="http://www.blogjava.net/wangzhouyu/archive/2012/02/28/370946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ww:if test比较String和Char的区别</title><link>http://www.blogjava.net/wangzhouyu/archive/2007/03/28/106986.html</link><dc:creator>小小~咖啡豆</dc:creator><author>小小~咖啡豆</author><pubDate>Wed, 28 Mar 2007 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/wangzhouyu/archive/2007/03/28/106986.html</guid><wfw:comment>http://www.blogjava.net/wangzhouyu/comments/106986.html</wfw:comment><comments>http://www.blogjava.net/wangzhouyu/archive/2007/03/28/106986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangzhouyu/comments/commentRss/106986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangzhouyu/services/trackbacks/106986.html</trackback:ping><description><![CDATA[
<p><strong><a href="http://www.jscud.com/srun/news/viewhtml/4_2005_1/26.htm">http://www.jscud.com/srun/news/viewhtml/4_2005_1/26.htm</a></strong></p>
<img src ="http://www.blogjava.net/wangzhouyu/aggbug/106986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangzhouyu/" target="_blank">小小~咖啡豆</a> 2007-03-28 15:36 <a href="http://www.blogjava.net/wangzhouyu/archive/2007/03/28/106986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork的IOC（基于2.1.X版本）</title><link>http://www.blogjava.net/wangzhouyu/archive/2007/03/22/105480.html</link><dc:creator>小小~咖啡豆</dc:creator><author>小小~咖啡豆</author><pubDate>Thu, 22 Mar 2007 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/wangzhouyu/archive/2007/03/22/105480.html</guid><wfw:comment>http://www.blogjava.net/wangzhouyu/comments/105480.html</wfw:comment><comments>http://www.blogjava.net/wangzhouyu/archive/2007/03/22/105480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangzhouyu/comments/commentRss/105480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangzhouyu/services/trackbacks/105480.html</trackback:ping><description><![CDATA[
<p>webwork的IOC（基于2.1.X版本）<br/>webwork的ioc其实在webwork中使用起来挺方便的，虽然其功能不算强大，但是已经能很好的满足我们一般的需要了，就算我们使用spring 的ioc，如果不使用特别的功能，其一般我们也是基于接口，然后有个set方法，通过set来注入，没有太多的区别，不同的是webwork的ioc需要依赖xwork，而spring却是依赖spring这个容器。<br/>webwork的ioc是怎么进行注入的了，我们从代码中进行分析：<br/>首先看看拦截器的代码：<br/><br/>public class ComponentInterceptor extends AroundInterceptor {<br/>//~ Static fields/initializers /////////////////////////////////////////////<br/><br/>public static final String COMPONENT_MANAGER = "com.opensymphony.xwork.interceptor.component.ComponentManager";<br/><br/>//~ Methods ////////////////////////////////////////////////////////////////<br/><br/>protected void after(ActionInvocation dispatcher, String result) throws Exception {<br/>}<br/><br/>protected void before(ActionInvocation dispatcher) throws Exception {<br/><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">ComponentManager container = (ComponentManager) ActionContext.getContext().get(COMPONENT_MANAGER);</span><br style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"/>
<br style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"/>
<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">if (container != null) {</span><br style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"/>
<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">container.initializeObject(dispatcher.getAction());</span><br style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)"/>
<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,0)">}</span><br/>}<br/>}<br/><br/>主要的代码用黑体标注出来了，container实际就是组件管理器，这里是一个ComponentManager接口的实现 DefaultComponentManager，然后调用了该类的方法initializeObject(dispatcher.getAction ());而dispatcher.getAction()实际就是所调用的action对象，我们再来看看 DefaultComponentManager做了什么。<br/><br/>public void initializeObject(Object obj) {<br/><span style="FONT-WEIGHT: bold">loadResource(obj, obj.getClass(), this);</span><br/>}<br/><br/><br/>private Class loadResource(Object resource, Class clazz, DefaultComponentManager dcm) {<br/>// ~由此来判断是否要进行依赖注入<br/>boolean resourceNotLoaded = !dcm.loadOrder.contains(resource);<br/><br/>if (resourceNotLoaded) {<br/><span style="FONT-WEIGHT: bold">Map resources = getResourceDependencies(clazz);</span><br/><br/>for (Iterator iterator = resources.entrySet().iterator();<br/>iterator.hasNext();) {<br/>Map.Entry mapEntry = (Map.Entry) iterator.next();<br/>Class depResource = (Class) mapEntry.getKey();<br/>DefaultComponentManager newDcm = (DefaultComponentManager) mapEntry.getValue();<br/><br/>try {<br/><span style="FONT-WEIGHT: bold">ResourceEnablerPair pair = setupAndOptionallyCreateResource(newDcm, depResource);</span><br/><span style="FONT-WEIGHT: bold">setupResource(resource, pair.enabler, pair.resource);</span><br/>} catch (Exception e) {<br/>e.printStackTrace();<br/><br/>if (log.isDebugEnabled()) {<br/>log.debug("Error loading or setting up resource: " + resources.getClass().getName(), e);<br/>}<br/>}<br/>}<br/><br/>dcm.alreadyLoaded.add(clazz);<br/><br/>if (resource instanceof Initializable) {<br/>Initializable initializable = (Initializable) resource;<br/>initializable.init();<br/>}<br/><br/>dcm.resourceInstances.put(clazz, resource);<br/>dcm.loadOrder.add(resource);<br/>}<br/><br/>// now return this class's enabler<br/>Class enabler = (Class) dcm.enablers2.get(clazz);<br/><br/>return enabler;<br/>}<br/><br/>private Map getResourceDependencies(Class resourceClass) {<br/>List interfaces = new ArrayList();<br/>//~ 将所有的interface放入interfaces链表中<br/><span style="FONT-WEIGHT: bold">addAllInterfaces(resourceClass, interfaces);</span><br/><br/>Map dependencies = new HashMap();<br/><br/>for (Iterator iterator = interfaces.iterator(); iterator.hasNext();) {<br/>Class anInterface = (Class) iterator.next();<br/><br/>DefaultComponentManager dcm = this;<br/><br/>while (dcm != null) {<br/>Class possibleResource = (Class) dcm.enablers.get(anInterface);<br/><br/>if (possibleResource != null) {<br/>dependencies.put(possibleResource, dcm);<br/><br/>break;<br/>}<br/>dcm = dcm.fallback;<br/>}<br/>}<br/>return dependencies;<br/>}<br/><br/>private void addAllInterfaces(Class clazz, List allInterfaces) {<br/>if (clazz == null) {<br/>return;<br/>}<br/><br/><span style="FONT-WEIGHT: bold">Class[] interfaces = clazz.getInterfaces();</span><br style="FONT-WEIGHT: bold"/>
<span style="FONT-WEIGHT: bold">allInterfaces.addAll(Arrays.asList(interfaces));</span><br style="FONT-WEIGHT: bold"/>
<span style="FONT-WEIGHT: bold">addAllInterfaces(clazz.getSuperclass(), allInterfaces);</span><br/>}<br/><br/>重要的代码都用黑体进行了标注，方法initializeObject中所调用的<span style="FONT-WEIGHT: bold">loadResource(obj, obj.getClass(), this);</span>就执行了查找接口，并注入接口实现类整个过程。<br/>loadResource首先调用了<span style="FONT-WEIGHT: bold">getResourceDependencies(clazz);</span>而<span style="FONT-WEIGHT: bold">getResourceDependencies</span>又调用了<span style="FONT-WEIGHT: bold">addAllInterfaces(resourceClass, interfaces);</span><span style="FONT-WEIGHT: bold">addAllInterfaces</span>作用就是取得这个类包括这个类的父类的所有实现的接口，而<span style="FONT-WEIGHT: bold">getResourceDependencies</span>方法就是对这个接口进行过滤，返回只是在配置中有的接口。<span style="FONT-WEIGHT: bold">setupAndOptionallyCreateResource(newDcm, depResource);</span>进行的就是创建这些接口的实现类的对象，这个代码的内容如下：<br/><br/>private ResourceEnablerPair setupAndOptionallyCreateResource(DefaultComponentManager newDcm, Class depResource) throws Exception {<br/>ResourceEnablerPair pair = new ResourceEnablerPair();<br/>Object newResource = newDcm.resourceInstances.get(depResource);<br/><br/>if (newResource == null) {<br/>newResource = ObjectFactory.getObjectFactory().buildBean(depResource);<br/>}<br/><br/>pair.resource = newResource;<br/><br/><span style="FONT-WEIGHT: bold">Class enabler = loadResource(newResource, depResource, newDcm);</span><br/>pair.enabler = enabler;<br/><br/>return pair;<br/>}<br/><br/>因为准备创建出来的接口实现类对象的接口可能又实现了其他的接口，因此再调用了<span style="FONT-WEIGHT: bold">loadResource(newResource, depResource, newDcm)。</span>对象创建了，然后就是注入这个对象，<span style="FONT-WEIGHT: bold">setupResource(resource, pair.enabler, pair.resource)</span>就是起这个作用的。代码如下：<br/><br/>private void setupResource(Object resource, Class enabler, Object newResource) {<br/>if (enabler == null) {<br/>return;<br/>}<br/><br/>try {<br/><span style="FONT-WEIGHT: bold">enabler.getMethods()[0].invoke(resource, new Object[] {newResource});</span><br/>} catch (Exception e) {<br/>e.printStackTrace();<br/><br/>if (log.isDebugEnabled()) {<br/>log.debug("Error invoking method for resource: " + resource.getClass().getName(), e);<br/>}<br/>}<br/>}<br/><span style="FONT-WEIGHT: bold"><br/></span>每个接口只有一个set方法，通过反射机制调用这个方法将创建出来的接口实现对象注入进去。整个IOC就完成了。</p>
<img src ="http://www.blogjava.net/wangzhouyu/aggbug/105480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangzhouyu/" target="_blank">小小~咖啡豆</a> 2007-03-22 10:30 <a href="http://www.blogjava.net/wangzhouyu/archive/2007/03/22/105480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork2.2.3发布了</title><link>http://www.blogjava.net/wangzhouyu/archive/2006/08/25/65664.html</link><dc:creator>小小~咖啡豆</dc:creator><author>小小~咖啡豆</author><pubDate>Fri, 25 Aug 2006 00:17:00 GMT</pubDate><guid>http://www.blogjava.net/wangzhouyu/archive/2006/08/25/65664.html</guid><wfw:comment>http://www.blogjava.net/wangzhouyu/comments/65664.html</wfw:comment><comments>http://www.blogjava.net/wangzhouyu/archive/2006/08/25/65664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangzhouyu/comments/commentRss/65664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangzhouyu/services/trackbacks/65664.html</trackback:ping><description><![CDATA[
<p>WebWork2.2.3发布了<br/></p>
<p><strong>UI and Views</strong></p>
<ul>
<li>New and improved components: <a href="http://www.opensymphony.com/webwork/wikidocs/datepicker.html" title="datepicker">datepicker</a>, <a href="http://www.opensymphony.com/webwork/wikidocs/head.html" title="head">head</a>, <a href="http://www.opensymphony.com/webwork/wikidocs/form.html" title="form">form</a>, <a href="http://www.opensymphony.com/webwork/wikidocs/radio.html" title="radio">radio</a>, <a href="http://www.opensymphony.com/webwork/wikidocs/tree.html" title="tree">tree</a>, <a href="http://www.opensymphony.com/webwork/wikidocs/text.html" title="text">text</a></li>
<li>Various bug fixes for the <a href="http://www.opensymphony.com/webwork/wikidocs/ajax%20theme.html" title="ajax theme">ajax theme</a></li>
<li>Improved xslt and stream result</li>
</ul>
<p><strong>Tools</strong></p>
<ul>
<li><a href="http://www.opensymphony.com/webwork/wikidocs/Quickstart.html" title="QuickStart">Quickstart</a> Support for arbitrary webapp deployment</li>
<li>The new <a href="http://www.opensymphony.com/webwork/wikidocs/Debugging%20inside%20WebWork%20-%20Debuggability%20of%20your%20Application.html" title="Debugging inside WebWork - Debuggability of your Application">debug</a> interceptor provides an ajax console to test your ognl expressions</li>
</ul>
<p><strong>Misc</strong></p>
<ul>
<li>Better support for i18n and l10n</li>
<li>Support for Java 5 enumeration type conversion</li>
<li>Encodings during multipart requests are now properly handled</li>
<li>Better and more transparant error handling</li>
</ul>
<img src ="http://www.blogjava.net/wangzhouyu/aggbug/65664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangzhouyu/" target="_blank">小小~咖啡豆</a> 2006-08-25 08:17 <a href="http://www.blogjava.net/wangzhouyu/archive/2006/08/25/65664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork的数据验证</title><link>http://www.blogjava.net/wangzhouyu/archive/2006/08/11/63055.html</link><dc:creator>小小~咖啡豆</dc:creator><author>小小~咖啡豆</author><pubDate>Fri, 11 Aug 2006 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/wangzhouyu/archive/2006/08/11/63055.html</guid><wfw:comment>http://www.blogjava.net/wangzhouyu/comments/63055.html</wfw:comment><comments>http://www.blogjava.net/wangzhouyu/archive/2006/08/11/63055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangzhouyu/comments/commentRss/63055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangzhouyu/services/trackbacks/63055.html</trackback:ping><description><![CDATA[
<p>在WebWork中进行数据验证其实有好几种方式，在此我将他一一列举出来</p>
<p>一、直接在execute()方法中进行验证</p>
<div style="BORDER-RIGHT: #3c78b5 1px solid; BORDER-TOP: #3c78b5 1px solid; BORDER-LEFT: #3c78b5 1px solid; BORDER-BOTTOM: #3c78b5 1px solid; FONT-FAMILY: 'Courier New', Courier; BACKGROUND-COLOR: #d8e4f1">
<div style="BACKGROUND-COLOR: #d8e4f1; TEXT-ALIGN: left"><br/>public String execute() {<br/>boolean validationPassed = true;<br/>if (StringUtils.isBlank(user.getName())) {<br/>addActionError(getText("user.name.empty"));<br/>validationPassed = false;<br/>}<br/><br/>if (StringUtils.isBlank(user.getAddress())) {<br/>addActionError(getText("user.address.empty"));<br/>validationPassed = false;<br/>}<br/><br/>return (validationPassed ? SUCCESS : INPUT);<br/>}<br/><br/></div>
</div>
<p>因为整个action是放入OgnlValueStack中的，页面就可以取出这些Error，然后显示出来,在Input对应的页面加入如下代码：</p>
<div style="BORDER-RIGHT: #3c78b5 1px solid; BORDER-TOP: #3c78b5 1px solid; BORDER-LEFT: #3c78b5 1px solid; BORDER-BOTTOM: #3c78b5 1px solid; FONT-FAMILY: 'Courier New', Courier; BACKGROUND-COLOR: #d8e4f1">
<div style="BACKGROUND-COLOR: #d8e4f1; TEXT-ALIGN: left"><br/>&lt;ww:if test="hasActionErrors"&gt;&lt;!--你可以查看ActionSupport类源码，其中有boolean hasActionErrors()这个方法--&gt;<br/>&lt;span class="errormessage"&gt;<br/>&lt;b&gt;Errors:&lt;/b&gt;&lt;br/&gt;<br/>&lt;ww:iterator value="actionErrors"&gt;<br/>&lt;li&gt;&lt;ww:property value="value[0]"/&gt;&lt;/li&gt;<br/>&lt;/ww:iterator&gt;<br/>&lt;/span&gt;<br/>&lt;/ww:if&gt;<br/><br/></div>
</div>
<p><br/></p>
<p>二、是用Validateable接口提供的validate()方法进行验证</p>
<div style="BORDER-RIGHT: #3c78b5 1px solid; BORDER-TOP: #3c78b5 1px solid; BORDER-LEFT: #3c78b5 1px solid; BORDER-BOTTOM: #3c78b5 1px solid; FONT-FAMILY: 'Courier New', Courier; BACKGROUND-COLOR: #d8e4f1">
<div style="BACKGROUND-COLOR: #d8e4f1; TEXT-ALIGN: left"><br/>ActionSupport就继承了这个接口<br/>public void validate() {<br/>if (StringUtils.isBlank(user.getName())) {<br/>addActionError(getText("user.name.empty"));<br/>}<br/>if (StringUtils.isBlank(user.getAddress())) {<br/>addActionError(getText("user.address.empty"));<br/>}<br/>}<br/><br/></div>
</div>
<p>然后在对的action的xwork.xml配置中，使用validationWorkflowStack拦截器，并确保有input result。<br/>那么一旦验证出错将会返回input页面，但此时并无错误信息提示。将第一种方式显示错误信息代码加入到input 页面，那么错误信息也将显示出来。<br/></p>
<p>三、使用WebWork的(标准形式)的验证<br/>具体的步骤：</p>
<div style="BORDER-RIGHT: #3c78b5 1px solid; BORDER-TOP: #3c78b5 1px solid; BORDER-LEFT: #3c78b5 1px solid; BORDER-BOTTOM: #3c78b5 1px solid; FONT-FAMILY: 'Courier New', Courier; BACKGROUND-COLOR: #d8e4f1">
<div style="BACKGROUND-COLOR: #d8e4f1; TEXT-ALIGN: left"><br/>1.建立validators.xml文件，如果没有自己定义的校验器则可以不用建立。<br/>2.建立对应action的检验文件。<br/>检验文件名有两种方式<br/>（1）Action类名-validation.xml<br/>（2）Action类名-Action别名-validation.xml<br/>其中Action别名就是xwork.xml配置中action的name<br/>3.页面使用&lt;ww/&gt;tag<br/>页面的form和域都使用&lt;ww/&gt;tag方式<br/>4.拦截器使用validationWorkflowStack<br/><br/></div>
</div>
<p><br/></p>
<p>四、WebWork的客户端验证<br/>在使用第三种方式时候，通过对&lt;ww:form&gt;里面增加validate="true"即可实现客户端验证（在&lt;head&gt;&lt;/head&gt;之间增加一个&lt;ww:head/&gt;tag效果更好，里面包括了css的定义）</p>
<p>五、DWR验证<br/></p>
<img src ="http://www.blogjava.net/wangzhouyu/aggbug/63055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangzhouyu/" target="_blank">小小~咖啡豆</a> 2006-08-11 17:36 <a href="http://www.blogjava.net/wangzhouyu/archive/2006/08/11/63055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>