﻿<?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-『Ben狐狸』</title><link>http://www.blogjava.net/benfox/</link><description>自信、奉献、快乐</description><language>zh-cn</language><lastBuildDate>Sun, 21 Jun 2026 16:40:02 GMT</lastBuildDate><pubDate>Sun, 21 Jun 2026 16:40:02 GMT</pubDate><ttl>60</ttl><item><title>VTL参考指南</title><link>http://www.blogjava.net/benfox/articles/220963.html</link><dc:creator>Ben狐狸</dc:creator><author>Ben狐狸</author><pubDate>Fri, 08 Aug 2008 11:12:00 GMT</pubDate><guid>http://www.blogjava.net/benfox/articles/220963.html</guid><wfw:comment>http://www.blogjava.net/benfox/comments/220963.html</wfw:comment><comments>http://www.blogjava.net/benfox/articles/220963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/benfox/comments/commentRss/220963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/benfox/services/trackbacks/220963.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">1</span><span style="font-family: 宋体">关于本指南</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">本指南是VTL(Velocity Template Language)的参考文档。至于更多信息，请查阅Velocity用户手册(Velocity User Guide)</span></p>
<p><span style="font-family: 宋体">2</span><span style="font-family: 宋体">语法参考</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">2.1</span><span style="font-family: 宋体">变量</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">符号：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">$[!][{][a..z,A..Z][a..z,A..Z,0-9,-,_][]]</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">大家对上面的表示不知道清楚不清楚，我这儿给大家描述一边，以后类似的表述都是这样。&#8220;[]&#8221;表示可选项，意为可有可无。通过上面的表述可以看出变量一个必写项和若干个可选项组成。其中$是必写项，其余的都是可选项。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;一般符号：$mud-slinger_9</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;静态符号：$!mud_slinger_9</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;正式符号：${mud_slinger_9}</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">2.2</span><span style="font-family: 宋体">属性</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">符号：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">$[{][a..z,A..Z][a..z,A..z,0..9,-,_]*.[a..z,A..Z][a..z,A..Z,0..9,-,_]*[}]</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;一般符号：$customer.Address</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;正式符号：${purchase.Total}</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">2.3</span><span style="font-family: 宋体">方法</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">符号：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">$[{][a..z,A..Z][a..z,A..Z,0..9,-,_]*.[a..z,a..Z][a..z,A..Z,0..9,-,_]*([</span><span style="font-family: 宋体">可选参数列表&#8230;])[}]</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;一般符号：$customer.getAddress()</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;正式符号：${puchase.getTotal()}</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;带有参数列表的一般符号：$page.setTile(&#8220;My Home Paget&#8221;)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">VTL</span><span style="font-family: 宋体">属性值表示的简短使用代替了VTL方法表示中的get和set方法。例如,$object.getMethod()或者$object.setMethod()使用VTL属性值表示可将其简化为$object.Method。在使用时这样表示方法通常更加便捷的。属性值表示和方法表示最主要的区别在于是否有传递的参数，如果有参数则需要是用方法表示，如果没有参数就可以直接使用属性值表示。</span></p>
<p><span style="font-family: 宋体">3</span><span style="font-family: 宋体">指令</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">3.1#set-</span><span style="font-family: 宋体">确立变量、属性、方法的值</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">格式：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">#[{] set[}]($ref=[&#8220;,&#8217;]arg[&#8221;,&#8217;])</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">用法：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;$ref-等号左边必须是一个变量或者属性值</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;$arg-等号右边的arg可以用双引号或者单引号组成的字符串或者字符。如果等号右边是NULL，那等号左边将无法被赋值。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;变量：#set($monkey=$bill)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;字符串：#set($monkey.Friend=&#8217;monica&#8217;)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;属性值：#set($monkey.Blame=$whitehouse.Leak)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;方法：#set($monkey.Plan=$spindoctor.weave($web))</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;一般：#set($monkey.Number=123)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;列表：#set($monkey.Numbers=[1..3])</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;数组：#set($monkey.Say=[&#8220;Not&#8221;,$my,&#8221;fault&#8221;])</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">等式右边也可以是一个简单的算术表达式，例如：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;加法：#set($value=$foo+1)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;减法：#set($value=$bar-1)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;乘法：#set($value=$foo*$bar)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;除法：#set($value=$foo/$bar)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;求余：#set($value=$foo%$bar)</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">3.2#if/#elseif/#else-</span><span style="font-family: 宋体">条件判断</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">格式：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">#[{]if[}]([</span><span style="font-family: 宋体">判断条件])[输出内容][#[{ ]elseif[ }]([判断条件])[输出内容]]*[# [{ ]else[ }]([判断条件])[输出内容]]# [{ ]end[ }]</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<table style="margin-left: -1.25pt; width: 100%" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="border-right: white 1pt solid; padding-right: 1.25pt; border-top: white 1pt solid; padding-left: 1.25pt; background: #039acc; padding-bottom: 1.25pt; border-left: white 1pt solid; padding-top: 1.25pt; border-bottom: white 1pt solid" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><strong><span style="color: black; font-family: 宋体">Operator Name</span></strong></p>
            </td>
            <td style="border-right: white 1pt solid; padding-right: 1.25pt; border-top: white 1pt solid; padding-left: 1.25pt; background: #039acc; padding-bottom: 1.25pt; border-left: white 1pt solid; padding-top: 1.25pt; border-bottom: white 1pt solid" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><strong><span style="color: black; font-family: 宋体">Symbol</span></strong></p>
            </td>
            <td style="border-right: white 1pt solid; padding-right: 1.25pt; border-top: white 1pt solid; padding-left: 1.25pt; background: #039acc; padding-bottom: 1.25pt; border-left: white 1pt solid; padding-top: 1.25pt; border-bottom: white 1pt solid" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><strong><span style="color: black; font-family: 宋体">Alternative Symbol</span></strong></p>
            </td>
            <td style="border-right: white 1pt solid; padding-right: 1.25pt; border-top: white 1pt solid; padding-left: 1.25pt; background: #039acc; padding-bottom: 1.25pt; border-left: white 1pt solid; padding-top: 1.25pt; border-bottom: white 1pt solid" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><strong><span style="color: black; font-family: 宋体">Example</span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Equals Number</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">==</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">eq</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo == 42 )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Equals String</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">==</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">eq</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo == "bar" )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Object Equivalence</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">==</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">eq</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo == $bar )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Not Equals</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">!=</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">ne</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo != $bar )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Greater Than</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">&gt;&nbsp;</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">gt</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo &gt; 42 )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Less Than</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">&lt;&nbsp;</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">lt</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo &lt; 42 )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Greater Than or Equal To</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">&gt;=</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">ge</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo &gt;= 42 )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Less Than or Equal To</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">&lt;=</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">le</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #a0ddf0; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( $foo &lt;= 42 )</span></p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">Boolean NOT</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">!</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">not</span></p>
            </td>
            <td style="padding-right: 2.5pt; padding-left: 2.5pt; background: #88c5d8; padding-bottom: 1.25pt; padding-top: 1.25pt" valign="top">
            <p style="line-height: 15.6pt; text-align: left" align="left"><span style="color: black; font-family: 宋体">#if( !$foo )</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-indent: 21pt"><span style="font-family: 宋体">注意：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">1</span><span style="font-family: 宋体">．<span style="color: black">&#8220;== &#8220;操作可以用来比较数字，字符串，或同一个类的不同对象或不同类型的对象. 当是不同类的对象时，会调用它们的toString()命令结果来做比较看是否相等.</span></span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="color: black; font-family: 宋体">2</span><span style="color: black; font-family: 宋体">．你也可以用括弧来限定指令。当书写时紧跟一个#else，这是就需要将该else指令限定。</span></p>
<p style="background: #f8fff8; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">#if( $foo == $bar)it's true!#{else}it's not!#end&lt;/li&gt;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">3.3#foreach-</span><span style="font-family: 宋体">对象循环</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">格式：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">#[{] foreach[}](<em>$ref </em>in <em>arg</em>)statement#[{] end[}]</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">用法：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;$ref-用于循环的变量</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;arg-可能是一个列表引用(i.e.object.array,collection,or map),或者一个array list,或者其他列表。</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;statement-<em><span style="color: black">当velocity发现下一个有效对像在列表中,输出可以是一个合法的VTL.</span></em></span></p>
<p style="text-indent: 21pt"><em><span style="color: black; font-family: 宋体">例如下面省略statement的#foreach():</span></em></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;引用：#foreach($item in $items)</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;数组：#foreach($item in [&#8220;Not&#8221;,$my,&#8221;fault&#8221;])</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;列表：#foreach($item in[1...3])</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">Velocity</span><span style="font-family: 宋体">提供一个简单的方式实现循环计数器，这样你可以根据一下来做：</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">&lt;table&gt;</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">#foreach( $customer in $customerList )</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td&gt;$velocityCount&lt;/td&gt;&lt;td&gt;$customer.Name&lt;/td&gt;&lt;/tr&gt;</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">#end</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">&lt;/table&gt;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">循环计数器引用中有一个默认的名字-$velocityCount，它是在velocity.properties中定义。计数器默认设置从1开始计数，同样你也可以在velocity.properties中进行设定成0或者1。计数器的部分属性参数可以在velocity.properties文件里找到：</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"># Default name of the loop counter</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"># variable reference.</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">directive.foreach.counter.name = velocityCount</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"># Default starting value of the loop</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"># counter variable reference.</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">directive.foreach.counter.initial.value = 1</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">在Velocity1.5中加入了对计数器最大值的限制，默认值是-1，表示没有限制。</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体"># The maximum allowed number of loops.</span></p>
<p style="background: #f8fff8; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-family: 宋体">directive.foreach.maxloops = -1</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">3.4#include-</span><span style="font-family: 宋体">加载不用被Velocity解析的本地文件</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">格式：</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">#[{]include[}](arg[arg2&#8230;argn])</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;arg-在TEMPLATE_ROOT下引用一个有效的文件</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">例如：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;字符串：#include( "disclaimer.txt" "opinion.txt" )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;变量：#include( $foo $bar )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 3.5#parse-</span><span style="font-family: 宋体">加载一个需要被Velocity解析的本地模板</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">格式：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #[{]parse[}](arg)</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;arg-在TEMPLATE_ROOT下引用一个模板</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">例如：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;字符串：#parse( "lecorbusier.vm" )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;变量：#parse( $foo )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">通过设置配置中的解析层次深度的最大值velocity.properties中项 <em>parse_directive.maxdepth</em> in可以防止死循环. (The default parse depth is 10.)</span></p>
<p><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; 3.6#stop-</span><span style="color: black; font-family: 宋体">停止模板引擎</span></p>
<p><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">格式：</span></p>
<p><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #</span><span style="font-family: 宋体">[{]stop[}]</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">用法：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">它将停止执行流动中的模板。这对调试模板来说很不错。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 3.7#evaluate-</span><span style="font-family: 宋体">动态的估计一个字符串或者引用</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">格式：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #[{] evaluate[}](arg)</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;arg-被动态估计的字符串或者</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">例如：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c</span><span style="font-family: 宋体">字符串：#evaluate( 'string with VTL #if(true)will be displayed#end' )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;变量：#include( $foo )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 3.8#macro-</span><strong><span style="font-weight: normal; font-family: 宋体">让用户可以定义宏操作(Velocimacro (VM):一组实现特定功能的VTL</span></strong></p>
<p><strong><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></strong><span style="font-family: 宋体">格式：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #[{]macro[}](vmname $arg1[$arg2 $arg3 &#8230; $argn])[VM VTL code&#8230;]# [{]end[}]</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">&#8226;</span><span style="color: black; font-family: 宋体">vmname </span><span style="color: black; font-family: 宋体">&#8211; 宏名字 VM (#vmname) </span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;<em><span style="color: black">$arg1 $arg2 [ ... ] </span><span style="color: black">&#8211; 要传给宏的参数VM</span></em></span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">&#8226;<em><span style="color: black">[ VM VTL code... ] </span><span style="color: black">&#8211;宏代码，有效的VTL</span></em></span></p>
<p><em><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></em><em><span style="color: black; font-family: 宋体">一旦定义，VM就像是模板中任何别的VTL指令。</span></em></p>
<p style="background: #f8fff8; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt"><em><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></em><span style="font-size: 10pt; font-family: 'Courier New'">#vmname( $arg1 $arg2 )</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; VMs</span><span style="font-family: 宋体">可以被定义在两个地方：</span></p>
<p style="margin-left: 39pt; text-indent: -18pt"><span style="font-family: 宋体">1．</span><span style="font-family: 宋体">Template library:</span><span style="font-family: 宋体">可以配置用户定义的库，以便全站使用。</span></p>
<p style="margin-left: 39pt; text-indent: -18pt"><span style="font-family: 宋体">2．</span><span style="font-family: 宋体">Inline:</span><span style="font-family: 宋体">放入到一般的模板文件中，仅当配置参数velocimacro.permissions.allowInline=true时生效。</span></p>
<p><span style="font-family: 宋体">4</span><span style="font-family: 宋体">注解</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">4.1</span><span style="font-family: 宋体">单行注解</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如: </span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ##This is a comment.</span></p>
<p><span style="font-family: 宋体">4.2</span><span style="font-family: 宋体">多行注解</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">例如：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">#*</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-family: 宋体">This is a multiline comment.</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">*#</span></p>
 <img src ="http://www.blogjava.net/benfox/aggbug/220963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/benfox/" target="_blank">Ben狐狸</a> 2008-08-08 19:12 <a href="http://www.blogjava.net/benfox/articles/220963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>和Ben狐狸一起学习Struts2：Struts2配置文件</title><link>http://www.blogjava.net/benfox/articles/220423.html</link><dc:creator>Ben狐狸</dc:creator><author>Ben狐狸</author><pubDate>Wed, 06 Aug 2008 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/benfox/articles/220423.html</guid><wfw:comment>http://www.blogjava.net/benfox/comments/220423.html</wfw:comment><comments>http://www.blogjava.net/benfox/articles/220423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/benfox/comments/commentRss/220423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/benfox/services/trackbacks/220423.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;一、&nbsp;&nbsp;&nbsp; web.xml配置文件任何MVC框架都需要与Web应用整合，这就不得不借助于web.xml文件，只有配置在web.xml文件中Servlet才会被应用加载。所有的MVC框架都需要web应用加载一个核心控制器，对于Struts2框架而言，需要加载FilterDispatcher，只要Web应用负责加载FilterDispatcher，Fi...&nbsp;&nbsp;<a href='http://www.blogjava.net/benfox/articles/220423.html'>阅读全文</a><img src ="http://www.blogjava.net/benfox/aggbug/220423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/benfox/" target="_blank">Ben狐狸</a> 2008-08-06 13:38 <a href="http://www.blogjava.net/benfox/articles/220423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>和Ben狐狸一起学习Struts2：Hello world</title><link>http://www.blogjava.net/benfox/articles/215066.html</link><dc:creator>Ben狐狸</dc:creator><author>Ben狐狸</author><pubDate>Tue, 15 Jul 2008 13:00:00 GMT</pubDate><guid>http://www.blogjava.net/benfox/articles/215066.html</guid><wfw:comment>http://www.blogjava.net/benfox/comments/215066.html</wfw:comment><comments>http://www.blogjava.net/benfox/articles/215066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/benfox/comments/commentRss/215066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/benfox/services/trackbacks/215066.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好几天了，总算有空和大家一起学习Struts2了。今天我们一起来入门Struts2，喜欢java的朋友们肯定不会对&#8220;Hello World&#8221;陌生，因为它是带我们步入陌生领域的&#8220;第一步&#8221;。所以我们一起动手来完成我们的&#8220;Hello World&#8221;。<br />
<font size="5"><strong>2.1 开发环境</strong></font>&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;动手写之前我们先来统一一下开发环境，呵呵。因为Struts2发布最好开发环境是Servlet2.4（至于原因以后你就会明白），所以我们选择web容器为Tomcat6.x。而IDE嘛，现在流行的是Eclipse，所以我们也随流行的队伍使用Eclipse。现在Apache公布的Struts2版本是2.0.11.2，所以我们也使用这个。以下是这些的下载地址:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts2.0.11.2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://sturts.apache.org/" target="_blank">http://sturts.apache.org</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tomcat6.0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://tomcat.apache.org/" target="_blank">http://tomcat.apache.org</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eclispe3.4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.eclipse.org/" target="_blank">http://www.eclipse.org</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注：因为我们是开发J2EE项目，所以建议大家直接下载Eclipse IDE for Java EE Developers。<br />
<font size="5"><strong>2.2 添加包</strong></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先新建一个&#8220;Dynamic Web Project&#8221;，我创建的是&#8221;Blog&#8221;项目。因为我们所有学习都是来不断完善这个Blog，所以项目直接取名为Blog。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们将Struts2的5个关键包粘贴到/Blog/WebContent/WEB-INF/lib中，这5个关键包分别是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.commons-logging-1.0.4.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.freemarker-2.3.8.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.ognl-2.6.11.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.struts2-core-2.0.11.2.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.xwork-2.0.5.jar<br />
<font size="5"><strong>2.3 流程图</strong></font><br />
<br />
<span id="attach_14" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 213px; position: absolute; top: 761px"><img src="http://images.5d6d.net/dz61/Beijing2008/attachimg.gif" border="0"  alt="" /></span> <img onmouseover="attachimginfo(this, 'attach_14', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_14', 0, event)" alt="" src="http://cc.a.5d6d.com/userdirs/8/2/benfox0520/attachments/month_0807/20080709_362cb17a3389942fd5afpHGAZtzjSkJW.jpg" onload="attachimg(this, 'load')" border="0" /> <br />
<font size="4"><strong>图5-1 流程图</strong></font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说明：用户提出请求（<a href="http://localhost:8080/Blog">http://localhost:8080/Blog</a>）,浏览器显示页面，用户输入用户名和密码，action利用validate()先进行对输入的排查，如果发现错误就返回index.jsp并显示错误信息；如果输入符合输入规定，则利用execute()进行对输入判断是否正确，如果正确转向welcome.jsp；如果不正确转向error.jsp。<br />
<strong>2.4配制web.xml</strong><br />
　　接下来，我们开始我们的&#8221;Hello World&#8221;。因为做单纯Java具有输出作用的&#8220;Hello World&#8221;MS不能让我们了解Struts2，所以我们用Blog项目中的登录功能来完成所谓的&#8220;Hello World&#8221;，虽然功能简单，但是很能说明好多问题和知识点，麻雀虽小，五脏俱全，也就这个道理了。呵呵。<br />
　　以下是web.xml代码和诠释：<br />
-------------------------------------------------web.xml--------------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" target="_blank">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd</a>" id="WebApp_ID" version="2.5"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &lt;display-name&gt;Blog&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &lt; ! -- 定义Struts2的FilterDispatcher的Filter -- &gt;<br />
&lt;filter&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt; !-- 定义核心Filter的名字 -- &gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt; !-- 定义核心Filter的实现类 -- &gt;<br />
&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &lt;/filter&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt; ! -- FilterDispatcher 用来初始化Struts2并且处理所有的Web请求&nbsp;&nbsp;-- &gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &lt;/filter-mapping&gt;<br />
&lt;/web-app&gt;<br />
--------------------------------------------------------------------------------------------------------------------------------<br />
<font size="5"><strong>2.5 三个网页代码</strong></font><br />
　　配制完后我们可以先对参与本次流程的三个页面进行编码，起代码情况如下: <br />
----------------------------------------------------------index.jsp-----------------------------------------------------------<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"<br />
&nbsp; &nbsp; pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;<br />
&lt;title&gt;Ben狐狸-Blog系统&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;table&nbsp;&nbsp;width="100" height="100"&gt;<br />
&lt;s:form action="login" method="post"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;tr hegiht="25"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;s:textfield name="userName" label="用户名"&gt;&lt;/s:textfield&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;s:password name="passWord" label="密码"&gt;&lt;/s:password&gt;&lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;tr hegiht="25"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;s:submit name="submit1" value="登录"&gt;&lt;/s:submit&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;tr&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;td&gt;&nbsp;&lt;/td&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/tr&gt;<br />
&lt;/s:form&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
-------------------------------------------------------------------------------------------------------------------------------<br />
<br />
-----------------------------------------------------------error.jsp-----------------------------------------------------------<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"<br />
&nbsp; &nbsp; pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;<br />
&lt;title&gt;Ben狐狸-Blog系统&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
您输入的用户名或密码错误！<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
-----------------------------------------------------------------------------------------------------------------------------<br />
<br />
------------------------------------------------------------welcome.jsp----------------------------------------------------<br />
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"<br />
&nbsp; &nbsp; pageEncoding="UTF-8"%&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;<br />
&lt;title&gt;Ben狐狸-Blog系统&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
Ben狐狸，欢迎您的到来！<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
-------------------------------------------------------------------------------------------------------------------------------<br />
<font size="5"><strong>2.6 Action类</strong></font><br />
　　我们完成了前面的工作后，就要对我们书写的login.action，书写LoginAction.java.它是用来接受用户提交请求数据，并且对数据进行校验，然后在进行判断是否正确，最后确定返回转向的页面。代码如下：<br />
-----------------------------------------------------LoginAction.java----------------------------------------------------<br />
package com.benfox.blog.web;<br />
<br />
import java.util.regex.Pattern;<br />
<br />
import com.opensymphony.xwork2.ActionSupport;<br />
<br />
/*<br />
* @ auther - BenFox<br />
*/<br />
<br />
public class LoginAction extends ActionSupport{<br />
&nbsp; &nbsp; &nbsp; &nbsp; private String userName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; private String passWord;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String getUserName() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return userName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setUserName(String userName) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.userName = userName;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String getPassWord() {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return passWord;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void setPassWord(String passWord) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.passWord = passWord;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public String execute()throws Exception{<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String str="";<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(getUserName().equals("BenFox") &amp;&amp; getPassWord().equals("123456"))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; str = "success";<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; str = "error";<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return str;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; public void validate(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(userName !=null &amp;&amp; !Pattern.matches("\\w(4,25)", userName.trim()))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addFieldError("userName",<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "请输入用户名必须是字母和数字，且长度必须是4到25之间！");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(passWord !=null &amp;&amp; !Pattern.matches("\\w(4,25)", passWord.trim()))<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; addFieldError("passWord",<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "请输入密码必须是字母和数字，且长度必须是4到25之间！");<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}<br />
--------------------------------------------------------------------------------------------------------------------------------<br />
<font size="5"><strong>2.7配制struts.xml</strong></font><br />
　　写完上面几步后，我们还无法运行该项目，因为它还缺少struts的配制文件（struts.xml），它是进行对action的处理，代码如下：<br />
----------------------------------------------------struts.xml---------------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />
&lt;struts&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;package name="root" extends="struts-default"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;action name="login" <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class="com.benfox.blog.web.LoginAction"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="input"&gt;/index.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="error"&gt;/error.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/action&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;<br />
--------------------------------------------------------------------------------------------------------------------------------<br />
<font size="5"><strong>2.8 运行tomcat</strong></font><br />
　　还等什么，所以工作已经完成，接下来就是我们运行看效果的时候了，让我们一起运行tomcat,用浏览器查看我们的&#8220;成果&#8221;。<br />
<font size="5"><strong>2.9 章节小结</strong></font><br />
　　本章我们讲述了一个struts2项目所应该具备的基本部署情况，从页面配制文件（web.xml）到struts配制文件(struts.xml)，我们一一列举。如果你对这些还有问题，请不要着急，因为我们这次并不是透过这个例子，来分析struts2的所有。所以我们只要了解大概，再以后章节我和大家一起按照这样的部署模块，一部分一部分地详细学习。我已经领悟了struts2的结构，不知道你有没有通过这个例子领悟。下次再聊。<br />
<img src ="http://www.blogjava.net/benfox/aggbug/215066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/benfox/" target="_blank">Ben狐狸</a> 2008-07-15 21:00 <a href="http://www.blogjava.net/benfox/articles/215066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>和Ben狐狸一起学习Struts2：Struts 2 简介</title><link>http://www.blogjava.net/benfox/articles/215064.html</link><dc:creator>Ben狐狸</dc:creator><author>Ben狐狸</author><pubDate>Tue, 15 Jul 2008 12:51:00 GMT</pubDate><guid>http://www.blogjava.net/benfox/articles/215064.html</guid><wfw:comment>http://www.blogjava.net/benfox/comments/215064.html</wfw:comment><comments>http://www.blogjava.net/benfox/articles/215064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/benfox/comments/commentRss/215064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/benfox/services/trackbacks/215064.html</trackback:ping><description><![CDATA[<p><strong>1 MVC概述</strong><br />
&nbsp; &nbsp; &nbsp; &nbsp; MVC并不是JAVA语言所特有的设计思想，也并不是Web应用所特有的思想，它是所有面向对象程序设计语言都应该遵守的规范。<br />
<strong>1.1经典的MVC设计模式</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MVC(Model-View-Controller)模式，即模型-视图-控制器模式，其核型思想是将整个程序代码分成相对独立而又能协同工作的3个组成部分。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;①模型(Model):业务逻辑层。实现具体的业务逻辑、状态管理的功能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;②视图(View):表示层。即与用户实现交互的界面，通常实现数据的输入和输出功能。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;③控制器(Controller):控制层。起到控制整个业务流程(Flow Control)的作用，实现View和Model部分的协同工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MVC设计模式的结构及各组成部分间的通信方式如图：<br />
<span id="attach_9" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 213px; position: absolute; top: 504px"><img src="http://images.5d6d.net/dz61/Beijing2008/attachimg.gif" border="0"  alt="" /></span> <img onmouseover="attachimginfo(this, 'attach_9', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_9', 0, event)" alt="" src="http://cc.a.5d6d.com/userdirs/8/2/benfox0520/attachments/month_0806/20080625_9f53e52fcb92fb43cb19ThTMMIUyyNWS.jpg" onload="attachimg(this, 'load')" border="0" /> </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MVC设计模式中，事件一般是指客户端Web浏览器提交的各种不同请求，这些请求由控制器进行处理，控制器根据事件的类型来改变模型或各个视图，视图可以接受模型发出的数据更新通知，依据数据根型的结果调整视图效果，呈现在用户面前。而模型也可以通过视图所获得的用户提交的数据进行具体业务逻辑的处理。<br />
随着JSP与Servlet技术的日益成熟，开发人员开始尝试在JAVA　Web应用开发中采用MVC设计模式，以实现软件代码更好的可维护性和可重用性。随后出现两种典型的JSP设计模式：１、modle1(JSP设计模式1)；２、model2( JSP设计模式2)；<br />
<strong>1.2JSP设计模式１</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在JSP技术的发展初期，由于其便于快速开发的优点，很快就成为了创建Web的应用的热门技术之一。在JSP页面中可以很容易实现内容的显示，业务逻辑的编写以及流程的控制，从而快速地完成应用开发。最初很多的Java Web应用甚至全部由JSP页面构成，这种以JSP为中心的开发模型称为Mode1(设计模式１)。具体实现方式如下图：<br />
<span id="attach_10" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 213px; position: absolute; top: 1206px"><img src="http://images.5d6d.net/dz61/Beijing2008/attachimg.gif" border="0"  alt="" /></span> <img onmouseover="attachimginfo(this, 'attach_10', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_10', 0, event)" alt="" src="http://cc.a.5d6d.com/userdirs/8/2/benfox0520/attachments/month_0806/20080625_6fe71001e5aae7020faejjSKKGIXomZy.jpg" onload="attachimg(this, 'load')" border="0" /> </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在设计模式１中，JSP页面负责接收处理客户端的Web浏览器发送的请求，并在处理后直接进行响应。其间一般会借助Java Bean处理复杂的业务逻辑。<br />
<strong>1.3JSP设计模式2</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model2则是MVC设计模式的一种具体实现方式。在Model2中采用Servlet作为控制器,负责接收客户端Web浏览器发送的所有请求，并依据处理的不同结果，转发到对应的JSP页面实现在浏览器客户端的显示。具体实现方式如下图：<br />
<span id="attach_11" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 213px; position: absolute; top: 1589px"><img src="http://images.5d6d.net/dz61/Beijing2008/attachimg.gif" border="0"  alt="" /></span> <img onmouseover="attachimginfo(this, 'attach_11', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_11', 0, event)" alt="" src="http://cc.a.5d6d.com/userdirs/8/2/benfox0520/attachments/month_0806/20080625_df96ee87485c81025e6azB18X800uPmZ.jpg" onload="attachimg(this, 'load')" border="0" /> </p>
<p><br />
<strong>2 Struts 2 介绍</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;目前，Struts已经分化成两个框架：第一个框架是传统的Struts1和WebWork结合后的Struts2。Struts2虽然是在Struts1的基础上发展起来的，但实质上是以WebWork为核心，Struts2为传统的Struts1注入了WebWork的设计理念，统一Struts1和WebWork两个框架，允许Struts1和WebWork开发者同时使用Struts2框架。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts分化出来的另一个框架是Shale,这个框架远远超出了Struts1原有的设计思想，它与原有的Struts1的关联很少，它使用全新的设计思想。Shale更像一个新的框架，而不是Struts的升级。而Shale则是建立在JSF之上。<br />
<strong>2.1 Struts2框架结构<br />
</strong><span id="attach_12" onmouseover="showMenu(this.id, 0, 1)" style="display: none; left: 213px; position: absolute; top: 2014px"><img src="http://images.5d6d.net/dz61/Beijing2008/attachimg.gif" border="0"  alt="" /></span> <img onmouseover="attachimginfo(this, 'attach_12', 1);attachimg(this, 'mouseover')" onmouseout="attachimginfo(this, 'attach_12', 0, event)" alt="" src="http://cc.a.5d6d.com/userdirs/8/2/benfox0520/attachments/month_0806/20080625_34bc24bc2ebce371e50dDDpM5p3TmA5R.jpg" onload="attachimg(this, 'load')" border="0" /> </p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过上面的我们看出来，浏览器发出请求后，核心控制器FilterDispatcher根据请求决定调用合适的Action；控制器将用户请求参数用SetXxx()方法写入Action，并且回调execute()方法，然后控制器通过execute()的返回参数决定jsp的显示页面，而显示内容则通过getXxx()方法从Action里获取。并最终通过JSP显示给浏览器。<br />
<strong>2.2 Struts2的配置文件<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当Struts2创建系统的Action代理时，需要使用Struts2的配置文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts2的配置文件有两份：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8226;配置Action的struts.xml文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8226;配置Struts2全局属性的struts.properties文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts.xml文件内定义了Struts2的系列Action,定义Action时，指定该Action的实现类，并定义该Action处理结果与视图资源之间的映射关系。代码如下：<br />
--------------------------------------------------------struts.xml---------------------------------------------------------<br />
&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
&lt;!DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"&gt;<br />
&lt;struts&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;package name="blog" extends="struts-deault"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;action name="Login" class="com.5d6d.benfox0520.Login"&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="success"&gt;/welcome.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="error"&gt;/error.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;result name="input"&gt;/index.jsp&lt;/result&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/action&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;<br />
------------------------------------------------------------------------------------------------------------------------------<br />
&nbsp; &nbsp; &nbsp; &nbsp; Struts.properties文件形式是系列的key,value对，它指定了Struts2应用的全局属性。<br />
-----------------------------------------------------------struts.properties---------------------------------------------<br />
#struts.devMode=false<br />
------------------------------------------------------------------------------------------------------------------------------<br />
<strong>2.3 Struts2的标签库</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts2标签库也是Struts2的重要组成部分，Struts2的标签库提供了非常丰富的功能，这些标签库不仅提供了表现层数据处理，而且提供了基本的流程控制功能，还提供了国际化、Ajax支持等功能。<br />
<strong>2.4 Struts2的控制器组件<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts2的控制器组件是Struts2的核心，事实上，所有MVC框架都是以控制器组件为核心的。Struts2的控制器由两部分组成：FilterDispatcher和业务控制器Action.<br />
<br />
PDF下载地址:<a href="http://benfox0520.5d6d.com/thread-5-1-1.html">http://benfox0520.5d6d.com/thread-5-1-1.html</a></p>
 <img src ="http://www.blogjava.net/benfox/aggbug/215064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/benfox/" target="_blank">Ben狐狸</a> 2008-07-15 20:51 <a href="http://www.blogjava.net/benfox/articles/215064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>