﻿<?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-阿姆斯壮 -随笔分类-工具箱</title><link>http://www.blogjava.net/pepsixp/category/426.html</link><description>I am strong, I am in Suzhou.</description><language>zh-cn</language><lastBuildDate>Wed, 07 Mar 2007 15:17:38 GMT</lastBuildDate><pubDate>Wed, 07 Mar 2007 15:17:38 GMT</pubDate><ttl>60</ttl><item><title>使用DbUnit</title><link>http://www.blogjava.net/pepsixp/archive/2005/09/05/12124.html</link><dc:creator>阿姆斯壮</dc:creator><author>阿姆斯壮</author><pubDate>Mon, 05 Sep 2005 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/pepsixp/archive/2005/09/05/12124.html</guid><wfw:comment>http://www.blogjava.net/pepsixp/comments/12124.html</wfw:comment><comments>http://www.blogjava.net/pepsixp/archive/2005/09/05/12124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pepsixp/comments/commentRss/12124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pepsixp/services/trackbacks/12124.html</trackback:ping><description><![CDATA[<P>当我刚开始编写和数据库有关的单元测试时，就知道这些测试代码在下次运行的时候可能无法完全通过，因为它和数据紧密的联系在一起，但也想不出一个好的解决方案。它只保证了当时的代码是没有问题的，一个星期后，不，可能在这次单元测试运行完后，就应该丢进垃圾桶了。<BR>这种吃力不讨好的行为持续了一段时间，直到引入了DbUnit之后。它确实能够的保证数据库处于一个稳定的状态，无须对其进行人工干预，操作也非常简单。<BR><BR>创建一个<STRONG>DbUnit Test Case<BR></STRONG>。。。<BR></P><img src ="http://www.blogjava.net/pepsixp/aggbug/12124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pepsixp/" target="_blank">阿姆斯壮</a> 2005-09-05 23:05 <a href="http://www.blogjava.net/pepsixp/archive/2005/09/05/12124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习FreeMarker（二）</title><link>http://www.blogjava.net/pepsixp/archive/2005/03/11/1941.html</link><dc:creator>阿姆斯壮</dc:creator><author>阿姆斯壮</author><pubDate>Fri, 11 Mar 2005 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/pepsixp/archive/2005/03/11/1941.html</guid><wfw:comment>http://www.blogjava.net/pepsixp/comments/1941.html</wfw:comment><comments>http://www.blogjava.net/pepsixp/archive/2005/03/11/1941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/pepsixp/comments/commentRss/1941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pepsixp/services/trackbacks/1941.html</trackback:ping><description><![CDATA[<P><STRONG>用户定义指令</STRONG>－使用@符合来调用<BR>有两种不同的类型：Macro(宏)和transform(传递器)，Macro是在模板中使用macro指令定义，而transform是在模板外由程序定义(基本上都是基于Java的)，这里通过Macro来介绍自定义指令。<BR>例一：<BR>&lt;#macro greet&gt;<BR>&nbsp; &lt;font size="+2"&gt;Hello Joe!&lt;/font&gt;<BR>&lt;/#macro&gt;&nbsp; <BR>使用：&lt;@greet&gt;&lt;<A>/@greet</A>&gt; 或 &lt;@greet/&gt;<BR>结果：&lt;font size="+2"&gt;Hello Joe!&lt;/font&gt;</P>
<P>参数－在macro指令中可以在宏变量之后定义参数<BR>例二：<BR>&lt;#macro greet person&gt;<BR>&nbsp; &lt;font size="+2"&gt;Hello ${person}!&lt;/font&gt;<BR>&lt;/#macro&gt; <BR>使用：&lt;@greet person="Fred"/&gt; and &lt;@greet person="Batman"/&gt; <BR>结果： &lt;font size="+2"&gt;Hello Fred!&lt;/font&gt; and &lt;font size="+2"&gt;Hello Batman!&lt;/font&gt;</P>
<P>macro可以有多个参数，参数的次序是无关的，在macro指令中只能使用定义的参数，并且必须对所有参数赋值，可以在定义参数时指定缺省值：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">greet&nbsp;person&nbsp;color</SPAN><SPAN style="COLOR: #0000ff">="black"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">font&nbsp;</SPAN><SPAN style="COLOR: #ff0000">size</SPAN><SPAN style="COLOR: #0000ff">="+2"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;color</SPAN><SPAN style="COLOR: #0000ff">="${color}"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;${person}!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">font</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">#macro</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P><BR><STRONG>在自定义指令嵌套内容</STRONG>：模板片断中使用&lt;#nested&gt;指令</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">border</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">table&nbsp;</SPAN><SPAN style="COLOR: #ff0000">border</SPAN><SPAN style="COLOR: #0000ff">=4&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellspacing</SPAN><SPAN style="COLOR: #0000ff">=0&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellpadding</SPAN><SPAN style="COLOR: #0000ff">=4&gt;&lt;tr&gt;&lt;td&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">&lt;#nested</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">table</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">#macro</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P>使用：&lt;@border&gt;The bordered text&lt;<A>/@border</A>&gt;<BR>结果：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">table&nbsp;</SPAN><SPAN style="COLOR: #ff0000">border</SPAN><SPAN style="COLOR: #0000ff">=4&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellspacing</SPAN><SPAN style="COLOR: #0000ff">=0&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellpadding</SPAN><SPAN style="COLOR: #0000ff">=4&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000">&lt;tr</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">The&nbsp;bordered&nbsp;text<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">table</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P>&lt;#nested&gt;指令可以被多次调用：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">do_thrice</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#nested</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#nested</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#nested</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">#macro</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P>使用：<BR>&lt;@do_thrice&gt;Anything.&lt;<A>/@do_thrice</A>&gt;&nbsp; <BR>结果：<BR>Anything.<BR>Anything.<BR>Anything. </P>
<P><STRONG>注意</STRONG>：嵌套内容是无法访问到macro中的局部变量的。<BR>例如：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">repeat&nbsp;count</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#local&nbsp;</SPAN><SPAN style="COLOR: #ff0000">y&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"test"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">1..count&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;${y}&nbsp;${count}/${x}:&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#nested</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#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">#macro</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">@repeat&nbsp;</SPAN><SPAN style="COLOR: #ff0000">count</SPAN><SPAN style="COLOR: #0000ff">=3&gt;${y?default("?")}&nbsp;</SPAN><SPAN style="COLOR: #ff0000">${x?default("?")}&nbsp;${count?default("?")}&lt;/@repeat</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P>结果：<BR>test 3/1: ? ? ?<BR>test 3/2: ? ? ?<BR>test 3/3: ? ? ?</P>
<P><BR>下面是一个嵌套使用自定义指令的例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">@border</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">ul</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">@do_thrice</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&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">@greet&nbsp;</SPAN><SPAN style="COLOR: #ff0000">person</SPAN><SPAN style="COLOR: #0000ff">="Joe"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">@do_thrice</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ul</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">@border</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN></DIV></DIV>
<P>结果：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">table&nbsp;</SPAN><SPAN style="COLOR: #ff0000">border</SPAN><SPAN style="COLOR: #0000ff">=4&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellspacing</SPAN><SPAN style="COLOR: #0000ff">=0&nbsp;</SPAN><SPAN style="COLOR: #ff0000">cellpadding</SPAN><SPAN style="COLOR: #0000ff">=4&gt;&lt;tr&gt;&lt;td&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #ff0000">&lt;ul</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&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">font&nbsp;</SPAN><SPAN style="COLOR: #ff0000">size</SPAN><SPAN style="COLOR: #0000ff">="+2"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;Joe!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">font</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&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">font&nbsp;</SPAN><SPAN style="COLOR: #ff0000">size</SPAN><SPAN style="COLOR: #0000ff">="+2"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;Joe!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">font</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&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">font&nbsp;</SPAN><SPAN style="COLOR: #ff0000">size</SPAN><SPAN style="COLOR: #0000ff">="+2"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Hello&nbsp;Joe!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">font</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">ul</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">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">table</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>在macro中<STRONG>使用循环变量</STRONG>－作为nested指令的参数传递循环变量的实际值，而在调用用户定义指令时，在&lt;@…&gt;开始标记的参数后面指定循环变量的名字：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">repeat&nbsp;count</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">1..count&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#nested&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x,&nbsp;x/2,&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">==count&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">&lt;/#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">#macro</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">@repeat&nbsp;</SPAN><SPAN style="COLOR: #ff0000">count</SPAN><SPAN style="COLOR: #0000ff">=4&nbsp;</SPAN><SPAN style="COLOR: #ff0000">;&nbsp;c,&nbsp;halfc,&nbsp;last</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;${c}.&nbsp;${halfc}</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#if&nbsp;</SPAN><SPAN style="COLOR: #ff0000">last</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;Last!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#if</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"><A>/</SPAN><SPAN style="COLOR: #800000">@repeat</SPAN><SPAN style="COLOR: #0000ff"></A></SPAN></DIV></DIV>
<P>&nbsp;结果：<BR>1. 0.5<BR>2. 1<BR>3. 1.5<BR>4. 2 Last!</P>
<P><STRONG>注意</STRONG>：循环变量和用户定义指令开始标记指定的数目可以不同，调用时少指定循环变量，则多指定的值不可见，调用时多指定循环变量，多余的循环变量不会被创建。<BR><BR><STRONG>模板中的变量</STRONG>，有三种类型：<BR>1.) <STRONG>plain(全局)变量</STRONG>：可以在模板的任何地方访问，包括使用include指令插入的模板，使用assign指令创建和替换<BR>2.) <STRONG>局部变量</STRONG>：在macro中有效，使用local指令创建和替换<BR>3.) <STRONG>循环变量</STRONG>：只能存在于指令的嵌套内容，由指令(如list)自动创建；宏的参数是局部变量，而不是循环变量</P>
<P>用assign指令创建和替换的例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;1&gt;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">&lt;#--&nbsp;create&nbsp;variable&nbsp;x&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;x&nbsp;</SPAN><SPAN style="COLOR: #ff0000">+&nbsp;3</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">replace&nbsp;variable&nbsp;x&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${x}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>1<BR>4</P>
<P>局部变量隐藏(而不是覆盖)同名的plain变量；循环变量隐藏同名的局部变量和plain变量，下面是一个例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"plain"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>1.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">we&nbsp;see&nbsp;the&nbsp;plain&nbsp;var.&nbsp;here&nbsp;--</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">@test</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>6.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">the&nbsp;value&nbsp;of&nbsp;plain&nbsp;var.&nbsp;was&nbsp;not&nbsp;changed&nbsp;--</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">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">["loop"]&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;7.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">now&nbsp;the&nbsp;loop&nbsp;var.&nbsp;hides&nbsp;the&nbsp;plain&nbsp;var.&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"plain2"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">replace&nbsp;the&nbsp;plain&nbsp;var,&nbsp;hiding&nbsp;does&nbsp;not&nbsp;mater&nbsp;here&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;8.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">it&nbsp;still&nbsp;hides&nbsp;the&nbsp;plain&nbsp;var.&nbsp;--</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">#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>9.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">the&nbsp;new&nbsp;value&nbsp;of&nbsp;plain&nbsp;var.&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">test</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;2.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">we&nbsp;still&nbsp;see&nbsp;the&nbsp;plain&nbsp;var.&nbsp;here&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#local&nbsp;</SPAN><SPAN style="COLOR: #ff0000">x&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"local"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;3.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">now&nbsp;the&nbsp;local&nbsp;var.&nbsp;hides&nbsp;it&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">["loop"]&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">now&nbsp;the&nbsp;loop&nbsp;var.&nbsp;hides&nbsp;the&nbsp;local&nbsp;var.&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#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>&nbsp;&nbsp;5.&nbsp;${x}&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">now&nbsp;we&nbsp;see&nbsp;the&nbsp;local&nbsp;var.&nbsp;again&nbsp;--</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">#macro</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>1. plain<BR>&nbsp; 2. plain<BR>&nbsp; 3. local<BR>&nbsp;&nbsp;&nbsp; 4. loop<BR>&nbsp; 5. local<BR>6. plain<BR>&nbsp;&nbsp;&nbsp; 7. loop<BR>&nbsp;&nbsp;&nbsp; 8. loop<BR>9. plain2</P>
<P>内部循环变量隐藏同名的外部循环变量，例如：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">["loop&nbsp;1"]&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">["loop&nbsp;2"]&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">["loop&nbsp;3"]&nbsp;as&nbsp;x</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#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>&nbsp;&nbsp;&nbsp;&nbsp;${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#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>&nbsp;&nbsp;${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#list</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P>结果：<BR>loop 1<BR>&nbsp;&nbsp;&nbsp; loop 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop 3<BR>&nbsp;&nbsp;&nbsp; loop 2<BR>&nbsp; loop 1 </P>
<P>模板中的变量会隐藏（而不是覆盖）数据模型中同名变量，如果需要访问数据模型中的同名变量，使用特殊变量global，下面的例子假设数据模型中的user的值是Big Joe：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">user&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"Joe&nbsp;Hider"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${user}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">prints:&nbsp;Joe&nbsp;Hider&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${.globals.user}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000">prints:&nbsp;Big&nbsp;Joe&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN></DIV></DIV>
<P><STRONG>命名(namespaces)空间</STRONG>－通常情况，只使用一个命名空间，称为主命名空间(main namespace)，但你是不会意识到这些的；为了创建可重用的macro、transforms或其它变量的集合(通常称库)，必须使用多命名空间，为了防止同名冲突。</P>
<P>首先创建一个库(假设保存在lib/my_test.ftl中)：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">copyright&nbsp;date</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Copyright&nbsp;(C)&nbsp;${date}&nbsp;Julia&nbsp;Smith.&nbsp;All&nbsp;rights&nbsp;reserved.<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Email:&nbsp;${mail}</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">p</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">#macro</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">mail&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"jsmith@acme.com"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN></DIV></DIV>
<P>使用import指令导入库到模板中，Freemarker会为导入的库创建新的命名空间，并可以通过import指令中指定的hash(散列)变量访问库中的变量：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#import&nbsp;</SPAN><SPAN style="COLOR: #ff0000">"/lib/my_test.ftl"&nbsp;as&nbsp;my</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">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">mail</SPAN><SPAN style="COLOR: #0000ff">="fred@acme.com"</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">@my</SPAN><SPAN style="COLOR: #ff0000">.copyright&nbsp;date</SPAN><SPAN style="COLOR: #0000ff">="1999-2002"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${my.mail}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${mail}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Copyright&nbsp;(C)&nbsp;1999-2002&nbsp;Julia&nbsp;Smith.&nbsp;All&nbsp;rights&nbsp;reserved.<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">br</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Email:&nbsp;jsmith@acme.com</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>jsmith@acme.com<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>fred@acme.com&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>上面的例子中使用的两个同名变量并没有冲突，因为它们位于不同的命名空间</P>
<P>可以使用assign指令在导入的命名空间中创建或替代变量：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#import&nbsp;</SPAN><SPAN style="COLOR: #ff0000">"/lib/my_test.ftl"&nbsp;as&nbsp;my</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${my.mail}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">mail</SPAN><SPAN style="COLOR: #0000ff">="jsmith@other.com"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;in&nbsp;my</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${my.mail}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR><A href="mailto:jsmith@acme.com"><FONT color=#000000>jsmith@acme.com</FONT></A><BR><A href="mailto:jsmith@other.com"><FONT color=#000000>jsmith@other.com</FONT></A>&nbsp; </P>
<P>数据模型中的变量任何地方都可见，也包括不同的命名空间，下面修改了刚才创建的库：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#macro&nbsp;</SPAN><SPAN style="COLOR: #ff0000">copyright&nbsp;date</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Copyright&nbsp;(C)&nbsp;${date}&nbsp;${user}.&nbsp;All&nbsp;rights&nbsp;reserved.</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">p</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">#macro</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">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">mail&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"${user}@acme.com"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>假设数据模型中的user变量的值是Fred：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#import&nbsp;</SPAN><SPAN style="COLOR: #ff0000">"/lib/my_test.ftl"&nbsp;as&nbsp;my</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">@my</SPAN><SPAN style="COLOR: #ff0000">.copyright&nbsp;date</SPAN><SPAN style="COLOR: #0000ff">="1999-2002"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${my.mail}</SPAN></DIV></DIV>
<P>&nbsp;结果：<BR>&nbsp;&lt;p&gt;Copyright (C) 1999-2002 Fred. All rights reserved.&lt;/p&gt;<BR><A href="mailto:Fred@acme.com"><FONT color=#000000>Fred@acme.com</FONT></A>&nbsp; <BR><BR><BR>参考：&nbsp;&nbsp; <A href="http://blog.csdn.net/chenyun2000/archive/2004/11/02/162979.aspx">chenyun'blog - FreeMarker设计指南</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A href="http://freemarker.sourceforge.net/">FreeMarker&nbsp; in sourceforge.net</A></P><img src ="http://www.blogjava.net/pepsixp/aggbug/1941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pepsixp/" target="_blank">阿姆斯壮</a> 2005-03-11 11:08 <a href="http://www.blogjava.net/pepsixp/archive/2005/03/11/1941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习FreeMarker（一）</title><link>http://www.blogjava.net/pepsixp/archive/2005/03/11/1685.html</link><dc:creator>阿姆斯壮</dc:creator><author>阿姆斯壮</author><pubDate>Fri, 11 Mar 2005 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/pepsixp/archive/2005/03/11/1685.html</guid><wfw:comment>http://www.blogjava.net/pepsixp/comments/1685.html</wfw:comment><comments>http://www.blogjava.net/pepsixp/archive/2005/03/11/1685.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/pepsixp/comments/commentRss/1685.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pepsixp/services/trackbacks/1685.html</trackback:ping><description><![CDATA[<P>FreeMarker是一个用Java编写的模板引擎，主要用来生成HTML Web页面，特别是基于MVC模式的应用程序。虽然FreeMarker具有一些编程的能力，但不像PHP，通常由Java程序准备要显示的数据，由FreeMarker模板生成页面。&nbsp; FreeMarker可以作为Web应用框架一个组件，但它与容器无关，在非Web应用程序环境也能工作的很好。 FreeMarker适合作为MVC的视图组件，还能在模板中使用JSP标记库。</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><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>&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">Welcome!</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>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Welcome&nbsp;${user}!</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">h1</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Our&nbsp;latest&nbsp;product:<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">a&nbsp;</SPAN><SPAN style="COLOR: #ff0000">href</SPAN><SPAN style="COLOR: #0000ff">="${latestProduct.url}"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">${latestProduct.name}</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">a</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><SPAN style="COLOR: #000000">&nbsp;&nbsp;<IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>上面的例子中，在简单的HTML中加入了一些由${…}包围的特定FreeMarker的指令，这个文件就称为模板了。而user、latestProduct.url和latestProduct.name来自于数据模型，由Java程序提供，模板设计者就不用关心数据从哪来的。</P>
<P>FreeMarker模板中可以包括下面四种特定部分：<BR>一.) <STRONG>文本</STRONG>：直接输出<BR>二.) <STRONG>FTL标记</STRONG>(FreeMarker模板语言标记)：类似于HTML标记，名字前加#(有些以@开始，用户自定义标记)予以区分，不会输出。<BR><STRONG>字符串</STRONG>－ 使用单引号或双引号限定；如果包含特殊字符需要转义符：${"It's \"quoted\" andthis is a backslash: \\"}<BR>有一类特殊的字符串:${r"C:\foo\bar"}，输出结构为：C:\foo\bar，在引号前面加r被认为是纯文本。 <BR>数字－直接输入，不需要引号。${08}, ${+8}, ${8.00} and ${8} 都是相同的 <BR><STRONG>布尔值</STRONG>－true和false，不使用引号<BR><STRONG>Sequences(序列)</STRONG>－由逗号分隔的变量列表，由方括号限定，类似java中的一维数组：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>["winter",&nbsp;"spring",&nbsp;"summer",&nbsp;"autumn"]&nbsp;as&nbsp;x</FONT></SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${x}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#list</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>输出结果：<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>winter<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>spring<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>summer<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>autumn<BR><BR>例二：[2 + 2, [1, 2, 3, 4], "whatnot"]<BR>例三：2..5，等同于[2, 3, 4, 5]；5..2，等同于[5,4,3,2]。注意方括号是不需要的。<BR><BR><STRONG>Hashes(散列)</STRONG>－由逗号分隔的键-值列表，由大括号限定，键和值之间用冒号分隔：{"name":"green mouse", "price":150}，键和值都是表达式，但是键必须是字符串。</P>
<P><STRONG>获取变量</STRONG>－${variable}，变量名只能是字母、数字、下划线、$、@和#的组合，且不能以数字开头。下列表达式是等价的：<BR>book.author.name<BR>book["author"].name<BR>book.author.["name"]<BR>book["author"]["name"]<BR><BR>获取Sequence(序列)片断－使用[startindex..endindex]，例如：seq中存储了"a", "b", "c", "d","e"，那么seq[1..2]包含了b和c两个值。<BR><BR>可以使用.variablename语法访问FreeMarker内置变量。</P>
<P><STRONG>字符串操作</STRONG><BR>{"Hello ${user}!"} &lt;==&gt; ${"Hello " + user + "!"}<BR>${"${user}${user}${user}${user}"} &lt;==&gt; ${user + user + user + user}</P>
<P>${…}只能在文本中使用，下面是错误的代码：<BR>&lt;#if ${isBig}&gt;Wow!&lt;/#if&gt; <BR>&lt;#if "${isBig}"&gt;Wow!&lt;/#if&gt;&nbsp; //此处的代码也是错误的，因为if指令需要的是boolean，实际的却是个字符串</P>
<P>子字符串的操作，假设user的值为"Big Joe"：<BR>${user[0]}${user[4]}&nbsp; &lt;==&gt;&nbsp; BJ<BR>${user[1..4]}&nbsp; &lt;==&gt; ig J </P>
<P><STRONG>Sequences(序列)操作</STRONG></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>["Joe",&nbsp;"Fred"]&nbsp;+&nbsp;["Julia",&nbsp;"Kate"]&nbsp;as&nbsp;user</FONT></SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>-&nbsp;${user}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#list</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>
<P>结果：<BR>- Joe<BR>- Fred<BR>- Julia<BR>- Kate</P>
<P><STRONG>Hashes(散列)操作</STRONG></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><STRONG><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></STRONG><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>ages</FONT>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;<FONT color=#000000>{"Joe":23,&nbsp;</FONT></SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>"Fred":25}&nbsp;+&nbsp;{"Joe":30,&nbsp;"Julia":18}</FONT></SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>-&nbsp;Joe&nbsp;is&nbsp;${ages.Joe}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>-&nbsp;Fred&nbsp;is&nbsp;${ages.Fred}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>-&nbsp;Julia&nbsp;is&nbsp;${ages.Julia}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>- Joe is 30<BR>- Fred is 25<BR>- Julia is 18&nbsp; </P>
<P><STRONG>算术运算</STRONG></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><STRONG><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></STRONG><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>x的值设定为5</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${x&nbsp;*&nbsp;x&nbsp;-&nbsp;100}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${x&nbsp;/&nbsp;2}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${12&nbsp;%&nbsp;10}</SPAN></DIV></DIV>
<P>结果：<BR>-75<BR>2.5<BR>2 <BR><BR>注意： 操作符两边必须是数字；使用"+"时，如果一边是数字，一边是字符串，就会自动将数字转换为字符串。<BR><BR>使用内建的指令int<STRONG>获得整数部分</STRONG>：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV>${(x/2)?int}<BR>${1.1?int}<BR>${1.999?int}<BR>${-1.1?int}<BR>${-1.999?int}</DIV></DIV>
<P>结果：<BR>2<BR>1<BR>1<BR>-1<BR>-1</P>
<P><STRONG>比较操作符</STRONG>－&lt;#if expression&gt;...&lt;/#if&gt;<BR>1.)使用=（或==，完全相等）测试两个值是否相等，使用!= 测试两个值是否不相等<BR>2.)=和!=两边必须是相同类型的值，否则会产生错误，例如&lt;#if 1 = "1"&gt;会引起错误<BR>3.)Freemarker是精确比较，所以"x"、"x&nbsp; "和"X"是不相等的<BR>4.)对数字和日期可以使用&lt;、&lt;=、&gt;和&gt;=，但不能用于字符串<BR>5.)由于Freemarker会将&gt;解释成FTL标记的结束字符，所以对于&gt;和&gt;=可以使用括号来避免这种情况，例如&lt;#if (x &gt; y)&gt;，另一种替代的方法是，使用lt、lte、gt和gte来替代&lt;、&lt;=、&gt;和&gt;=</P>
<P><STRONG>逻辑操作符</STRONG>－&amp;&amp;(and)、||(or)、!(not)，只能用于布尔值，否则会产生错误<BR>&lt;#if x &lt; 12 &amp;&amp; color = "green"&gt;<BR>&nbsp; We have less than 12 things, and they are green.<BR>&lt;/#if&gt;<BR>&lt;#if !hot&gt; &lt;#-- here hot must be a boolean --&gt;<BR>&nbsp; It's not hot.<BR>&lt;/#if&gt;&nbsp; </P>
<P><STRONG>内置函数</STRONG>－用法类似访问hash(散列)的子变量，只是使用"?"替代"."，例如：user?upper_case<BR>下面列出常用的一些函数：<BR><U>对于字符串</U><BR>html－对字符串进行HTML编码<BR>cap_first－使字符串第一个字母大写<BR>lower_case－将字符串转换成小写<BR>trim－去掉字符串前后的空白字符<BR><U>对于Sequences(序列)<BR></U>size－获得序列中元素的数目<BR><U>对于数字<BR></U>int－取得数字的整数部分（如-1.9?int的结果是-1）<BR><BR>例一：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>test的值为Tom&nbsp;&amp;&nbsp;Jerry</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${test?html}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${test?upper_case?html}</SPAN></DIV></DIV>
<P>结果：<BR>Tom &amp;amp; Jerry<BR>TOM &amp;amp; JERRY <BR><BR>例二：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>seasons的值为"winter",&nbsp;"spring",&nbsp;"summer",&nbsp;"autumn"</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${seasons?size}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${seasons[1]?cap_first}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>left&nbsp;side&nbsp;can&nbsp;by&nbsp;any&nbsp;expression</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${"horse"?cap_first}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>4<BR>Spring<BR>Horse&nbsp; </P>
<P><STRONG>方法的调用</STRONG><BR>${repeat("What", 3)} <BR>${repeat(repeat("x", 2), 3) + repeat("What", 4)?upper_case} <BR>结果：<BR>WhatWhatWhat<BR>xxxxxxWHATWHATWHATWHAT </P>
<P><STRONG>操作符优先顺序</STRONG><BR>后缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [subvarName] [subStringRange] . (methodParams)<BR>一元&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +expr、-expr、!<BR>内建&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;?<BR>乘法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; *、 / 、%<BR>加法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; +、-<BR>关系&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&lt;、&gt;、&lt;=、&gt;=（lt、lte、gt、gte）<BR>相等&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; =、!=<BR>逻辑&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &amp;&amp;<BR>逻辑&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;||<BR>数字范围&nbsp;&nbsp; &nbsp;&nbsp; ..</P>
<P>三.) <STRONG>Interpolation</STRONG>：由${...}或#{...}两种类型，输出计算值，可以定义输出的格式<BR>例一：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#setting&nbsp;</SPAN><SPAN style="COLOR: #ff0000">number_format</SPAN><SPAN style="COLOR: #0000ff">="currency"</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">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">answer</SPAN><SPAN style="COLOR: #0000ff">=42/&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>${answer}<BR></FONT><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><FONT color=#000000>${answer?string}</FONT>&nbsp;&nbsp;<FONT color=#000000>&lt;#--&nbsp;the&nbsp;same&nbsp;as&nbsp;${answer}&nbsp;--</FONT></SPAN><SPAN style="COLOR: #0000ff"><FONT color=#000000>&gt;</FONT></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${answer?string.number}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${answer?string.currency}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${answer?string.percent}&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>$42.00<BR>$42.00<BR>42<BR>$42.00<BR>4,200%</P>
<P>例二：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">${lastUpdated?string("yyyy-MM-dd&nbsp;HH:mm:ss&nbsp;zzzz")}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${lastUpdated?string("EEE,&nbsp;MMM&nbsp;d,&nbsp;''yy")}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>${lastUpdated?string("EEEE,&nbsp;MMMM&nbsp;dd,&nbsp;yyyy,&nbsp;hh:mm:ss&nbsp;a&nbsp;'('zzz')'")}&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>结果：<BR>2003-04-08 21:24:44 Pacific Daylight Time<BR>Tue, Apr 8, '03<BR>Tuesday, April 08, 2003, 09:24:44 PM (PDT)</P>
<P>例三：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#assign&nbsp;</SPAN><SPAN style="COLOR: #ff0000">foo</SPAN><SPAN style="COLOR: #0000ff">=true/&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>${foo?string("yes",&nbsp;"no")}</FONT></SPAN></DIV></DIV>
<P>结果：<BR>yes</P>
<P>例四：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#000000>x&nbsp;is&nbsp;2.582&nbsp;and&nbsp;y&nbsp;is&nbsp;4</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{x;&nbsp;M2}&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--<FONT color=#0000ff>&nbsp;</FONT></SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>2.58</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{y;&nbsp;M2}&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>4&nbsp;</FONT>&nbsp;&nbsp;&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{x;&nbsp;m1}&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>2.6</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{y;&nbsp;m1}&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>4.0</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{x;&nbsp;m1M2}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>2.58</FONT>&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>#{y;&nbsp;m1M2}&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#--&nbsp;</SPAN><SPAN style="COLOR: #ff0000"><FONT color=#0000ff>4.0</FONT>&nbsp;&nbsp;--</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN></DIV></DIV>
<P>说明：mX－小数部分最小X位；MX－小数部分最大X位。</P>
<P>四.) <STRONG>注释</STRONG>：&lt;#--和--&gt; </P>
<P>下面是一个常用的模板例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">p</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">We&nbsp;have&nbsp;these&nbsp;animals:<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">table&nbsp;</SPAN><SPAN style="COLOR: #ff0000">border</SPAN><SPAN style="COLOR: #0000ff">=1&gt;<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">&lt;tr</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Name</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">th</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">Price<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#list&nbsp;</SPAN><SPAN style="COLOR: #ff0000">animals&nbsp;as&nbsp;being</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">tr</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#if&nbsp;</SPAN><SPAN style="COLOR: #ff0000">being.size&nbsp;</SPAN><SPAN style="COLOR: #0000ff">=&nbsp;"large"</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;</SPAN><SPAN style="COLOR: #800000">b</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">#if</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${being.name}<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">#if&nbsp;</SPAN><SPAN style="COLOR: #ff0000">being.size</SPAN><SPAN style="COLOR: #0000ff">="large"</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">b</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">#if</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">td</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">${being.price}&nbsp;Euros<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">#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>&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">table</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;<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&nbsp;</SPAN><SPAN style="COLOR: #ff0000">"/copyright_footer.html"</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV></DIV>
<P><STRONG>注意点</STRONG>：<BR>1.) FreeMarker是区分大小写的；<BR>2.) FTL标记不能位于另一个FTL标记内部，例如：&lt;#if &lt;#include 'foo'&gt;='bar'&gt;...&lt;/if&gt;；<BR>3.) ${…}只能在文本中使用；<BR>4.) 多余的空白字符会在模板输出时去除；<BR>5.) 如果使用的指令不存在，会产生一个错误消息。</P>
<P><BR>参考：&nbsp;&nbsp;&nbsp; <A href="http://blog.csdn.net/chenyun2000/archive/2004/11/02/162979.aspx">chenyun'blog - FreeMarker设计指南</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://freemarker.sourceforge.net/">FreeMarker&nbsp; in sourceforge.net</A></P><img src ="http://www.blogjava.net/pepsixp/aggbug/1685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pepsixp/" target="_blank">阿姆斯壮</a> 2005-03-11 11:00 <a href="http://www.blogjava.net/pepsixp/archive/2005/03/11/1685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>