﻿<?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-风香园-文章分类-Struts</title><link>http://www2.blogjava.net/wuxufeng8080/category/18453.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 06 Jul 2007 09:48:37 GMT</lastBuildDate><pubDate>Fri, 06 Jul 2007 09:48:37 GMT</pubDate><ttl>60</ttl><item><title>struts2自定义forwardAction（动态映射）</title><link>http://www.blogjava.net/wuxufeng8080/articles/128502.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Fri, 06 Jul 2007 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/128502.html</guid><wfw:comment>http://www.blogjava.net/wuxufeng8080/comments/128502.html</wfw:comment><comments>http://www.blogjava.net/wuxufeng8080/articles/128502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wuxufeng8080/comments/commentRss/128502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wuxufeng8080/services/trackbacks/128502.html</trackback:ping><description><![CDATA[<p>在struts里面，如果要在action里面定义转向的话，可以返回一个ActionForward("xxx.jsp")</p>
<p>但在struts2里面，由于只能返回字符串，这个字符串是在配置文件中的result.　会产生一些困扰.　<br>只想出下面的解决方法.　正确的解决方法，寻找中...<br>解决这个问题的方法步骤：<br>1.在struts2的配置文件中，配置一个global-results，　如下.<br>&nbsp;&nbsp; &lt;global-result&gt;<br>&nbsp;&nbsp;&nbsp; &lt;result name="forwardURL" type="redirect"&gt;${forwardUrl}&lt;/result&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/global-results&gt;<br>&nbsp;&nbsp; 其中forwardUrl，即action中的forwardUrl的值</p>
<p>2.在action中定义一个String forwardUrl,　当要自定义转向时，给这个forwardUrl赋值，值为要转向的url，如："/aaa.jsp";<br>3.在action中返回 return "forwardURL";</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/128502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-07-06 09:59 <a href="http://www.blogjava.net/wuxufeng8080/articles/128502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中实现表单数据校验（Validation） (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117891.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117891.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: All Input Is Evil! -Writing secure code             在写前几篇文章的时候，有些朋友建议我的写一篇关于表单数据校验的文章。 正如文章的开头所引用的《Writing Secure Code》的名言：&#8220;所有的输入都是罪恶的&#8221;，所以我们应该对所有的外部输入进行校验。而表单是应用程序最简单的入口，对其传进来的数据...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/117891.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 17:14 <a href="http://www.blogjava.net/wuxufeng8080/articles/117891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中国际化(i18n)您的应用程序 (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117890.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 09:13:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117890.html</guid><description><![CDATA[<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class=entrylistItemTitle id=A1 href="http://www.blogjava.net/max/archive/2006/10/10/74353.html"><strong><font color=#1a8bc8>为Struts 2.0做好准备</font></strong></a>》）。 <br>
    <li>在src文件夹中加入struts.properties文件，内容如下： <br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">struts.custom.i18n.resources</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">globalMessages</span></div>
    <center>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=你</span><span style="COLOR: #000000">好，世界！</span></div>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br>
                <div style="PADDING-RIGHT: 36px; PADDING-LEFT: 36px">1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br>2、在Install/Update对话框中选择Search for new features to install，点击Next；<br>3、在Install对话框中点击New Remote Site；<br>4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br>5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br>6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br>7、点击Finish关闭对话框；<br>8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page &nbsp;contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello World</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:property </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="%{getText('HelloWorld')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp"><font color=#1a8bc8>http://localhost:8080/Struts2_i18n/HelloWorld.jsp</font></a> ，出现图1所示页面。<br><img alt="图1 中文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag2.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图1 中文输出</font></span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br><img alt="图2 英文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag1.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图2 英文输出</font></span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:textfield </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> label</span><span style="COLOR: #0000ff">="%{getText('UserName')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class=entrylistItemTitle id=CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl href="http://www.blogjava.net/max/archive/2006/10/18/75857.html"><strong><font color=#1a8bc8>常用的Struts 2.0的标志（Tag）介绍</font></strong></a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="http://www.blogjava.net/images/blogjava_net/max/16758/o_Search.jpg"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图3 资源文件查找顺序图</font></span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">validation.require</span><span style="COLOR: #000000">=</span><span style="MARGIN-BOTTOM: 8px; COLOR: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html"><font color=#1a8bc8>java.text.MessageFormat</font></a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">validation.between</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Date must between {</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short} and {</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br>
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #ff0000"> value0</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:param </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">s:text</span><span style="COLOR: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Hashtable;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Locale;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_116_345_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_345_Open_Text.style.display='none'; Codehighlighter1_116_345_Closed_Image.style.display='inline'; Codehighlighter1_116_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_116_345_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_345_Closed_Text.style.display='none'; Codehighlighter1_116_345_Open_Image.style.display='inline'; Codehighlighter1_116_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Locales </span><span id=Codehighlighter1_116_345_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_116_345_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_159_343_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_343_Open_Text.style.display='none'; Codehighlighter1_159_343_Closed_Image.style.display='inline'; Codehighlighter1_159_343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_159_343_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_343_Closed_Text.style.display='none'; Codehighlighter1_159_343_Open_Image.style.display='inline'; Codehighlighter1_159_343_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getLocales() </span><span id=Codehighlighter1_159_343_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_159_343_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> locales </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Hashtable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">American English</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.US);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Simplified Chinese</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.CHINA);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> locales;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<font size=1><span style="FONT-SIZE: smaller; FONT-STYLE: italic">tutorial/Locales.java</span><br><br></font>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> langSelecter_onChanged() {<br>&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br>&nbsp; &nbsp; }<br></span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="SESSION_LOCALE"</span><span style="COLOR: #ff0000"> value</span><span style="COLOR: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="locales"</span><span style="COLOR: #ff0000"> name</span><span style="COLOR: #0000ff">="tutorial.Locales"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form </span><span style="COLOR: #ff0000">action</span><span style="COLOR: #0000ff">="&lt;s:url includeParams="</span><span style="COLOR: #ff0000">get" encode</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">" name="langForm"&nbsp;<br>&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br>&nbsp; &nbsp; Language: </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:select </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Language"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="COLOR: #0000ff">="#locales.locales"</span><span style="COLOR: #ff0000"> listKey</span><span style="COLOR: #0000ff">="value"</span><span style="COLOR: #ff0000"> &nbsp; &nbsp;listValue</span><span style="COLOR: #0000ff">="key"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="COLOR: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="COLOR: #0000ff">="request_locale"</span><span style="COLOR: #ff0000"> id</span><span style="COLOR: #0000ff">="langSelecter"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="COLOR: #0000ff">="langSelecter_onChanged()"</span><span style="COLOR: #ff0000"> theme</span><span style="COLOR: #0000ff">="simple"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form</span><span style="COLOR: #0000ff">&gt;</span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>LangSelector.jsp</font></span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:include </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="/LangSelector.jsp"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/HelloWorld.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/{1}.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action"><font color=#1a8bc8>http://localhost:8080/Struts2_i18n/HelloWorld.action</font></a>，出现图4所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag3.gif"><br><font size=1><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图3 HelloWorld.action<br></span><br></font>在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag4.gif"><br><font size=1><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图4 HelloWorld.action</span><br></font>
<table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><font size=1><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></font></td>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br>你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117890.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 17:13 <a href="http://www.blogjava.net/wuxufeng8080/articles/117890.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换器（Converter）——Struts 2.0中的魔术师 (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117886.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117886.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在我已往的Struts 1.x项目经验中，有个问题不时的出现——在创建FormBean时，对于某个属性到底应该用String还是其它类型？开发Web应用程序与开发传统桌面应用程序不同，Web应用程序实际上是分布个不同的主机（当然也可以同一个主机，不过比较少见）上的两个进程之间互交。这种互交建立在HTTP之上，它们互相传递是都是字符串。换句话说， 服务器可以的接收到的来自用户的数据只能是字符串或...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/117886.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 17:04 <a href="http://www.blogjava.net/wuxufeng8080/articles/117886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现文件上传 (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117885.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117885.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。实现原理Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/117885.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 17:00 <a href="http://www.blogjava.net/wuxufeng8080/articles/117885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现IoC (ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117884.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117884.html</guid><description><![CDATA[<p>IoC(Inversion of Control，以下译为控制反转）随着Java社区中轻量级容器（Lightweight Contianer）的推广而越来越为大家耳熟能详。在此，我不想再多费唇舌来解释&#8220;什么是控制反转&#8221;和&#8220;为什么需要控制反转&#8221;。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。大家可以去读一下Rod Johnson和Juergen Hoeller合著的《<a href="http://www.wrox.com/books/0764558315.shtml"><font color=#1a8bc8>Expert one-on-one J2EE Development without EJB</font></a>》或Martin Fowler所写的《<a class=l onmousedown="return clk(0,'','','res','1','')" href="http://www.martinfowler.com/articles/injection.html" target=_blank><span style="COLOR: #0000cc">Inversion of Control Containers and the Dependency Injection pattern</span></a>》。</p>
<p>言归正传，本文的目的主要是介绍在Struts 2中实现控制反转。</p>
<h2>历史背景</h2>
<p>众所周知，Struts 2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本，其自身有一套控制反转的实现，Webwork 2.2在<a href="http://www.springframework.org/"><font color=#1a8bc8>Spring 框架</font></a>的如火如荼发展的背景下，决定放弃控制反转功能的开发，转由Spring实现。值得一提的是，Spring确实是一个值得学习的框架，因为有越来越多的开源组件（如<a href="http://ibatis.apache.org/"><font color=#1a8bc8>iBATIS</font></a>等）都放弃与Spring重叠的功能的开发。因此，Struts 2推荐大家通过Spring实现控制反转。</p>
<h2>具体实现</h2>
<p>首先，在开发环境中配置好Struts 2的工程。对这部分仍然有问题的朋友，请参考我的早前的文章。</p>
<p>然后，将所需的Spring的jar包加入到工程的构建环境（Build Path）中，如下图1所示：</p>
<p><img alt="图1 所依赖的Spring的jar包" src="http://www.blogjava.net/images/blogjava_net/max/18760/r_pic1.gif"> <br><span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>图1 所依赖的Spring的jar包</font></span> </p>
<p>本文使用的是Spring 2.0，Spring强烈建议大家在使用其jar包时，只引用需要的包，原因是Spring是一个功能非常强大的框架，其中有些功能是您不需要的；而且Spring提倡的是&#8220;按需所取&#8221;，而不是EJB的&#8220;爱我就要爱我的一切&#8221;。当然，如果你怕麻烦或者是不清楚每个包的作用，引用一个Spring的总包也未尝不可。</p>
<p>接下来，就要修改WEB-INF\web.xml文件了，内容为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span> <span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span> <span style="COLOR: #0000ff">?&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">web-app </span><span style="COLOR: #ff0000">version</span> <span style="COLOR: #0000ff">="2.4"</span> <span style="COLOR: #ff0000">xmlns</span> <span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span> <span style="COLOR: #ff0000"><br>&nbsp; &nbsp; xmlns:xsi</span> <span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="COLOR: #ff0000"><br>&nbsp; &nbsp; xsi:schemaLocation</span> <span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;<br>&nbsp; &nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">display-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">Struts 2 IoC Demo</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">display-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">struts-cleanup</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">struts2</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-mapping</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">struts-cleanup</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">url-pattern</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">/*</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">url-pattern</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-mapping</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-mapping</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">struts2</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-name</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">url-pattern</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">/*</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">url-pattern</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">filter-mapping</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">listener</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">listener-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; org.springframework.web.context.ContextLoaderListener<br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">listener-class</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">listener</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">welcome-file-list</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">welcome-file</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">index.html</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">welcome-file</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">welcome-file-list</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">web-app</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单1 WEB-INF\web.xml</font></span>
<p>大家一看便知道，主要是加入Spring的ContextLoaderListener监听器，方便Spring与Web容器交互。</p>
<p>紧接着，修改Struts.properties文件，告知Struts 2运行时使用Spring来创建对象（如Action等），内容如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">struts.objectFactory</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">spring</span> </div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单2 classes\struts.properties</font></span>
<p>再下来，遵循Spring的原则——面向接口编程，创建接口ChatService，代码如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">package</span> <span style="COLOR: #000000">tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">java.util.Set;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_71_102_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_102_Open_Text.style.display='none'; Codehighlighter1_71_102_Closed_Image.style.display='inline'; Codehighlighter1_71_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_71_102_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_102_Closed_Text.style.display='none'; Codehighlighter1_71_102_Open_Image.style.display='inline'; Codehighlighter1_71_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">interface</span> <span style="COLOR: #000000">ChatService </span><span id=Codehighlighter1_71_102_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_71_102_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;Set</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">getUserNames();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单3 tutorial.ChatService.java</font></span>
<p>然后，再创建一个默认实现ChatServiceImpl，代码如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">package</span> <span style="COLOR: #000000">tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">java.util.HashSet;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">java.util.Set;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_120_287_Open_Image onclick="this.style.display='none'; Codehighlighter1_120_287_Open_Text.style.display='none'; Codehighlighter1_120_287_Closed_Image.style.display='inline'; Codehighlighter1_120_287_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_120_287_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_120_287_Closed_Text.style.display='none'; Codehighlighter1_120_287_Open_Image.style.display='inline'; Codehighlighter1_120_287_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">ChatServiceImpl </span><span style="COLOR: #0000ff">implements</span> <span style="COLOR: #000000">ChatService </span><span id=Codehighlighter1_120_287_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_120_287_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_158_284_Open_Image onclick="this.style.display='none'; Codehighlighter1_158_284_Open_Text.style.display='none'; Codehighlighter1_158_284_Closed_Image.style.display='inline'; Codehighlighter1_158_284_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_158_284_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_158_284_Closed_Text.style.display='none'; Codehighlighter1_158_284_Open_Image.style.display='inline'; Codehighlighter1_158_284_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">Set</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">getUserNames() </span><span id=Codehighlighter1_158_284_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_158_284_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;Set</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">users </span><span style="COLOR: #000000">=</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">HashSet</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Max</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Scott</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;users.add(</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Bob</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">users;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> <br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单4 tutorial.ChatServiceImpl.java</font></span>
<p>接下来，就该新建Action了。tutorial.ChatAction.java的代码如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top> <span style="COLOR: #0000ff">package</span> <span style="COLOR: #000000">tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">java.util.Set;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span> <span style="COLOR: #0000ff">import</span> <span style="COLOR: #000000">com.opensymphony.xwork2.ActionSupport;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_135_529_Open_Image onclick="this.style.display='none'; Codehighlighter1_135_529_Open_Text.style.display='none'; Codehighlighter1_135_529_Closed_Image.style.display='inline'; Codehighlighter1_135_529_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_135_529_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_135_529_Closed_Text.style.display='none'; Codehighlighter1_135_529_Open_Image.style.display='inline'; Codehighlighter1_135_529_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">ChatAction </span><span style="COLOR: #0000ff">extends</span> <span style="COLOR: #000000">ActionSupport </span><span id=Codehighlighter1_135_529_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_135_529_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">final</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">long</span> <span style="COLOR: #000000">serialVersionUID </span><span style="COLOR: #000000">=</span> <span style="COLOR: #000000"></span><span style="COLOR: #000000">8445871212065L</span> <span style="COLOR: #000000">;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">ChatService chatService;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">private</span> <span style="COLOR: #000000">Set</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">userNames;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_323_360_Open_Image onclick="this.style.display='none'; Codehighlighter1_323_360_Open_Text.style.display='none'; Codehighlighter1_323_360_Closed_Image.style.display='inline'; Codehighlighter1_323_360_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_323_360_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_323_360_Closed_Text.style.display='none'; Codehighlighter1_323_360_Open_Image.style.display='inline'; Codehighlighter1_323_360_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">setChatService(ChatService chatService) </span><span id=Codehighlighter1_323_360_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_323_360_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">.chatService </span><span style="COLOR: #000000">=</span> <span style="COLOR: #000000">chatService;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;<br><img id=Codehighlighter1_399_422_Open_Image onclick="this.style.display='none'; Codehighlighter1_399_422_Open_Text.style.display='none'; Codehighlighter1_399_422_Closed_Image.style.display='inline'; Codehighlighter1_399_422_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_399_422_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_399_422_Closed_Text.style.display='none'; Codehighlighter1_399_422_Open_Image.style.display='inline'; Codehighlighter1_399_422_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">Set</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">String</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000">getUserNames() </span><span id=Codehighlighter1_399_422_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_399_422_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">userNames;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;@Override<br><img id=Codehighlighter1_462_525_Open_Image onclick="this.style.display='none'; Codehighlighter1_462_525_Open_Text.style.display='none'; Codehighlighter1_462_525_Closed_Image.style.display='inline'; Codehighlighter1_462_525_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_462_525_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_462_525_Closed_Text.style.display='none'; Codehighlighter1_462_525_Open_Image.style.display='inline'; Codehighlighter1_462_525_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">String execute() </span><span id=Codehighlighter1_462_525_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"> </span><span id=Codehighlighter1_462_525_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;userNames </span><span style="COLOR: #000000">=</span> <span style="COLOR: #000000">chatService.getUserNames();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">SUCCESS;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span> </span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span> </span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单5 tutorial.ChatAction.java</font></span>
<p>ChatAction类使用属性（Getter/Setter）注入法取得ChatService对象。</p>
<p>然后，配置Spring的applicationContext.xml（位于WEB-INF下）文件，内容如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;?</span> <span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span> <span style="COLOR: #0000ff">?&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">beans </span><span style="COLOR: #ff0000">xmlns</span> <span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans"</span> <span style="COLOR: #ff0000"><br>&nbsp; &nbsp; xmlns:xsi</span> <span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span> <span style="COLOR: #ff0000"><br>&nbsp; &nbsp; xsi:schemaLocation</span> <span style="COLOR: #0000ff">="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="chatService"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="tutorial.ChatServiceImpl"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="chatAction"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="tutorial.ChatAction"</span> <span style="COLOR: #ff0000">scope</span> <span style="COLOR: #0000ff">="prototype"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="chatService"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span> <span style="COLOR: #0000ff">="chatService"</span> <span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">property</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">bean</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">beans</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单6 WEB-INF\applicationContext.xml</font></span>
<p>上述代码有二点值得大家注意的：</p>
<ol>
    <li>Struts 2会为每一个请求创建一个Action对象，所以在定义chatAction时，使用scope="prototype"。这样Spring就会每次都返回一个新的ChatAction对象了；
    <li>因为ChatServiceImpl被配置为默认的scope（也即是singleton，唯一的），所以在实现时应保证其线程安全（关于编写线程安全的代码的讨论已经超出本文的范围，更超出了本人的能力范围，大家可以参考Addison Wesley Professional出版的《<a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601"><font color=#1a8bc8>Java Concurrency in Practice</font></a>》）。 </li>
</ol>
<p>接下来，在classes/struts.xml中配置Action，内容如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">&lt;!</span> <span style="COLOR: #ff00ff">DOCTYPE struts PUBLIC<br>&nbsp; &nbsp; &nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br>&nbsp; &nbsp; &nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">struts</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">file</span> <span style="COLOR: #0000ff">="struts-default.xml"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000">&nbsp; &nbsp;<br>&nbsp; &nbsp;&nbsp;<br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">package </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="Struts2_IoC"</span> <span style="COLOR: #ff0000">extends</span> <span style="COLOR: #0000ff">="struts-default"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="Chat"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="chatAction"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">result</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">/UserList.jsp</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">result</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">action</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">package</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">&nbsp; &nbsp;<br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">struts</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单7 classes\struts.xml</font></span>
<p>这里的Action和平常不同的就是class属性，它对应于Spring所定义的bean的id，而不是它的类全名。</p>
<p>最后，让我们看看/UserList.jsp，内容如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page contentType</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ taglib prefix</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">uri</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span> <span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">html</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">head</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">title</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">User List</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">title</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">head</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">body</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">h2</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000">User List</span> <span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">h2</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">ol</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">s:iterator </span><span style="COLOR: #ff0000">value</span> <span style="COLOR: #0000ff">="userNames"</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">li</span> <span style="COLOR: #0000ff">&gt;&lt;</span> <span style="COLOR: #800000">s:property </span><span style="COLOR: #0000ff">/&gt;&lt;/</span> <span style="COLOR: #800000">li</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">s:iterator</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">ol</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">body</span> <span style="COLOR: #0000ff">&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span> <span style="COLOR: #800000">html</span> <span style="COLOR: #0000ff">&gt;</span> </div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>清单8 /UserList.jsp</font></span>
<p>大功告成，分布运行应用程序，在浏览器中键入<a href="http://localhost:8080/Struts2_IoC/Chat.action"><font color=#1a8bc8>http://localhost:8080/Struts2_IoC/Chat.action</font></a>，出现如图2所示页面：</p>
<p><img alt="图2 /ListUser.jsp" src="http://www.blogjava.net/images/blogjava_net/max/18760/r_pic2.gif"> <br><span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>图2 /ListUser.jsp</font></span> </p>
<h2>总结</h2>
<p>通过Spring在Struts 2上实现控制反转是强烈推荐的做法，当然您也可以组合其它的实现（如Pico等）。</p>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 16:58 <a href="http://www.blogjava.net/wuxufeng8080/articles/117884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2的基石——拦截器（Interceptor）(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/117881.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Wed, 16 May 2007 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/117881.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 首先，要跟大家道个歉，前一阵子为给客户个一个DEMO，忙得不可开交，所以很久没有更新Blog。提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发，一个类似Struts 2这样的简单方便的WEB框架必不可少。我们在开发DEMO使用的还是Struts 1.2.8，而且没有不使用任何EL（表达式语言），导致页面出现无数类似&#8220;&lt;%= ((Integer) request....&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/117881.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/117881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2007-05-16 16:53 <a href="http://www.blogjava.net/wuxufeng8080/articles/117881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为Struts 2.0做好准备(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/90554.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 28 Dec 2006 09:52:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/90554.html</guid><description><![CDATA[
		<p>Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到用广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：</p>
		<ul>
				<li>MVC 2模型的使用 
</li>
				<li>功能齐全的标志库（Tag Library） 
</li>
				<li>开放源代码 </li>
		</ul>
		<p>但是，所谓“金无赤金，人无完人”，Struts自身也有不少的缺点：</p>
		<ul>
				<li>需要编写的代码过多，容易引起“类爆炸” 
</li>
				<li>单元测试困难 </li>
		</ul>
		<p>这些缺点随着Web的发展越来越明显。这就促生了Struts 2.0，它的诞生能很好的解决上述问题。 好啦，废话就不多说了，现在就让我们感受一下的Struts 2.0的魅力吧。</p>
		<ol>
				<li>搭建开发和运行环境 
<ol><li>到Apache下载Struts 2.0包 
<p><img id="IMG1" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image001.png" /></p></li><li>打开Eclipse 3.2新建Web工程 
<p>点击菜单File\New\Project，出现如图1所示对话框<br /><img id="IMG2" alt="图1 新建工程对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image003.png" /><br />图1 新建工程对话框<br />选择Web\Dynamic Web Project，点击“Next”，出现图2对话框 </p><p><img id="IMG3" alt="图2 新建动态Web工程对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image005.png" /><br />图2 新建动态Web工程对话框<br />在“Project Name”中键入Struts2_HelloWorld，点击“New”，出现以下对话框 </p><p><img id="IMG4" alt="图3 新建服务器运行时对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image007.png" /><br />图3 新建服务器运行时对话框<br />选择“Apache\Apache Tomat v5.5”，点击“Next”，出现以下对话框 </p><p><img id="IMG5" alt="图4新建服务器运行时对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image009.png" /><br />图4新建服务器运行时对话框<br />点击“Finish”，关闭对话框。 </p></li><li>将Struts 2.0 lib下的jar文件加到工程的构建路径（build path） 
<p><img id="IMG6" alt="图5 Struts 2.0的lib目录" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image011.png" /><br />图5 Struts 2.0的lib目录<br />按ctr+a全选，复制，再转到Eclipse窗口，在“Project Explorer”子窗口中选中Struts2_HelloWorld\WebContent\WEB-INF\lib，然后粘贴。经过Eclipse自动刷新“Project Explorer”子窗口，刚才所粘贴的jar文件应该会出现在Struts2_HelloWorld\Java Resources: src\Libraries\Web App Libraries下，如图6所示： </p><p><img id="IMG7" alt="图6 Project Explorer子窗口" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image013.png" /><br />图6 Project Explorer子窗口<br /></p></li><li>打开web.xml文件，将其修改为以下代码： 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="ISO-8859-1"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Struts 2.0 Hello World</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">struts2</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.apache.struts2.dispatcher.FilterDispatcher</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">struts2</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">filter-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">index.html</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>新建struts.xml文件 
<p>右键点击，Struts2_HelloWorld\Java Resources: src，出现如图7所示菜单<br /><img id="IMG8" alt="图7 新建Other菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image015.png" /><br />图7 新建Other菜单<br />点击“Other”，出现新建对话框，如图8所示 </p><p><img id="IMG9" alt="图8 新建对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image017.png" /><br />图8 新建对话框<br />点击“Next”，出现新建文件对话框，如图9所示 </p><p><img id="IMG10" alt="图9 新建文件对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image019.png" /><br />图9 新建文件对话框<br />在“File name”中键入sturts.xml，点击“Finish”，然后将struts.xml的内容修改为：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE struts PUBLIC<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">struts</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">file</span><span style="COLOR: #0000ff">="struts-default.xml"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">struts</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>新建index.html文件 
<p>右键点击Struts2_HelloWorld\WebContent，出现如图10所示的菜单<br /><img id="IMG11" alt="图10 新建Other菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image021.png" /><br />图10 新建Other菜单<br />点击“Other”，出现新建对话框，如图11所示 </p><p><img id="IMG12" alt="图11 新建对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image023.png" /><br />图11 新建对话框<br />选择Web\HTML，点击“Next”出现如图12所示的对话框 </p><p><img id="IMG13" alt="图12 新建HTML页面对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image025.png" /><br />图12 新建HTML页面对话框<br />在“File Name”中键入index.html，点击“Next”，出现如图13所示的对话框 </p><p><img id="IMG14" alt="图13 模板选择对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image027.png" /><br />图13 模板选择对话框<br />点击“Finish”，将index.html的内容修改为以下内容：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">meta </span><span style="COLOR: #ff0000">http-equiv</span><span style="COLOR: #0000ff">="Content-Type"</span><span style="COLOR: #ff0000"> content</span><span style="COLOR: #0000ff">="text/html; charset=UTF-8"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello World</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello World!</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>将应用程序打包到tomcat上 
<p>右键点击Struts_HelloWorld，出现如图14所示的菜单<br /><img id="IMG15" alt="图14 工程菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image029.png" /><br />图14 工程菜单<br />点击“Export\WAR file”，出现如图15所示的对话框 </p><p><img id="IMG16" alt="图15 输出对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image031.png" /><br />图15 输出对话框<br />选择“Web\WAR file”，点击“Next”，出现如图16所示的对话框 </p><p><img id="IMG17" alt="图16 输出路径对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image033.png" /><br />图16 输出路径对话框<br />输入war文件的路径（如%tomcat%\webapps\Struts2_HelloWorld.war），点击“Finish”关闭对话框。 </p></li><li>启动tomcat，运行应用程序 
<p>打开你的Internet Explorer，键入http://localhost:8080/Struts2_HelloWorld/，窗口输出如图17所示<br /><img id="IMG18" alt="图17 Hello World窗口" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image035.png" /><br />图17 Hello World窗口<br /></p></li></ol></li>
				<li>第一个Struts 2.0应用程序——Hello World 
<ol><li>新建类包（package） 
<p>右键点击Struts2_HelloWorld\Java Resources: src，出现如图18所示菜单<br /><img id="IMG19" alt="图18 新建菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image037.png" /><br />图18 新建菜单"<br />点击“New\Package”，出现如图19所示对话框<br /></p><p><img id="IMG20" alt="图19新建Java类包对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image039.png" /><br />图19新建Java类包对话框<br />在“Name”键入tutorial，点击“Finish”关闭对话框。 </p></li><li>新建HelloWorld.java文件 
<p>右键点击Struts2_HelloWorld\Java Resources: src\tutorial，出现如图20所示菜单<br /><img id="IMG21" alt="图20 新建菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image041.png" /><br />图20 新建菜单<br />点击“New\Class”，出现如图21所示对话框 </p><p><img id="IMG22" alt="图21 新建Java类对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image043.png" /><br />图21 新建Java类对话框<br />在“Name”中键入HelloWorld，在“Superclass”中键入com.opensymphony.xwork2.ActionSupport，点击“Finish”关闭对话框。将HelloWorld.java的内容修改为：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> tutorial;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.opensymphony.xwork2.ActionSupport;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_112_328_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_328_Open_Text.style.display='none'; Codehighlighter1_112_328_Closed_Image.style.display='inline'; Codehighlighter1_112_328_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_112_328_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_112_328_Closed_Text.style.display='none'; Codehighlighter1_112_328_Open_Image.style.display='inline'; Codehighlighter1_112_328_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> HelloWorld </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> ActionSupport </span><span id="Codehighlighter1_112_328_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_112_328_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> String name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_163_181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_163_181_Open_Text.style.display='none'; Codehighlighter1_163_181_Closed_Image.style.display='inline'; Codehighlighter1_163_181_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_163_181_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_163_181_Closed_Text.style.display='none'; Codehighlighter1_163_181_Open_Image.style.display='inline'; Codehighlighter1_163_181_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String getName() </span><span id="Codehighlighter1_163_181_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_163_181_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_219_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_242_Open_Text.style.display='none'; Codehighlighter1_219_242_Closed_Image.style.display='inline'; Codehighlighter1_219_242_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_219_242_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_219_242_Closed_Text.style.display='none'; Codehighlighter1_219_242_Open_Image.style.display='inline'; Codehighlighter1_219_242_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setName(String name) </span><span id="Codehighlighter1_219_242_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_219_242_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> name;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_271_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_271_326_Open_Text.style.display='none'; Codehighlighter1_271_326_Closed_Image.style.display='inline'; Codehighlighter1_271_326_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_271_326_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_271_326_Closed_Text.style.display='none'; Codehighlighter1_271_326_Open_Image.style.display='inline'; Codehighlighter1_271_326_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String execute() </span><span id="Codehighlighter1_271_326_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_271_326_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> name </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> SUCCESS;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p></p></li><li>在struts.xml中添加action映射(mapping)<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE struts PUBLIC<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">struts</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include </span><span style="COLOR: #ff0000">file</span><span style="COLOR: #0000ff">="struts-default.xml"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">package </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="tutorial"</span><span style="COLOR: #ff0000"> extends</span><span style="COLOR: #0000ff">="struts-default"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="tutorial.HelloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">HelloWorld.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">package</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">struts</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>新建SayHello.jsp 
<p>参考“新建index.html文件”步骤，弹出如图22所示对话框<br /><img id="IMG23" alt="图22 新建对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image045.png" /><br />图22 新建对话框<br />点击“Next”, 进入下一步，如图23所示 </p><p><img id="IMG24" alt="图23 新建JSP对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image047.png" /><br />图23 新建JSP对话框<br />在“File name”键入SayHello.jsp，点击“Next”进入下一步，如图24所示 </p><p><img id="IMG25" alt="图24 模板选择对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image049.png" /><br />图24 模板选择对话框<br />点击“Finish”关闭对话框，并将SayHello.jsp的内容修改为：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_2_47_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_47_Open_Text.style.display='none'; Codehighlighter1_2_47_Closed_Image.style.display='inline'; Codehighlighter1_2_47_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_47_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_47_Closed_Text.style.display='none'; Codehighlighter1_2_47_Open_Image.style.display='inline'; Codehighlighter1_2_47_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_2_47_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2_47_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_53_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_91_Open_Text.style.display='none'; Codehighlighter1_53_91_Closed_Image.style.display='inline'; Codehighlighter1_53_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_53_91_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_91_Closed_Text.style.display='none'; Codehighlighter1_53_91_Open_Image.style.display='inline'; Codehighlighter1_53_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_53_91_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_53_91_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Say Hello</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Say "Hello" to: </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:form </span><span style="COLOR: #ff0000">action</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            Name: </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:textfield </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:submit </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">s:form</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>新建HelloWorld.jsp(请参考上一步)，HelloWorld.jsp的内容为：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_2_47_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_47_Open_Text.style.display='none'; Codehighlighter1_2_47_Closed_Image.style.display='inline'; Codehighlighter1_2_47_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_47_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_47_Closed_Text.style.display='none'; Codehighlighter1_2_47_Open_Image.style.display='inline'; Codehighlighter1_2_47_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_2_47_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2_47_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_53_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_91_Open_Text.style.display='none'; Codehighlighter1_53_91_Closed_Image.style.display='inline'; Codehighlighter1_53_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_53_91_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_91_Closed_Text.style.display='none'; Codehighlighter1_53_91_Open_Image.style.display='inline'; Codehighlighter1_53_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_53_91_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_53_91_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:property </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h3</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div><p></p></li><li>重新打包发布应用程序 
<p>先停止tomcat, 再将tomcat里webapps下的Struts2_HelloWorld.war和Struts2_HelloWorld文件夹删除，参照“将应用程序打包到tomcat上”重新发布应用程序。 </p></li><li>启动tomcat，运行测试 
<p>打开Internet Explorer，键入http://localhost:8080/Struts2_HelloWorld/SayHello.jsp，窗口输出如图25所示<br /><img id="IMG26" alt="图25 SayHello.jsp" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image051.png" /><br />图25 SayHello.jsp<br />在“Name”键入字符串（如World），点击Submit，转到HelloWorld.jsp页面，如图26所示 </p><p><img id="IMG27" alt="图26 HelloWorld.jsp" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image053.png" /><br />图26 HelloWorld.jsp<br /></p></li></ol></li>
				<li>单元测试Hello World 
<p>在文章开始的时候提及，单元测试困难是Struts一大缺点。现在让我们在体验一下，在Struts 2.0中是如何进行测试的。</p><ol><li>新建JUnit单元测试 
<p>右键点击Struts2_HelloWorld\Java Resources: src\tutorial，弹出如图27所示对话框<br /><img id="IMG28" alt="图27 新建菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image055.png" /><br />图27 新建菜单<br />点击“Next\Other” </p><p><img id="IMG29" alt="图28 新建对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image057.png" /><br />图28 新建对话框<br />选择“Java\JUnit\JUnit Test Case”，点击“Next” </p><p><img id="IMG30" alt="图29 新建JUnit 测试用例对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image059.png" /><br />图29 新建JUnit 测试用例对话框<br />选择“New JUnit 4 test”，在“Name”中键入HelloWorldTest，在“Class under test”键入tutorial.HelloWorld，点击“Next” </p><p><img id="IMG31" alt="图30 选择方法对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image061.png" /><br />图30 选择方法对话框<br />选中HelloWorld\execute方法，点击Finish。如果生成的HelloWorldTest.java文件的图标（Icon）出现红色交叉标志，请进行以下步骤添加JUnit 4的jar包。 </p><p>右键点击Struts2_HelloWorld，出现如图所示菜单。 <img id="IMG32" alt="图31 新建菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image063.png" /><br />图31 新建菜单<br />点击“Build Path\Add Libararis”，弹出图32对话框 </p><p><img id="IMG33" alt="图32 添加库对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image065.png" /><br />图32 添加库对话框<br />选中“JUnit”，点击“Next” </p><p><img id="IMG34" alt="图33 选择版本对话框" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image067.png" /><br />图33 选择版本对话框<br />选择“JUnit 4”，点击“Finish”关闭对话框，并将HelloWorldTest.java的内容修改为：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> tutorial;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> org.junit.Assert.assertTrue;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.junit.Test;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.opensymphony.xwork2.ActionSupport;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_162_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_162_507_Open_Text.style.display='none'; Codehighlighter1_162_507_Closed_Image.style.display='inline'; Codehighlighter1_162_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_162_507_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_162_507_Closed_Text.style.display='none'; Codehighlighter1_162_507_Open_Image.style.display='inline'; Codehighlighter1_162_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> HelloWorldTest </span><span id="Codehighlighter1_162_507_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_162_507_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    @Test<br /><img id="Codehighlighter1_199_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_199_504_Open_Text.style.display='none'; Codehighlighter1_199_504_Closed_Image.style.display='inline'; Codehighlighter1_199_504_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_199_504_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_199_504_Closed_Text.style.display='none'; Codehighlighter1_199_504_Open_Image.style.display='inline'; Codehighlighter1_199_504_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> testExecute() </span><span id="Codehighlighter1_199_504_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_199_504_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        HelloWorld hello </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HelloWorld();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        hello.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">World</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String result </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> hello.execute();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assertTrue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Expected a success result!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, ActionSupport.SUCCESS.equals(result));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> String msg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello, World!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assertTrue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Expected the default message!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, msg.equals(hello.getName()));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p></p></li><li>运行单元测试 
<p>右键点击Struts2_HelloWorld\Java Resources: src\tutorial\HelloWorldTest.java，弹出如图34所示菜单<br /><img id="IMG35" alt="图34 运行为菜单" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image069.png" /><br />图34 运行为菜单<br />点击“Run As\JUnit Test”，出现JUnit子窗口如图35所示 </p><p><img id="IMG36" alt="图35 JUnit子窗口" src="http://www.blogjava.net/images/blogjava_net/max/16101/o_image071.png" /><br />图35 JUnit子窗口<br />图35的绿色矩形表示，所有单元测试通过。 </p></li></ol></li>
				<li>总结 
<p>上面的例子简单地演示了，Web 应用程序的基本操作，也即是，页面输入-&gt;Action处理-&gt;再输出到另外页面。Struts 2.0的简单易用、方便测试相信也会给大家留下不错的印象吧。我相信，Struts 2.0作为一个全新的Web架构，将会再次掀起Web开发的热潮。 不过，Struts 2.0还在测试中，正式版的发布还需些时日，所以文档方面可能有所欠缺。请大家继续留意<a href="/max"><font color="#1a8bc8">我的博客</font></a>，我会尽我所能为大家写更多关于Struts 2.0的文章。</p></li>
		</ol>
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/90554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-28 17:52 <a href="http://www.blogjava.net/wuxufeng8080/articles/90554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0的标志（Tag）介绍(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/90553.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 28 Dec 2006 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/90553.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇文章《为Struts 2.0做好准备》中，我过于详细地介绍了Struts 2.0开发环境和运行环境的配置，所以，本文很少涉及的以上两方面的细节。如果，您看完《为Struts 2.0做好准备》后，还有什么不明白，或者没法运行文中例子，请联系我。我的E-MAIL：Max.M.Yuan@gmail.com。		在介绍常用标志前，我想先从总体上，对Struts 1.x与Struts 2.0的标...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/90553.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/90553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-28 17:51 <a href="http://www.blogjava.net/wuxufeng8080/articles/90553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0的Action讲解(ZT)</title><link>http://www.blogjava.net/wuxufeng8080/articles/90552.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Thu, 28 Dec 2006 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/90552.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有Struts 1.x经验的朋友都知道Action是Struts的核心内容，当然Struts 2.0也不例外。不过，Struts 1.x与Struts 2.0的Action模型很大的区别。																														 										Struts 1.x										Stuts 2.0																...&nbsp;&nbsp;<a href='http://www.blogjava.net/wuxufeng8080/articles/90552.html'>阅读全文</a><img src ="http://www.blogjava.net/wuxufeng8080/aggbug/90552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-28 17:50 <a href="http://www.blogjava.net/wuxufeng8080/articles/90552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SpringSide的Struts封装</title><link>http://www.blogjava.net/wuxufeng8080/articles/88165.html</link><dc:creator>风人园</dc:creator><author>风人园</author><pubDate>Sat, 16 Dec 2006 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/wuxufeng8080/articles/88165.html</guid><description><![CDATA[
		<h1>
				<a name="SpringSideStruts-SpringSide%E7%9A%84Struts%E5%B0%81%E8%A3%85">
				</a>SpringSide的Struts封装</h1>
		<h2>
				<a name="SpringSideStruts-1.%E6%A6%82%E8%BF%B0%26nbsp%3B">
				</a>1.概述 </h2>
		<p>   SpringSide对Struts做了两层封装：</p>
		<p>   第一层：StrutsAction，继承于DispatchAction，附带一些Utils函数，另外注册了几个Converter。</p>
		<p>   第二层：StruttsEntityAction，继承于StrutsAction， 演示了如何为单个对象的CRUD操作(增删改查)封装了默认Action，子类只需要范型声明所管理的对象类型和管理类型，即拥有CRUD操作的能力。</p>
		<p>    大家各自项目的习惯不同，流程，可以参考SpringSide的封装，封装自己的版本。</p>
		<p>    <b>典型子类代码如下：</b></p>
		<div class="code">
				<div class="codeContent">
						<pre class="code-java">
								<span class="code-keyword">public</span> class UserAction <span class="code-keyword">extends</span> StrutsEntityAction&lt;User,UserManager&gt; {
     <span class="code-keyword">private</span> UserManager userManager;
     <span class="code-keyword">public</span> void setUserManager(UserManager userManager) {
           <span class="code-keyword">this</span>.userManager = userManager;
     }
   }</pre>
				</div>
		</div>
		<p>   第一 extends StrutsEntityAction&lt;User,UserManager&gt;，声明管理的Entity类型是User，管理的Entity是UserManager,UserManager必须实现EntityDao&lt;T&gt;接口;<br />   第二 定义userManager用于依赖注入的setter函数;</p>
		<h2>
				<a name="SpringSideStruts-2.%E5%8E%9F%E7%90%86">
				</a>2.原理</h2>
		<p>     StrutsEntityAction 会持有一个EntityDao接口的实体来做CRUD的操作，子类通过在泛型中声明UserAction&lt;User, UserManager&gt;，自动查找属性中类型为UserManager的属性作为EntityDao。如果子类有多个UserManager属性(很少的情况)，就需自行实现getEntityManager()函数。</p>
		<p>     CRUD现在主要封装了list、edit、view、save、delete 5个流程，一般会调用doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity 5个业务函数去做相应的业务操作。</p>
		<p>     在controller中很重要的request 数据与POJO的转换，由initEntity、initForm  两个函数完成。</p>
		<p>     initEntity 先调用bindObject 函数用BeanUtils 直接copy lazyBean的FormBean 和 Entity POJO，然后调用子类的onInitEntity()函数。initForm是同样的原理。</p>
		<p>     通常还有一些辅助的对象，比如Book 修改页要有Category列表做下拉选择框，这些辅助对象统一子类重载onRefrence()函数放入request.attributes.</p>
		<h2>
				<a name="SpringSideStruts-3.%E6%89%A9%E5%B1%95%E4%B8%8E%E5%AE%A2%E6%88%B7%E5%8C%96">
				</a>3.扩展与客户化</h2>
		<p>   EntityAction必须预留足够的扩展点给子类重载，具体函数注释见<span class="nobr"><a title="Visit page outside Confluence" href="http://www.springside.org.cn/docs/api/org/springside/core/web/StrutsEntityAction.html" rel="nofollow">StrutsEntityAction的JavaDoc<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span>， 包括：</p>
		<p>    1.list、edit、view、save、delete： 五种action的流程封装；<br />   2.doListEntity、doGetEntity、doNewEntity、doSaveEntity(),doDeleteEntity： 五种业务函数调用；<br />   3.initEntity、initForm ： FormBean与业务对象的初始化函数及refrenceData,onInitForm,onInitEntity 三个回调函数；<br />   4.savedMessage、deletedMessage： 两种业务操作成功后显示的信息的回调函数。</p>
		<p>  几个回调函数在子类重载，而如果几个封装函数不合心意，请重新扩展一个基类或完全重新封装。 </p>
		<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
    rdf:about="http://wiki.springside.org.cn/display/springside/SpringSide+Struts"
    dc:identifier="http://wiki.springside.org.cn/display/springside/SpringSide+Struts"
    dc:title="SpringSide Struts"
    trackback:ping="http://wiki.springside.org.cn/rpc/trackback/788"/>
</rdf:RDF>
-->
		<!--
    Root decorator: all decisions about how a page is to be decorated via the
                    inline decoration begins here.
-->
		<!--
    Switch based upon the context. However, for now, just delegate to a decorator
    identified directly by the context.
-->
<img src ="http://www.blogjava.net/wuxufeng8080/aggbug/88165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wuxufeng8080/" target="_blank">风人园</a> 2006-12-16 14:35 <a href="http://www.blogjava.net/wuxufeng8080/articles/88165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>