﻿<?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-☆蓝色梦想☆-随笔分类-Struct</title><link>http://www.blogjava.net/zlsunnan/category/5657.html</link><description>世界总是反反覆覆错错落落地飘去 来不及叹息 生活不是平平淡淡从从容容的东西 不能放弃</description><language>zh-cn</language><lastBuildDate>Tue, 05 Jun 2007 06:28:24 GMT</lastBuildDate><pubDate>Tue, 05 Jun 2007 06:28:24 GMT</pubDate><ttl>60</ttl><item><title>[struts]常见异常信息和解决方法</title><link>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Mon, 04 Jun 2007 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/121776.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/121776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/121776.html</trackback:ping><description><![CDATA[<div class="postText">
<p>以下所说的struts-config.xml和ApplicationResources.properties等文件名是缺省时使用的，如果你使用了多模块，或指定了不同的资源文件名称，这些名字要做相应的修改。</p>
<p><strong>1、&#8220;No bean found under attribute key XXX&#8221;<br></strong>在struts-config.xml里定义了一个ActionForm，但type属性指定的类不存在，type属性的值应该是Form类的全名。或者是，在Action的定义中，name或attribute属性指定的ActionForm不存在。<br></p>
<p><strong>2、&#8220;Cannot find bean&nbsp;XXX in any scope&#8221;</strong><br>在Action
里一般会request.setAttribute()一些对象，然后在转向的jsp文件里（用tag或request.getAttribute()方
法）得到这些对象并显示出来。这个异常是说jsp要得到一个对象，但前面的Action里并没有将对象设置到request（也可以是session、
servletContext）里。<br>可能是名字错了，请检查jsp里的tag的一般是name属性，或getAttribute()方法的参数值；或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。<br>还
有另外一个可能，纯粹是jsp文件的问题，例如&lt;logic:iterate&gt;会指定一个id值，然后在循环里&lt;bean:
write&gt;使用这个值作为name的值，如果这两个值不同，也会出现此异常。（都是一个道理，request里没有对应的对象。）<br></p>
<p><strong>3、&#8220;Missing message for key "XXX"&#8221;</strong><br>缺少所需的资源，检查ApplicationResources.properties文件里是否有jsp文件里需要的资源，例如：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean:message&nbsp;key</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">msg.name.prompt</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
</div>
<p>这
行代码会找msg.name.prompt资源，如果AppliationResources.properties里没有这个资源就会出现本异常。在使
用多模块时，要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称，否则当然什么资源也找不到，这也是一个很容易犯的错
误。</p>
<p><strong>4、&#8220;No getter method for property&nbsp;XXX of bean teacher&#8221;</strong><br>这条异常信息说得很明白，jsp里要取一个bean的属性出来，但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean:write&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">teacher</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;property</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">cade</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;filter</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span></div>
</div>
<br>
<p><strong>5、&#8220;Cannot find ActionMappings or ActionFormBeans collection&#8221;<br></strong>一般是因为struts-config.xml里面的&lt;action写错了。xml用手工写很容易出错&#8230;&#8230; <br><strong>6、&#8220;Cannot retrieve mapping for action XXX&#8221;<br></strong>在.jsp的&lt;form&gt;标签里指定action='/XXX'，但这个Action并未在struts-config.xml里设置过。</p>
<p><strong>7、HTTP Status 404 - /xxx/xxx.jsp<br></strong>Forward的path属性指向的jsp页面不存在，请检查路径和模块，对于同一模块中的Action转向，path中不应包含模块名；模块间转向，记住使用contextRelative="true"。</p>
<p><strong>8、没有任何异常信息，显示空白页面</strong><br>可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。<br></p>
<p><strong>9、&#8220;The element type "XXX" must be terminated by the matching end-tag "XXX".&#8221;<br></strong>这个是struts-config.xml文件的格式错误，仔细检查它是否是良构的xml文件，关于xml文件的格式这里就不赘述了。</p>
<p><strong>10、&#8220;Servlet.init() for servlet action threw exception&#8221;</strong><br>一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息，其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下：</p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 98%;">
<div><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">java.lang.NullPointerException<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:</span><span style="color: #000000;">1003</span><span style="color: #000000;">)<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:</span><span style="color: #000000;">955</span><span style="color: #000000;">)<br><img  src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"><img  src="http://www.cnblogs.com/Images/dot.gif"></span></div>
</div>
<p><br>为解决问题，先下载struts的源码包，然后在ActionServlet.java的第1003行插入断点，并对各变量进行监视。很丢人，我竟然把struts-config.xml文件弄丢了，因此出现了上面的异常，应该是和CVS同步时不小心删除的。</p>
<p><strong>11、&#8220;Resources not defined for Validator&#8221;</strong><br>这个是利用Validator插件做验证时可能出现的异常，这时你要检查validation.xml文件，看里面使用的资源是否确实有定义，form的名称是否正确，等等。</p>
<p>上面这些是我在用Struts做项目时遇到过的问题，其中一些曾困绕我不少时间，其实大部分都是自己不细心造成的。希望这篇文章能对你的开发有所帮助，并欢迎继续补充。</p>
</div><img src ="http://www.blogjava.net/zlsunnan/aggbug/121776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-06-04 10:58 <a href="http://www.blogjava.net/zlsunnan/archive/2007/06/04/121776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0系列</title><link>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101694.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Sat, 03 Mar 2007 17:03:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101694.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/101694.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/101694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/101694.html</trackback:ping><description><![CDATA[
		<a title="Struts 2.0系列" href="/max/category/16130.html" target="_blank">Struts 2.0系列</a>
<img src ="http://www.blogjava.net/zlsunnan/aggbug/101694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-03-04 01:03 <a href="http://www.blogjava.net/zlsunnan/archive/2007/03/04/101694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 应用转移到 Struts 2 ( 二 ) </title><link>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101693.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Sat, 03 Mar 2007 17:01:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101693.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/101693.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/101693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/101693.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SpringSide团队翻译， 转载请注明出处。    在上篇文章中，我们已经从较高层解释了整个框架的结构，请求流程的基础，配置方式和Struts2和Struts1的不同之处。了解这些后从Struts 应用 迁移到 Struts 2 不再是难事。    在这篇文章中，我们将会更详细地讲述如何由Struts 的action转为Struts 2的action。一个应用的例子这个例子选择了大家都熟悉的 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/zlsunnan/archive/2007/03/04/101693.html'>阅读全文</a><img src ="http://www.blogjava.net/zlsunnan/aggbug/101693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-03-04 01:01 <a href="http://www.blogjava.net/zlsunnan/archive/2007/03/04/101693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 应用转移到 Struts 2 (一)</title><link>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101690.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Sat, 03 Mar 2007 16:51:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101690.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/101690.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/101690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/101690.html</trackback:ping><description><![CDATA[翻译：<a href="http://www.springside.org.cn/" target="_blank">SpringSide</a>团队   转载请注明出处。<br /><br />     有很多人都很熟悉 Struts, 无论是从项目中直接获得的实战经验还是从书中了解到的。我们这一系列文章，将通过一个由 Stuts 转移到 Struts2 简单的例子向大家展现Struts2的所有特征。<br />    在我们开始这个例子之前，你需要去知道一点 Struts2的背景知识。 在第一部分的文章中，我们将介绍Struts2与Struts的核心框架的不同点，以助于更好地了解其他方面的整合。第二部分中，我们将深入探讨 actions 的差别, action相关的框架特征，和action配置。在最后一部分中，我们将会讲述 user interface，我们也会讲到其架构，UI构件，themes 和标签。 还有如何为你的应用加上新的外观。<br />    我们并不打算谈及迁移过程的所有细节方面，我们只是从出发点开始介绍Struts2 的概念和现在可用的所有特征。但拥有这些知识，你将在以后Struts2的应用中无往而不利。<br />    <br /><b><font size="3">Struts的历史</font></b><br />    Struts的第一个版本 是在 2001年5月份发布。它提供了一个Web应用的解决方案，如何让 JSPs 和 servlets 共存去提供清晰的分离视图和业务和应用逻辑的架构。在Struts之前，最通常的做法是在JSP中加入业务和应用逻辑，或者在servlets中生成视图。<br />    自从第一个版本的发布， Struts 实际上已成为业界公认的Web应用标准。但随着时间的推移，Web应用框架经常变化的需求，产生了几个下一代 Struts的解决方案。其中两个可选方案是Shale 和 Struts Ti。 Shale 是一个基于构建的框架，并在最近成为 Apache 中的重要项目。而 Struts Ti 则是继续坚持 MVC模式的基础上改进，继续Struts的成功经验。<br />    WebWork项目是在2002年3月发布的，它对Struts式框架进行了革命性改进，引进了不少新的思想，概念和功能，但和原Struts代码并不兼容。WebWork是一个成熟的框架，经过了好几次重大的改进与发布。在2005年12月，WebWork与Struts Ti决定合拼， 再此同时， Struts Ti 改名为 Struts Action Framework 2.0,成为Struts真正的下一代。<br /><br /><b><font size="3">请求如何运作</font></b><br />    在我们开始详细探讨如何转移Struts到Struts2之前，让我们来看看整个请求流程在新架构中是如何运作的。你会注意到在整个请求的生命周期，仍是以controller作主体，而且所有的概念还都是你以前所熟悉的， 就如：<br /><br /><ul><li>通过URL请求的参数来调用Actions来把数据传给server. 
</li><li>所有的Servlet objects (request, response, session,之类.) 仍然可以在Action中获取</li></ul><ol></ol>下图展示了整个请求的概要过程:<br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.infoq.com/resource/articles/converting-struts-2-part1/en/resources/image1.jpg');}" alt="" src="http://www.infoq.com/resource/articles/converting-struts-2-part1/en/resources/image1.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br />整个请求过程可以分为六步骤:<br /><ol type="1"><li><i><b>一个请求产生并经由框架处理</b></i> - 框架根据请求匹配相应的配置，如使用哪些拦截器，action 类和结果。 
</li><li><i><b>请求通过一系列的拦截器</b></i> - 拦截器，和拦截器组经配置后，能处理不同等级的请求，它们为请求提供了各种预处理，切面处理。这和Struts的使用 Jakarta Commons Chain 构件的 RequestProcessor类很相似。 
</li><li><i><b>调用 Action </b></i>- 产生一个新的action对象实例，并提供请求所调用的处理逻辑的方法。Struts2 可以在配置action时为请求分配其指定的方法。我们在第二部文章中将对这步骤进行进一步讨论; 
</li><li><i><b>调用产生的结果 </b></i>- 获取通过action的方法处理后返回来的结果，匹配其result class并调用产生的实例。有种情况是在UI模板去生成HTML时才去处理这些结果。如果在这种情况下，在Struts2 模板中的tags能直接返回到 action 中，取结果来呈现界面。　 
</li><li><i><b>请求再次经过一系列的拦截器处理后返回</b></i> - 请求反顺序通过与原来进入时的拦截器链, 当然，你也可以配置在这个过程中减少或增加拦截器处理． 
</li><li><i><b>请求返回到用户 </b></i>- 最后一步是由 control 返回到servlet。通常是生成HTML返回到user, 但你也可以指定返回的HTTP头或HTTP重定向。 
<ul></ul></li></ol>你应该已注意到，Struts2与Struts的差别。最明显的就是Struts2是pull-MVC 架构，就是可以直接从Action中获取所需要的数据，而不是像Struts那样必须把 beans 存到page, request,或者session中才能获取。这个我们将在下一章中详细提及。<br /><br /><b><font size="3">配置框架</font></b><br />首先最重要的是，让框架能通过web.xml在servlet containers里运行。<br />下面这个就是大家都熟悉的 Struts在 web.xml里的配置方法<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code0'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code0">    <br />&lt;servlet&gt;<br />        &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />        &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;config&lt;/param-name&gt;<br />            &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        &lt;load-on-startup&gt;2&lt;/load-on-startup&gt;<br />    &lt;/servlet&gt;<br /><br />    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;</div><br />在 Struts2 中，这个有少许改变，最明显的是dispatcher 由servlet转为servlet filter, 其配置和servlet一样简单，如下：<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code1'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code1">    <br />　&lt;filter&gt;<br />        　&lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />        　　　&lt;filter-class&gt;<br />            org.apache.struts.action2.dispatcher.FilterDispatcher<br />　　　&lt;/filter-class&gt;<br />    &lt;/filter&gt;<br /><br />    &lt;filter-mapping&gt;<br />　　　&lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />　　　&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;</div><br />和servlet配置一样，filter配置定义了名称(供关联)和filter的类。filter mapping让URI匹配成功的的请求调用该filter。默认情况下，扩展名为".action"。<br />这个是在default.properties文件里的"struts.action.extension" 属性定义的。<br /><blockquote><b>工具箱</b>:  "default.properties"是配置选项定义文件。通过在classpath中包含一个叫"struts.properties"的文件，并设置不同的属性值，你可以覆盖这个默认的配置，实现自己的配置。</blockquote>对于Struts, servlet配置提供了初始化tag的参数和使用的文件，而Struts2没有这样的配置参数，取而代之的是在classpath下的默认配置文件"struts.xml"。<br /><blockquote><b>工具箱/提示</b>:　Struts actions(扩展名".do")，Struts2 actions(扩展名".action"),所以Struts和Struts2可以在一个系统中共存。所以最好是保持原先的系统，在新功能的开发上用Struts2,　如果时间和资源允许的情况下再逐步迁移。另一种方法是只是把Struts2的扩展名改为".do",可重用JSPs.</blockquote><font size="3"><b>分析Actions</b><br /></font>在上面介绍的请求运作流程中，我们谈及了一些Struts和Struts2的不同点。现在我们将较深入地探讨这两个框架中action结构的具体差别。<br />让我们来回顾一下 Struts 的 action 结构, 主要的形式如下：<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code2'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code2">public class MyAction extends Action {<br />    public ActionForward execute(ActionMapping mapping,<br />                                 ActionForm form,<br />                                 HttpServletRequest request,<br />                                 HttpServletResponse response)<br />            throws Exception {<br />        // do the work<br />        return (mapping.findForward("success"));<br />    }<br />}</div><br />当实现一个Struts action时, 你需要注意一下问题：<br /><ol type="1"><li>所有的action　都必须继承于base Action 类. 
</li><li>所有的action都必须是线程安全的,因为action是单例的,singleton的. 
</li><li>因为所有的action都必须是线程安全的,所以所有的对象都不能是类属性, 都必须以方法参数的形式传值。 
</li><li>调用action的方法必须命名为 "execute" ( 在Struts中的  DispatchAction 类好像可以用其它方法去执行同一个action ，但实际上在框架中调用的仍然是 "execute" 方法。). 
</li><li>ActionForward 的结果是通过ActionMapping 类中的方法来产生的,通常是"findForward"方法. 
<ul></ul></li></ol>相比较之下， Struts2的action　提供了很多简单的实现。下面就是个例子<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code3'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code3">public class MyAction {<br />   public String execute() throws Exception {<br />        // do the work<br />        return "success";<br />   }<br />}</div><br />首先你会注意到的是，Struts2中的action不再继承于任何类或需要实现任何接口。实际上，它还远不只这些。按照惯例，只有"execute"方法能调用action,　但在Struts2中并非必要，任何声明为public String methodName() 方法都能通过配置来调用action.<br />另外，你会注意到返回值不再是"ActionForward ",而是String, 如果你需喜欢String的形式，那在Action接口里有个帮助方法可以提供简单的结果常量，如"success", "none", "error", "input" 和 "login"。<br />最后，和Struts最大的革命性的不同是, 调用action不再是带参数的。那你如何在获得你所需要的值呢？答案是"inversion of control" 或 "dependency injection", 反转控制(想了解更多可以看Martin Fowler的文章 <a href="http://www.martinfowler.com/articles/injection.html" target="_blank"><font color="#0000ff">http://www.martinfowler.com/articles/injection.html</font></a>)。<br />为了更好地了解反转控制，让我们来看看一个例子，如何在action处理过程中可以访问到HttpServerRequest 。在我们的例子中，我们用ServletRequestAware 接口，这个接口包含了相应属性的setter,如下<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code4'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code4">public interface ServletRequestAware {<br />    public void setServletRequest(HttpServletRequest request);<br />}</div><br />当我们继承这个接口时，我们需要通过setter为我们的HttpServerRequest 属性变量赋值：<br /><br /><div class="msgheader"><div class="right"><a class="smalltxt" onclick="copycode($('code5'));" href="http://forum.springside.org.cn/viewthread.php?tid=157###">[Copy to clipboard]</a></div>CODE:</div><div class="msgborder" id="code5">public class MyAction implements ServletRequestAware {<br />   private HttpServletRequest request;<br />   public void setServletRequest(HttpServletRequest request) {<br />        this.request = request;<br />   }<br />   public String execute() throws Exception {<br />        // do the work using the request<br />        return Action.SUCCESS;<br />   }<br />}</div><br />看起来现在这些属性是类级别的，并不是线程安全的，但是在Struts2里并没有问题，因为每个请求过来的时候都会产生一个新的action对象实例，它并没有和其他请求共享一个对象，所以不需要考虑线程安全问题。<br /><br />现在我们还有最后一步，就是把action关联上<b>ServletConfigInterceptor</b> 拦截器。这个拦截器继承了<b>ServletRequestAware</b> 接口，并提供了把HttpServletRequest 注入到action中的功能。但是你现在不用担心如何配置这些，我们将在下一篇文章中具体讲述。最重要的是我们明白了拦截器和接口共同为action提供了反转控制的功能。<br />这个设计的好处是能让action完全和框架解耦。action仅仅是一个被框架使用的简单的POJO。这对于单元测试但来极大的好处， 你能方便的为Struts action实现 StrutsTestCase 或  MockStrutsTestCase　单元测试。<br /><br /><font size="3"><b>总结</b><br /></font>By到现在为止，你应该已经了解了Struts2的整个请求流程，还有高层的框架概念， 你也应该能自己动手配置Struts2的action，和讲出Struts和Struts2的差别了。<br />在下篇文章中，我们将会介绍一个详细的Struts应用向Struts2迁移的例子，同时我们也会介绍迁移中相关的知识，会讲述如何综合使用JSTL, JSP 和 Struts2，进一步讲述Struts和Struts2的action的差别，Struts2的配置和其他框架元素，和谈到更多的其他相关框架的特征。<br />(自<a href="http://www.infoq.com/" target="_blank">http://www.infoq.com/</a>, cac 翻译)<br /><img src ="http://www.blogjava.net/zlsunnan/aggbug/101690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-03-04 00:51 <a href="http://www.blogjava.net/zlsunnan/archive/2007/03/04/101690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Struts 2 GA </title><link>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101689.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Sat, 03 Mar 2007 16:49:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101689.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/101689.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2007/03/04/101689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/101689.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/101689.html</trackback:ping><description><![CDATA[Apache Struts 2 GA 版本发布了.<br /><br />这是Apache Struts 2 首次发行稳定的版本, GA意味着 General Availability , 也就是官方开始推荐广泛使用了.<br /><br />Struts2 GA版本的发布, 意味着核心开发力量将全部转移到Struts2, 对Struts1的支持将会淡化.<br /><br />下面列出了一些Struts1和Struts2的区别和对比:<br /><br />Action 类: <br />• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 <br />• Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作Struts2的Action对象。 <br /><br />线程模式: <br />• Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 <br />• Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题） <br /><br />Servlet 依赖: <br />• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 <br />• Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。 <br /><br />可测性: <br />• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。 <br />• Struts 2 Action可以通过初始化、设置属性、调用方法来测试，“依赖注入”支持也使测试更容易。 <br /><br />捕获输入: <br />• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm，开发者经常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。 <br />• Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。 <br /><br />表达式语言： <br />• Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。 <br />• Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL). <br /><br />绑定值到页面（view）: <br />• Struts 1使用标准JSP机制把对象绑定到页面中来访问。 <br />• Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 <br />　 <br />类型转换： <br />• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器，对每一个实例来说是不可配置的。 <br />• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。 <br /><br />校验： <br />• Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 <br />• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 <br /><br />Action执行的控制： <br />• Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 <br />• Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。 <br /><img src ="http://www.blogjava.net/zlsunnan/aggbug/101689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2007-03-04 00:49 <a href="http://www.blogjava.net/zlsunnan/archive/2007/03/04/101689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于struts国际化的一点尝试</title><link>http://www.blogjava.net/zlsunnan/archive/2006/02/27/32646.html</link><dc:creator>☆蓝色梦想☆</dc:creator><author>☆蓝色梦想☆</author><pubDate>Mon, 27 Feb 2006 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/zlsunnan/archive/2006/02/27/32646.html</guid><wfw:comment>http://www.blogjava.net/zlsunnan/comments/32646.html</wfw:comment><comments>http://www.blogjava.net/zlsunnan/archive/2006/02/27/32646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zlsunnan/comments/commentRss/32646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zlsunnan/services/trackbacks/32646.html</trackback:ping><description><![CDATA[<BR>1、修改web.xml文件，内容如下:<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<A href="http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">http://java.sun.com/j2ee/dtds/web-app_2_3.dtd</A>"&gt;<BR>&lt;web-app&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<BR><FONT style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;application&lt;/param-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;com.sharp.struts.ApplicationResources&lt;/param-value&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<BR>&lt;/web-app&gt;<BR><BR>文件中灰色背景部分为国际化需要增加的内容，其中<FONT style="BACKGROUND-COLOR: #d3d3d3">com.sharp.struts.ApplicationResources</FONT><FONT style="BACKGROUND-COLOR: #ffffff">跟你的WEB-INF目录下classes下的目录结构是一致的，如下图所示<BR><IMG height=544 alt=web-xml.jpg src="http://www.blogjava.net/images/blogjava_net/zlsunnan/web-xml.jpg" width=654 border=0><BR><BR></FONT>2、建立资源文件ApplicationResources.source(<FONT style="BACKGROUND-COLOR: #9acd32">中文源文件，而不是中文资源文件</FONT>)、ApplicationResources_en.properties(英文资源文件)。<BR>首先建立ApplicationResources_en.properties文件，内容如下：<BR><FONT style="BACKGROUND-COLOR: #d3d3d3">owner.greet=Greet<BR>owner.name=Name<BR>owner.address=Address<BR>owner.email=Email<BR>owner.tel=Tel<BR><BR><FONT style="BACKGROUND-COLOR: #ffffff">对应的中文源文件内容如下：<BR>owner.greet=称呼<BR>owner.name=姓名<BR>owner.address=地址<BR>owner.email=电子邮件<BR>owner.tel=联系电话<BR><BR>然后通过在cmd中执行native2ascii -encoding GBK ApplicationResources.source .\ApplicationResources_zh_CN.properties<BR>命令将中文源文件生成UTF-8格式的中文资源文件，内容如下<BR>owner.greet=\u79f0\u547c<BR>owner.name=\u59d3\u540d<BR>owner.address=\u5730\u5740<BR>owner.email=\u7535\u5b50\u90ae\u4ef6<BR>owner.tel=\u8054\u7cfb\u7535\u8bdd<BR>这里介绍一下，native2ascii是JDK包自带的一个工具，如果你不能cmd直接执行native2ascii命令，请检查你的环境变量，这里不具体介绍了。<BR><BR>3、接着来介绍一下struts-config.xml文件的内容，如果熟悉struts的朋友也觉得很简单的<BR>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<BR>&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "<A href="http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd</A>"&gt;<BR>&lt;struts-config&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Form Bean Definitions ================================== --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;form-beans&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-bean name="ownerForm" type="com.sharp.struts.form.OwnerForm"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="Email" type="java.lang.String" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="Greet" type="java.lang.String" initial="Mr." /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="Address" type="java.lang.String" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="Tel" type="java.lang.Integer" initial="0" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="Name" type="java.lang.String" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;/form-beans&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Exception Definitions ============================== --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;global-exceptions /&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Forward Definitions =============================== --&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;global-forwards&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="failure" path="/failure.jsp" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;/global-forwards&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Action Mapping Definitions =============================== --&gt;<BR>&nbsp;&nbsp;&nbsp; <FONT style="BACKGROUND-COLOR: #d3d3d3">&lt;action-mappings&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="ownerForm"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/owner.jsp"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="ownerForm"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/owner"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.sharp.struts.action.OwnerAction"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <FONT color=#0000ff>parameter="formAction"</FONT>&gt;&lt;!--因为action类继承DispatchAction类，所以需要设置这个属性--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="owner"&nbsp;&nbsp; path="/owner.jsp" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/success.jsp" /&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; &lt;/action-mappings&gt;<BR>&nbsp;&nbsp;&nbsp; <BR>&lt;/struts-config&gt;<BR><BR>4、现在就开始准备java和jsp文件吧<BR><STRONG>owner.jsp文件内容如下：</STRONG><BR>&lt;%@ page contentType="text/html;charset=gb2312" %&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%&gt; <BR>&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%&gt; <BR>&lt;html:html locale="true"&gt;<BR>&nbsp;&lt;head&gt;<BR>&nbsp;&nbsp;&lt;meta name = "Generator" content = "Easy Struts Xslt generator for Eclipse (<A href="http://easystruts.sf.net/">http://easystruts.sf.net</A>)."&gt;<BR>&nbsp;&nbsp;&lt;title&gt;Struts Form for ownerForm&lt;/title&gt;<BR>&nbsp;&nbsp;&lt;script language="javascript"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function changeLanguage(language) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(language == "en") {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.all("language").value = "en";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.all("language").value = "cn";<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.forms[0].submit();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&lt;/script&gt;<BR>&nbsp;&lt;/head&gt;<BR>&nbsp;&lt;body&gt;<BR>&nbsp;&nbsp;&lt;html:form action="/owner"&gt;<BR><FONT color=#0000ff>&nbsp;&nbsp;&lt;input type="hidden" name="formAction" value="changeLanguage"&gt;<BR>&nbsp;&nbsp;&lt;input type="hidden" name="language"&gt;</FONT><BR>&nbsp;&nbsp;&nbsp;&lt;bean:message key="owner.greet" /&gt; : &lt;html:select property="greet"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:option value=""&gt;&lt;/html:option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:option value="Mr."&gt;Mr.&lt;/html:option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:option value="Miss."&gt;Miss.&lt;/html:option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;html:option value="Mrs."&gt;Mrs.&lt;/html:option&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/html:select&gt;&lt;html:errors property="greet"/&gt;&lt;/br&gt;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;bean:message key="owner.name" /&gt; : &lt;html:text property="name"/&gt;&lt;html:errors property="name"/&gt;&lt;/br&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;bean:message key="owner.address" /&gt; : &lt;html:text property="address"/&gt;&lt;html:errors property="address"/&gt;&lt;/br&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;bean:message key="owner.email" /&gt; : &lt;html:text property="email"/&gt;&lt;html:errors property="email"/&gt;&lt;/br&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;bean:message key="owner.tel" /&gt; : &lt;html:text property="tel"/&gt;&lt;html:errors property="tel"/&gt;&lt;/br&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;html:submit/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;html:cancel/&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;input type="button" name="langEn" value="英文版" onclick="changeLanguage('en')"&gt;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;input type="button" name="langCn" value="中文版" onclick="changeLanguage('cn')"&gt;<BR>&nbsp;&nbsp;&lt;/html:form&gt;<BR>&nbsp;&lt;body&gt;<BR>&lt;/html:html&gt;<BR></FONT><BR><STRONG><FONT style="BACKGROUND-COLOR: #ffffff">OwnerAction.java文件内容如下：</FONT><BR></STRONG></FONT><FONT style="BACKGROUND-COLOR: #ffffff">// Created by Xslt generator for Eclipse.<BR>// XSL :&nbsp; not found (java.io.FileNotFoundException:&nbsp; (Bad file descriptor))<BR>// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl</FONT> 
<P><FONT style="BACKGROUND-COLOR: #ffffff">package com.sharp.struts.action;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff">import java.util.Locale;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff">import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff">import org.apache.struts.Globals;<BR>import org.apache.struts.action.Action;<BR>import org.apache.struts.action.ActionForm;<BR>import org.apache.struts.action.ActionForward;<BR>import org.apache.struts.action.ActionMapping;<BR>import org.apache.struts.actions.DispatchAction;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff">import com.sharp.struts.form.OwnerForm;</FONT></P>
<P><FONT style="BACKGROUND-COLOR: #ffffff">/** <BR>&nbsp;* OwnerAction.java created by EasyStruts - XsltGen.<BR>&nbsp;* </FONT><A href="http://easystruts.sf.net/"><FONT style="BACKGROUND-COLOR: #ffffff">http://easystruts.sf.net</FONT></A><BR><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;* created on 10-09-2004<BR>&nbsp;* <BR>&nbsp;* XDoclet definition:<BR>&nbsp;* @struts:action path="/owner" name="ownerForm" input="/owner.jsp" validate="true"<BR>&nbsp;* @struts:action-forward name="/success.jsp" path="/success.jsp"<BR>&nbsp;*/<BR>public class OwnerAction extends DispatchAction&nbsp;{</FONT><FONT style="BACKGROUND-COLOR: #ffffff"><BR>&nbsp;<BR>&nbsp;public ActionForward changeLanguage(<BR>&nbsp;&nbsp;ActionMapping mapping,<BR>&nbsp;&nbsp;ActionForm form,<BR>&nbsp;&nbsp;HttpServletRequest request,<BR>&nbsp;&nbsp;HttpServletResponse response) {<BR><BR></FONT><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;&nbsp;&nbsp;String language = request.getParameter("language");&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if (language.equals("en")) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.CHINESE);<BR>&nbsp;&nbsp;&nbsp;}</FONT><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return mapping.findForward("owner");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><FONT color=#0000ff><STRONG>这里需要注意一下，千万不要弄错，我在这里就花费了一个多小时，因为把文件名写错了<BR>Locale.ENGLISH是一个Locale对象，getLanguage()方法返回en，跟资源文件(ApplicationResources_<FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000>en</FONT>.properties)的后缀相同<BR></STRONG><FONT color=#000000><STRONG><FONT color=#0000ff>Locale.<FONT color=#0000ff>CHINESE</FONT>是一个Locale对象，getLanguage()方法返回zh，跟资源文件(ApplicationResources_</FONT><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff0000>zh<FONT color=#0000ff>_CN</FONT></FONT><FONT color=#0000ff>.properties)的后缀相同</FONT></STRONG></FONT></FONT><BR><BR><STRONG>另外还用到一个ownerForm.java文件，内容如下：</STRONG><BR>// Created by Xslt generator for Eclipse.<BR>// XSL :&nbsp; not found (java.io.FileNotFoundException:&nbsp; (Bad file descriptor))<BR>// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">package com.sharp.struts.form;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">import javax.servlet.http.HttpServletRequest;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">import org.apache.struts.action.ActionError;<BR>import org.apache.struts.action.ActionErrors;<BR>import org.apache.struts.action.ActionForm;<BR>import org.apache.struts.action.ActionMapping;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">/** <BR>&nbsp;* OwnerForm.java created by EasyStruts - XsltGen.<BR>&nbsp;* <A href="http://easystruts.sf.net/">http://easystruts.sf.net</A><BR>&nbsp;* created on 10-09-2004<BR>&nbsp;* <BR>&nbsp;* XDoclet definition:<BR>&nbsp;* @struts:form name="ownerForm"<BR>&nbsp;*/<BR>public class OwnerForm extends ActionForm {</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;// --------------------------------------------------------- Instance Variables</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;/** Email property */<BR>&nbsp;private String email;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;/** Greet property */<BR>&nbsp;private String greet = "Mr.";</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;/** Address property */<BR>&nbsp;private String address;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;/** Tel property */<BR>&nbsp;private int tel = 0;</FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;/** Name property */<BR>&nbsp;private String name;<BR></FONT></FONT><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">&nbsp;// --------------------------------------------------------- Methods<BR>......<BR>//getter,setter mothod，这里不赘列了<BR></FONT></FONT></P>
<P><FONT style="BACKGROUND-COLOR: #d3d3d3"><FONT style="BACKGROUND-COLOR: #ffffff">}<BR><BR>5、总结<BR>这样一个国际化的小例子就可以运行了，不过上面写得比较粗略，需要对java和struts有一定了解。<BR>网上对国际化也有其他的做法，也可以参考。<BR>如果上述有所偏颇，敬请斧正。<BR></FONT></FONT></P><img src ="http://www.blogjava.net/zlsunnan/aggbug/32646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zlsunnan/" target="_blank">☆蓝色梦想☆</a> 2006-02-27 14:51 <a href="http://www.blogjava.net/zlsunnan/archive/2006/02/27/32646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>