﻿<?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-壹咪阳光-随笔分类-10-freemark</title><link>http://www.blogjava.net/ywj-316/category/42562.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 29 Oct 2010 18:10:34 GMT</lastBuildDate><pubDate>Fri, 29 Oct 2010 18:10:34 GMT</pubDate><ttl>60</ttl><item><title>Freemarker的内置函数及用法(转)</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/25/303592.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Wed, 25 Nov 2009 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/25/303592.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/303592.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/25/303592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/303592.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/303592.html</trackback:ping><description><![CDATA[在我们应用Freemarker过程中，经常会操作例如字符串，数字，集合等，却不清楚Freemrker有没有类似于Java一样有相关的类及方法。在本文当中，我将向大家详细的介绍Freemarke的内置函数及用法，以便能帮助大家更熟练的应用Freemarker完成项目开发。
<p style="text-indent: -75pt; margin: 0cm 0cm 0pt 93pt" class="MsoNormal"><span style="font-family: 宋体">一、&nbsp;</span><span style="font-family: 宋体">Sequence</span><span style="font-family: 宋体">的内置函数</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?first </span><span style="font-family: 宋体">返回sequence的第一个值。</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?last&nbsp;</span><span style="font-family: 宋体">返回sequence的最后一个值。</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?reverse </span><span style="font-family: 宋体">将sequence的现有顺序反转，即倒序排序</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?size&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">返回sequence的大小</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?sort&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">将sequence中的对象转化为字符串后顺序排序</span></p>
<p style="text-indent: 8.9pt; margin: 0cm 0cm 0pt 54pt; tab-stops: list 81.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">sequence?sort_by(value) </span><span style="font-family: 宋体">按sequence中对象的属性value进行排序</span></p>
<p style="margin: 0cm 0cm 0pt 21pt" class="MsoNormal"><span style="font-family: 宋体">注意：Sequence不能为null。以上方法在我的另一篇博客Freemarker中如何遍历List有详细的应用，感兴趣的朋友可以参考。</span></p>
<p style="text-indent: -9pt; margin: 0cm 0cm 0pt 36pt; tab-stops: list 36.0pt" class="MsoNormal"><span style="font-family: 宋体">二、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">Hash</span><span style="font-family: 宋体">的内置函数</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 90.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">hash?keys </span><span style="font-family: 宋体">返回hash里的所有key,返回结果为sequence</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 90.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">hash?values </span><span style="font-family: 宋体">返回hash里的所有value,返回结果为sequence</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">例如：</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#assign user={&#8220;name&#8221;:</span><span style="font-family: 宋体">&#8220;hailang&#8221;, &#8220;sex&#8221;:&#8220;man&#8221;}&gt;</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;#assign keys=user?keys&gt;</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;#list keys as key&gt;</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${key}=${user[key]}</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/#list&gt;</span></p>
<p style="text-indent: -66pt; margin: 0cm 0cm 0pt 93pt; tab-stops: list 36.0pt" class="MsoNormal"><span style="font-family: 宋体">三、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">操作字符串函数</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">substring</span><span style="font-family: 宋体">（start,end）从一个字符串中截取子串</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">start:</span><span style="font-family: 宋体">截取子串开始的索引，start必须大于等于0，小于等于end</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">end: </span><span style="font-family: 宋体">截取子串的长度，end必须大于等于0，小于等于字符串长度，如果省略该参数，默认为字符串长度。</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">例子：</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(0)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为str</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(1)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为tr</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(2)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为r</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(3)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(0,0)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(0,1)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为s</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(0,2)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为st</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;?substring(0,3)}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为str</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">cap_first </span><span style="font-family: 宋体">将字符串中的第一个单词的首字母变为大写。</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;</span><span style="font-family: 宋体">？cap_first}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为Str</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">uncap_first</span><span style="font-family: 宋体">将字符串中的第一个单词的首字母变为小写。</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;Str&#8217;</span><span style="font-family: 宋体">？cap_first}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为str</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">capitalize</span><span style="font-family: 宋体">将字符串中的所有单词的首字母变为大写</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8216;str&#8217;</span><span style="font-family: 宋体">？ capitalize}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为STR</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">date,time</span><span style="font-family: 宋体">，datetime将字符串转换为日期</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">例如：</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#assign date1=&#8221;2009-10-12&#8221;?date(&#8220;yyyy-MM-dd&#8221;)&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#assign date2=&#8221;9:28:20&#8221;?time(&#8220;HH:mm:ss&#8221;)&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#assign date3=&#8221; 2009-10-12 9:28:20&#8221;?time(&#8220;HH:mm:ss&#8221;)&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${date1}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为2009-10-12</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${date2}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为9:28:20</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${date3}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为2009-10-12 9:28:20</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">注意：如果指定的字符串格式不正确将引发错误。</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">ends_with </span><span style="font-family: 宋体">判断某个字符串是否由某个子串结尾，返回布尔值。</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${</span><span style="font-family: 宋体">&#8220;string&#8221;?ends_with(&#8220;ing&#8221;)?string} 返回结果为true</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">注意：布尔值必须转换为字符串才能输出</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">html </span><span style="font-family: 宋体">用于将字符串中的&lt;、&gt;、&amp;和&#8220;替换为对应得&amp;lt;&amp;gt;&amp;quot:&amp;amp</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">8.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">index_of</span><span style="font-family: 宋体">（substring,start）在字符串中查找某个子串，返回找到子串的第一个字符的索引，如果没有找到子串，则返回-1。</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;Start</span><span style="font-family: 宋体">参数用于指定从字符串的那个索引处开始搜索，start为数字值。</span></p>
<p style="text-indent: -10.5pt; margin: 0cm 0cm 0pt 73.5pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;</span><span style="font-family: 宋体">如果start大于字符串长度，则start取值等于字符串长度，如果start小于0， 则start取值为0。</span></p>
<p style="text-indent: -10.5pt; margin: 0cm 0cm 0pt 73.5pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;${&#8220;string&#8221;?index_of(&#8220;in&#8221;) </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为3</span></p>
<p style="margin: 0cm 0cm 0pt 73.5pt" class="MsoNormal"><span style="font-family: 宋体">${&#8220;string&#8221;?index_of(&#8220;ab&#8221;) </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为-1</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">9.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">length</span><span style="font-family: 宋体">返回字符串的长度 ${&#8220;string&#8221;?length}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为6</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">10.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">lower_case</span><span style="font-family: 宋体">将字符串转为小写</span></p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${&#8220;STRING&#8221;?lower_case}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为string</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">11.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">upper_case</span><span style="font-family: 宋体">将字符串转为大写</span></p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${&#8220;string&#8221;?upper_case}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为STRING</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">12.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">contains </span><span style="font-family: 宋体">判断字符中是否包含某个子串。返回布尔值</span></p>
<p style="text-indent: 15.75pt; margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;${&#8220;string&#8221;?contains(&#8220;ing&#8221;)?string} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为true</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">注意：布尔值必须转换为字符串才能输出</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">13.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">number</span><span style="font-family: 宋体">将字符串转换为数字</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8220;111.11&#8221;?number}</span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为111.11</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">14.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">replace</span><span style="font-family: 宋体">用于将字符串中的一部分从左到右替换为另外的字符串。</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${&#8220;strabg&#8221;?replace(&#8220;ab&#8221;,&#8221;in&#8221;)} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为string</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">15.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">&nbsp;split</span><span style="font-family: 宋体">使用指定的分隔符将一个字符串拆分为一组字符串</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#list &#8220;This|is|split&#8221;?split(&#8220;|&#8221;) as s&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; ${s}</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">&lt;/#list&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">结果为:</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">This </span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">is</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">split</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 63.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">16.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">trim </span><span style="font-family: 宋体">删除字符串首尾空格 ${&#8220;&nbsp;String &#8221;?trim} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为String</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;</span></p>
<p style="text-indent: -36pt; margin: 0cm 0cm 0pt 63pt; tab-stops: list 45.0pt" class="MsoNormal"><span style="font-family: 宋体">四、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">操作数字</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 90.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">c </span><span style="font-family: 宋体">用于将数字转换为字符串</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">${123?c} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为123</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 129pt; tab-stops: list 90.0pt 129.0pt" class="MsoNormal"><span style="font-family: 宋体">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">string</span><span style="font-family: 宋体">用于将数字转换为字符串</span></p>
<p style="text-indent: -42pt; margin: 0cm 0cm 0pt 105pt" class="MsoNormal"><span style="font-family: 宋体">Freemarker</span><span style="font-family: 宋体">中预订义了三种数字格式：number,currency（货币）和percent(百分比)其中number为默认的数字格式转换</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">例如：&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">&lt;#assign tempNum=20&gt;</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${tempNum}&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${tempNum?string.number}</span><span style="font-family: 宋体">或${tempNum?string(&#8220;number&#8221;)} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为20</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${tempNum?string.currency}</span><span style="font-family: 宋体">或${tempNum?string(&#8220;currency&#8221;)} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为￥20.00</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">${tempNum?string. percent}</span><span style="font-family: 宋体">或${tempNum?string(&#8220;percent&#8221;)} </span><span style="font-family: Wingdings">&#224;</span><span style="font-family: 宋体">结果为2,000%</span></p>
<p style="text-indent: -75pt; margin: 0cm 0cm 0pt 93pt; tab-stops: list 45.0pt" class="MsoNormal"><span style="font-family: 宋体">五、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">操作布尔值</span></p>
<p style="margin: 0cm 0cm 0pt 63pt" class="MsoNormal"><span style="font-family: 宋体">string </span><span style="font-family: 宋体">用于将布尔值转换为字符串输出</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">true</span><span style="font-family: 宋体">转为&#8220;true&#8221;，false转换为&#8220;false&#8221;</span></p>
<p style="margin: 0cm 0cm 0pt 84pt" class="MsoNormal"><span style="font-family: 宋体">foo?string(&#8220;yes&#8221;,&#8221;no&#8221;)</span><span style="font-family: 宋体">如果布尔值是true,那么返回&#8220;yes&#8221;,否则返回no</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">通过上面对开发中常用的Freemarker内置函数及用法的介绍，相信您已经对这些函数的有了一定的了解，希望本文能对您的开发有所帮助。由于时间仓促，有不足之处请您批评指正。</span></p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/303592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-25 11:21 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/25/303592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker处理集合</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/25/303563.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Wed, 25 Nov 2009 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/25/303563.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/303563.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/25/303563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/303563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/303563.html</trackback:ping><description><![CDATA[<span style="background-color: yellow">集合</span><br />
<br />
集合以方括号包括,各集合元素之间以英文逗号","分隔,看如下的例子:<br />
&lt;#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x&gt;<br />
${x}<br />
&lt;/#list&gt;<br />
输出结果是:<br />
星期一<br />
星期二<br />
星期三<br />
星期四<br />
星期五<br />
星期六<br />
星期天
<p>除此之外,集合元素也可以是表达式,例子如下:<br />
[2 + 2, [1, 2, 3, 4], "whatnot"]</p>
<p>还可以使用数字范围定义数字集合,如2..5等同于[2, 3, 4, 5],但是更有效率.注意,使用数字范围来定义集合时无需使用方括号,数字范围也支持反递增的数字范围,如5..2</p>
<p><span style="background-color: yellow">Map对象</span><br />
<br />
Map对象使用花括号包括,Map中的key-value对之间以英文冒号":"分隔,多组key-value对之间以英文逗号","分隔.下面是一个例子:<br />
{"语文":78, "数学":80}<br />
Map对象的key和value都是表达式,但是key必须是字符串</p>
<br />
<p><span style="font-size: x-small"><span><span style="background-color: yellow; font-size: 12pt">输出变量值</span></span></span></p>
<p><a href="http://www.po-soft.com/blog/hailang/382.html">Free</a>Marker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性.下面分别讨论这些情况</p>
<p>1,顶层变量<br />
所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型:<br />
Map root = new HashMap();&nbsp;&nbsp; //创建数据模型<br />
root.put("name","annlee");&nbsp;&nbsp; //name是一个顶层变量</p>
<p>对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法:<br />
${name}</p>
<p>2,输出集合元素<br />
如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:<br />
["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法:<br />
${week[2]}&nbsp;&nbsp; //输出第三个集合元素</p>
<p>此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法:<br />
week[3..5]&nbsp;&nbsp; //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素</p>
<p>3,输出Map元素<br />
这里的Map对象可以是直接HashMap的实例,甚至包括JavaBean实例,对于JavaBean实例而言,我们一样可以把其当成属性为key,属性值为value的Map实例.为了输出Map元素的值,可以使用点语法或方括号语法.假如有下面的数据模型:<br />
Map root = new HashMap();<br />
Book book = new Book();<br />
Author author = new Author();<br />
author.setName("annlee");<br />
author.setAddress("gz");<br />
book.setName("struts2");<br />
book.setAuthor(author);<br />
root.put("info","struts");<br />
root.put("book", book);</p>
<p>为了访问数据模型中名为struts2的书的作者的名字,可以使用如下语法:<br />
book.author.name&nbsp;&nbsp;&nbsp; //全部使用点语法<br />
book["author"].name<br />
book.author["name"]&nbsp;&nbsp;&nbsp; //混合使用点语法和方括号语法<br />
book["author"]["name"]&nbsp;&nbsp; //全部使用方括号语法</p>
<p>使用点语法时,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字可以是任意表达式的结果.<br />
<br />
<span style="background-color: yellow">集合连接运算符 </span></p>
<p>这里所说的集合运算符是将两个集合连接成一个新的集合,连接集合的运算符是+,看如下的例子:<br />
&lt;#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x&gt;<br />
${x}<br />
&lt;/#list&gt;<br />
输出结果是:星期一 星期二 星期三 星期四 星期五 星期六 星期天</p>
<p><span style="font-size: x-small"><span><span style="background-color: yellow; font-size: 14pt">Map连接运算符</span></span></span></p>
<p>Map对象的连接运算符也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子:<br />
&lt;#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}&gt;<br />
语文成绩是${scores.语文}<br />
数学成绩是${scores.数学}<br />
Java成绩是${scores.Java}<br />
输出结果是:<br />
语文成绩是86<br />
数学成绩是87<br />
Java成绩是93</p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/303563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-25 10:06 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/25/303563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker整合Struts2</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/05/301275.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 05 Nov 2009 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/05/301275.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/301275.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/05/301275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/301275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/301275.html</trackback:ping><description><![CDATA[<p>１.解压struts2-core-X.X.X.jar文件，把在META-INF文件夹下面的struts-tags.tld文件复制到WEB-INF文件夹下。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 将freemark的jar导入到工程中</p>
<p>２.在web.xml文件中配置freemark同时启动JSPSupportServlet.代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">freemarker</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freemarker.ext.servlet.FreemarkerServlet<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">下面的配置freemarke的ftl文件的位置&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">TemplatePath</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;是否和服务器（tommcat)一起启动。0为不。1为是</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">freemarker</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.ftl</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;define&nbsp;a&nbsp;JspSupportServlet&nbsp;Object&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">JspSupportServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.struts2.views.JspSupportServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;setting&nbsp;JspSupportServlet&nbsp;auto&nbsp;start&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span></div>
<br />
<p>３.在FreeMarker模板中使用assign指令导入标签库。代码如下</p>
<p>&lt;#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /&gt; 注：这里我把struts-tags.tld放在WEB-INF下面</p>
<p>4.现在我们可以在FreeMarker模板中使用标签了<br />
示例代码如下：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">#assign&nbsp;</span><span style="color: #ff0000">s</span><span style="color: #0000ff">=JspTaglibs["/WEB-INF/struts-tags.tld"]&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.form&nbsp;action</span><span style="color: #0000ff">="login"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.textfield&nbsp;name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.submit&nbsp;value</span><span style="color: #0000ff">="login"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff"><a>/</span><span style="color: #800000">@s.form</span></a></div>
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;login.ftl代码如下&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">#assign&nbsp;</span><span style="color: #ff0000">s</span><span style="color: #0000ff">=JspTaglibs["/WEB-INF/struts-tags.tld"]&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Login&nbsp;Form</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />please&nbsp;input&nbsp;username&nbsp;and&nbsp;password&nbsp;login</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.form&nbsp;action</span><span style="color: #0000ff">="Login.action"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.textfield&nbsp;name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.password&nbsp;name</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;label</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@s</span><span style="color: #ff0000">.submit&nbsp;value</span><span style="color: #0000ff">="submit"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">@s.form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;welcome.ftl代码如下：&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Success</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">haed</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />WelCome,${username},you&nbsp;logined!</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">a&nbsp;</span><span style="color: #ff0000">href</span><span style="color: #0000ff">="ShowInfo.action"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Show&nbsp;Information</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;showinfo.ftl代码如下：&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">User&nbsp;Information</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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"</span><span style="color: #ff0000">&nbsp;width</span><span style="color: #0000ff">="360"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">caption</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">User&nbsp;Information</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">caption</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">username:</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${username}</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">sex:</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${sex}</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">age:</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${age}</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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<img src ="http://www.blogjava.net/ywj-316/aggbug/301275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-05 15:00 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/05/301275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Freemark 开发指南(网上找的)</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/03/300864.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Tue, 03 Nov 2009 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/03/300864.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/300864.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/03/300864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/300864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/300864.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;A概念最常用的3个概念sequence&nbsp;序列，对应java里的list、数组等非键值对的集合hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 键值对的集合namespace 对一个ftl文件的引用,利用这个名字可以访问到该ftl文件的资源B指令if, else, elseif语法&lt;#if condition&gt;...&nbsp;&nbsp;<a href='http://www.blogjava.net/ywj-316/archive/2009/11/03/300864.html'>阅读全文</a><img src ="http://www.blogjava.net/ywj-316/aggbug/300864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-03 11:12 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/03/300864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemarker高级1</title><link>http://www.blogjava.net/ywj-316/archive/2009/11/02/300768.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Mon, 02 Nov 2009 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/11/02/300768.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/300768.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/11/02/300768.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/300768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/300768.html</trackback:ping><description><![CDATA[1, ?interpret <br />
能够将文本的值解析为宏，类似动态指令用法如下 <br />
&lt;#assign x=["a", "b", "c"]&gt; <br />
&lt;#assign templateSource = "&lt;#list x as y&gt;${y}&lt;/#list&gt;"&gt; <br />
&lt;#assign inlineTemplate = templateSource?interpret&gt; <br />
&lt;@inlineTemplate /&gt;&nbsp; <br />
<br />
其中"&lt;#list x as y&gt;${y}&lt;/#list&gt;"可以是从数据库中读取出来的指令 <br />
<br />
<br />
2, ?new <br />
创建一个java对象 <br />
&lt;#assign word_wrapp = "com.acmee.freemarker.WordWrapperDirective"?new()&gt; <br />
还可以在new的时候加参数，如 <br />
&lt;#assign word_wrapp = "com.acmee.freemarker.WordWrapperDirective"?new(40)&gt; <br />
<br />
3， !!和?? <br />
两个简写符号，可以让我偷电缆（偷点懒） <br />
${obj.name!!}&nbsp; =&nbsp; ${obj.name?default('')} <br />
&lt;#if obj?? &gt;&nbsp;&nbsp; =&nbsp; &lt;#if obj?exists&gt; <br />
<br />
<br />
4, ; in macro 和 nest的参数 <br />
原本以为&lt;#nest/&gt;不能加参数，在构造模板时费了一些劲，原来可以用；在引用macro时给nest传参数 <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><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">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;${c}.${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">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">@repeat</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" 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</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;${c}.${halfc}&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">@repeat</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" 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&gt;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #ff0000">Just&nbsp;repeat&nbsp;it<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&lt;/@repeat</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
5， include里的通配符* <br />
好像可以应对不固定文件夹层级路径的写法，但具体没用过 <br />
&lt;#include "*/footer.ftl"&gt;&nbsp;&nbsp; <br />
匹配如下 <br />
/foo/bar/footer.ftl <br />
/foo/footer.ftl <br />
/footer.ftl <br />
<br />
6&nbsp;&nbsp;&nbsp;&nbsp;字符串转换为数字<br />
&lt;#assign width="234"/&gt;<br />
&lt;#assign widthNum=width?eval/&gt;<br />
<br />
7&nbsp; split字符串<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">#assign&nbsp;</span><span style="color: #ff0000">arr&nbsp;</span><span style="color: #0000ff">=&nbsp;o[2]?split(',')&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&lt;#list&nbsp;arr&nbsp;as&nbsp;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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">@selArea&nbsp;</span><span style="color: #ff0000">selName</span><span style="color: #0000ff">="select1"</span><span style="color: #ff0000">&nbsp;selId</span><span style="color: #0000ff">="select1"</span><span style="color: #ff0000">&nbsp;selvalue</span><span style="color: #0000ff">=(a?eval)&nbsp;</span><span style="color: #ff0000">userArea</span><span style="color: #0000ff">=1010&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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">#list</span><span style="color: #0000ff">&gt;</span></div>
<br />
<img src ="http://www.blogjava.net/ywj-316/aggbug/300768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-11-02 17:41 <a href="http://www.blogjava.net/ywj-316/archive/2009/11/02/300768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemarker 截取指定长度</title><link>http://www.blogjava.net/ywj-316/archive/2009/10/29/300169.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 29 Oct 2009 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/10/29/300169.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/300169.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/10/29/300169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/300169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/300169.html</trackback:ping><description><![CDATA[&lt;#if post.title?length lt 25 &gt;&nbsp;&nbsp; <br />
${post.title} <br />
&lt;#else&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp; ${post.title[0..21]}... <br />
&lt;/#if&gt;<br />
注：${post.title[0..21]}取得标题的前22个字符，后面加上省略号...（自定义的） 
  <img src ="http://www.blogjava.net/ywj-316/aggbug/300169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-10-29 13:24 <a href="http://www.blogjava.net/ywj-316/archive/2009/10/29/300169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemark笔记</title><link>http://www.blogjava.net/ywj-316/archive/2009/10/29/300168.html</link><dc:creator>junly</dc:creator><author>junly</author><pubDate>Thu, 29 Oct 2009 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/ywj-316/archive/2009/10/29/300168.html</guid><wfw:comment>http://www.blogjava.net/ywj-316/comments/300168.html</wfw:comment><comments>http://www.blogjava.net/ywj-316/archive/2009/10/29/300168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ywj-316/comments/commentRss/300168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ywj-316/services/trackbacks/300168.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">FreeMarker的指令的文件就称为模板（Template）。 </p>
<p style="text-indent: 2em">模板设计者不关心数据从那儿来，只知道使用已经建立的数据模型。 </p>
<p style="text-indent: 2em">数据模型由程序员编程来创建，向模板提供变化的信息，这些信息来自于数据库、文件，甚至于在程序中直接生成。 </p>
<p style="text-indent: 2em">数据类型： </p>
<p style="text-indent: 2em">一、基本： </p>
<p style="text-indent: 2em">1、scalars：存储单值 </p>
<p style="text-indent: 2em">字符串：简单文本由单或双引号括起来。 </p>
<p style="text-indent: 2em">数字：直接使用数值。 </p>
<p style="text-indent: 2em">日期：通常从数据模型获得 </p>
<p style="text-indent: 2em">布尔值：true或false，通常在&lt;#if &#8230;&gt;标记中使用 </p>
<p style="text-indent: 2em">2、hashes：充当其它对象的容器，每个都关联一个唯一的查询名字 </p>
<p style="text-indent: 2em">具有一个唯一的查询名字和他包含的每个变量相关联。 </p>
<p style="text-indent: 2em">3、sequences：充当其它对象的容器，按次序访问 </p>
<p style="text-indent: 2em">使用数字和他包含的每个变量相关联。索引值从0开始。 </p>
<p style="text-indent: 2em">4、集合变量： </p>
<p style="text-indent: 2em">除了无法访问它的大小和不能使用索引来获得它的子变量：集合可以看作只能由&lt;#list...&gt;指令使用的受限sequences。 </p>
<p style="text-indent: 2em">5、方法：通过传递的参数进行计算，以新对象返回结果 </p>
<p style="text-indent: 2em">方法变量通常是基于给出的参数计算值在数据模型中定义。 </p>
<p style="text-indent: 2em">6、用户自定义FTL指令：宏和变换器 </p>
<p style="text-indent: 2em">7、节点 </p>
<p style="text-indent: 2em">节点变量表示为树型结构中的一个节点，通常在XML处理中使用。 </p>
<p style="text-indent: 2em">模板： </p>
<p style="text-indent: 2em">使用FTL（freeMarker模板语言）编写 </p>
<p style="text-indent: 2em">组成部分 </p>
<p style="text-indent: 2em">一、整体结构 </p>
<p style="text-indent: 2em">1、注释：&lt;#--注释内容--&gt;，不会输出。 </p>
<p style="text-indent: 2em">2、文本：直接输出。 </p>
<p style="text-indent: 2em">3、interpolation:由 ${var} 或 #{var} 限定，由计算值代替输出。 </p>
<p style="text-indent: 2em">4、FTL标记 </p>
<p style="text-indent: 2em">二、指令： </p>
<p style="text-indent: 2em">freemarker指令有两种： </p>
<p style="text-indent: 2em">1、预定义指令：引用方式为&lt;#指令名称&gt; </p>
<p style="text-indent: 2em">2、用户定义指令：引用方式为&lt;@指令名称&gt;，<span style="background-color: #00ff00">引用用户定义指令时须将#换为@。</span> </p>
<p style="text-indent: 2em">注意：如果使用不存在的指令，FreeMarker不会使用模板输出，而是产生一个错误消息。 </p>
<p style="text-indent: 2em">freemarker指令由FTL标记来引用，FTL标记和HTML标记类似，名字前加#来加以区分。如HTML标记的形式为&lt;h1&gt;&lt;/h1&gt;则FTL标记的形式是&lt;#list&gt;&lt;/#list&gt;（此处h1标记和list指令没有任何功能上的对应关系，只是做为说明使用一下）。 </p>
<p style="text-indent: 2em">有三种FTL标记： </p>
<p style="text-indent: 2em">1)、开始标记：&lt;#指令名称&gt; </p>
<p style="text-indent: 2em">2)、结束标记：&lt;/#指令名称&gt; </p>
<p style="text-indent: 2em">3)、空标记：&lt;#指令名称/&gt; </p>
<p style="text-indent: 2em">注意： </p>
<p style="text-indent: 2em">1) FTL会忽略标记之中的空格，但是，&lt;#和指令 与 &lt;/#和指令 之间不能有空格。 </p>
<p style="text-indent: 2em">2) FTL标记不能够交叉，必须合理嵌套。每个开始标记对应一个结束标记，层层嵌套。 如： </p>
<p style="text-indent: 2em">&lt;#list&gt; </p>
<p style="text-indent: 2em">&lt;li&gt; </p>
<p style="text-indent: 2em">${数据} </p>
<p style="text-indent: 2em">&lt;#if 变量&gt; </p>
<p style="text-indent: 2em">&lt;p&gt;game over!&lt;/p&gt; </p>
<p style="text-indent: 2em">&lt;/#if&gt; </p>
<p style="text-indent: 2em">&lt;/li&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">注意事项： </p>
<p style="text-indent: 2em">1)、<span style="background-color: #00ff00">FTL对大小写敏感。</span>所以使用的标记及interpolation要注意大小写。name与NAME就是不同的对象。&lt;#list&gt;是正确的标记，而&lt;#List&gt;则不是。 </p>
<p style="text-indent: 2em">2)、interpolation只能在文本部分使用，不能位于FTL标记内。如&lt;#if ${var}&gt;是错误的，正确的方法是：&lt;#if var&gt;,而且此处var必须为布尔值。 </p>
<p style="text-indent: 2em">3)、FTL标记不能位于另一个FTL标记内部，注释例外。注释可以位于标记及interpolation内部。 </p>
<p style="text-indent: 2em">三、表达式 </p>
<p style="text-indent: 2em">1、直接指定值： </p>
<p style="text-indent: 2em">1-1、字符串： </p>
<p style="text-indent: 2em">由双引号或单引号括起来的字符串，其中的特殊字符（如' " \等）需要转义。 </p>
<p style="text-indent: 2em">1-2、<span style="background-color: #00ff00">raw字符串：</span> </p>
<p style="text-indent: 2em">有一种特殊的字符串称为raw字符串，被认为是纯文本，其中的\和{等不具有特殊含义，该类字符串在引号前面加r，下面是一个例子： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${r"/${da<wbr>ta}"year""}屏幕输出结果为：/${da<wbr>ta}"year"</span> </p>
<p style="text-indent: 2em">转义&nbsp;&nbsp;&nbsp; 含义 </p>
<p style="text-indent: 2em">序列&nbsp;&nbsp; </p>
<p style="text-indent: 2em">\"&nbsp; 双引号(u0022) </p>
<p style="text-indent: 2em">\'&nbsp; 单引号(u0027) </p>
<p style="text-indent: 2em">\\&nbsp; 反斜杠(u005C) </p>
<p style="text-indent: 2em">\n&nbsp; 换行(u000A) </p>
<p style="text-indent: 2em">\r&nbsp; Return (u000D) </p>
<p style="text-indent: 2em">\t&nbsp; Tab (u0009) </p>
<p style="text-indent: 2em">\b&nbsp; Backspace (u0008) </p>
<p style="text-indent: 2em">\f&nbsp; Form feed (u000C) </p>
<p style="text-indent: 2em">\l&nbsp; &lt; </p>
<p style="text-indent: 2em">\g&nbsp; &gt; </p>
<p style="text-indent: 2em">\a&nbsp; &amp; </p>
<p style="text-indent: 2em">\{&nbsp; { </p>
<p style="text-indent: 2em">\xCode&nbsp; 4位16进制Unicode代码 </p>
<p style="text-indent: 2em">1-3、数字：直接输入，不需要引号 </p>
<p style="text-indent: 2em">1)、精度数字使用&#8220;.&#8221;分隔，不能使用分组符号 </p>
<p style="text-indent: 2em">2)、目前版本不支持科学计数法，所以&#8220;1E3&#8221;是错误的 </p>
<p style="text-indent: 2em">3)、不能省略小数点前面的0，所以&#8220;.5&#8221;是错误的 </p>
<p style="text-indent: 2em">4)、数字8、+8、08和8.00都是相同的 </p>
<p style="text-indent: 2em">1-4、布尔值：true和false，不使用引号 </p>
<p style="text-indent: 2em">1-5、<span style="background-color: #00ff00">序列：由逗号分隔的子变量列表，由[]方括号限定。</span> </p>
<p style="text-indent: 2em">1)、子变量列表可以是表达式 </p>
<p style="text-indent: 2em">2)、可以使用数字范围定义数字序列，&lt;b&gt;不需要方括号限定&lt;/b&gt;，例如2..5等同于[2, 3, 4, 5]，但是更有效率，可以定义反递增范围如：5..2。 </p>
<p style="text-indent: 2em">1-6、<span style="background-color: #00ff00">散列(hash) </span></p>
<p style="text-indent: 2em">1)、<span style="background-color: #00ff00">由逗号分隔的键/值列表，由{}大括号限定，键和值之间用冒号分隔，如：{"key1":valu1,"key2":"character string"....} </span></p>
<p style="text-indent: 2em">2)、<span style="background-color: #00ff00">键和值都是表达式，但是键必须是字符串。</span> </p>
<p style="text-indent: 2em">2、获取变量： </p>
<p style="text-indent: 2em">2-1、顶层变量：${变量名} </p>
<p style="text-indent: 2em">变量名只能是字母、数字、下划线、$、#、@ 的组合，且不能以数字开头。 </p>
<p style="text-indent: 2em">2-2、<span style="background-color: #00ff00">散列：有两种方法</span> </p>
<p style="text-indent: 2em">1)、<span style="background-color: #00ff00">点语法：</span>变量名字和顶层变量的名字受同样的限制 </p>
<p style="text-indent: 2em">2)、<span style="background-color: #00ff00">方括号语法：</span>变量名字无限制，可以是任意的表达式的结果 </p>
<p style="text-indent: 2em" dir="ltr">book.author.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;散列表的多级：{"book":{"author":{"name":"张三"},"price":{"price1":200,"price2":500}},"book":{"author":{"name":"张三"}}</p>
<p style="text-indent: 2em">book.author.["name"] </p>
<p style="text-indent: 2em">book["author"].name </p>
<p style="text-indent: 2em">book["author"]["name"] </p>
<p style="text-indent: 2em">以上是等价的。 </p>
<p style="text-indent: 2em">2-3、序列：使用散列的方括号语法获取变量，方括号中的表达式结果必须为数字。注意：第一个项目的索引为0。可以使用 </p>
<p style="text-indent: 2em">[startindex..endindex]语法获取序列片段。 </p>
<p style="text-indent: 2em">2-4、特殊变量：FreeMarker内定义变量，使用.variablename语法访问。 </p>
<p style="text-indent: 2em">3、字符串操作 </p>
<p style="text-indent: 2em">3-1、interpolation:使用${}或#{}在文本部分插入表达式的值，例如： </p>
<p style="text-indent: 2em">${"hello${username}!"} </p>
<p style="text-indent: 2em">${"${username}${username}${username}"} </p>
<p style="text-indent: 2em">也可以使用+来获得同样的结果： </p>
<p style="text-indent: 2em">${"hello"+username+"!"} </p>
<p style="text-indent: 2em">${username+username+username} </p>
<p style="text-indent: 2em">注意：${}只能用于文本部分而不能出现于标记内。 </p>
<p style="text-indent: 2em">&lt;#if ${user.login}&gt;或&lt;#if "${user.login}"&gt;都是错误的; </p>
<p style="text-indent: 2em">&lt;#if user.login&gt;是正确的。 </p>
<p style="text-indent: 2em">本例中user.login的值必须是布尔类型。 </p>
<p style="text-indent: 2em">3-2、子串： </p>
<p style="text-indent: 2em">举例说明：假如user的值为"Big Joe" </p>
<p style="text-indent: 2em">${user[0]}${user[4]}结果是：BJ </p>
<p style="text-indent: 2em">${user[1..4]}结果是：ig J </p>
<p style="text-indent: 2em">4、序列操作 </p>
<p style="text-indent: 2em">4-1、连接操作：可以使用+来操作，例如： </p>
<p style="text-indent: 2em">["title","author"]+["month","day"] </p>
<p style="text-indent: 2em">5、散列操作 </p>
<p style="text-indent: 2em">5-1、连接操作：可以使用+来操作，如果有相同的KEY，则右边的值会替代左边的值，例如： </p>
<p style="text-indent: 2em">{"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。 </p>
<p style="text-indent: 2em">6、算术运算 </p>
<p style="text-indent: 2em">6-1、操作符：+、-、*、/、% </p>
<p style="text-indent: 2em">除+号以外的其他操作符两边的数据，必须都是数字类型。 </p>
<p style="text-indent: 2em">如果+号操作符一边有一个字符型数据，会自动将另一边的数据转换为字符型数据，运算结果为字符型数据。 </p>
<p style="text-indent: 2em">6-2、比较操作符： </p>
<p style="text-indent: 2em">1)、= </p>
<p style="text-indent: 2em">2)、== </p>
<p style="text-indent: 2em">3)、!= </p>
<p style="text-indent: 2em">4)、&lt; </p>
<p style="text-indent: 2em">5)、&lt;= </p>
<p style="text-indent: 2em">6)、&gt; </p>
<p style="text-indent: 2em">7)、&gt;= </p>
<p style="text-indent: 2em">1-3的操作符，两边的数据类型必须相同，否则会产生错误 </p>
<p style="text-indent: 2em">4-7的操作符，对于日期和数字可以使用，字符串不可以使用。 </p>
<p style="text-indent: 2em">注意： </p>
<p style="text-indent: 2em">1)、<span style="background-color: #00ff00">FreeMarker是精确比较，所以"x" "x " "X"是不等的</span>。 </p>
<p style="text-indent: 2em">2)、因为&lt;和&gt;对FTL来说是开始和结束标记，所以，可以用两种方法来避免这种情况： </p>
<p style="text-indent: 2em">一种是使用括号&lt;#if (a&lt;b)&gt; </p>
<p style="text-indent: 2em">另一是使用替代输出，对应如下： </p>
<p style="text-indent: 2em">&lt;&nbsp; lt </p>
<p style="text-indent: 2em">&lt;= lte </p>
<p style="text-indent: 2em">&gt;&nbsp; gt </p>
<p style="text-indent: 2em">&gt;= gte </p>
<p style="text-indent: 2em">6-3、逻辑操作符：只能用于布尔值，否则会出现错误。 </p>
<p style="text-indent: 2em">&amp;&amp;(and)与运算 </p>
<p style="text-indent: 2em">||(or)或运算 </p>
<p style="text-indent: 2em">!(not)非运算 </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">6-4、内建函数</span>：使用方法类似于访问散列的子变量，只是使用?代替.例如：${test?upper_case?html} </p>
<p style="text-indent: 2em">常用的内建函数列举如下： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">1)、字符串使用</span>： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">html:对字符串进行HTML编码 </span></p>
<p style="text-indent: 2em">cap_first:字符串第一个字母大写 </p>
<p style="text-indent: 2em">lower_first:字符串第一个字母小写 </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">upper_case:将字符串转换成大写 </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">trim:去年字符前后的空白字符</span> </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">2)、序列使用： </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">size:获得序列中元素的数目</span> </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">3)、数字使用： </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">int:取得数字的整数部分</span> </p>
<p style="text-indent: 2em">7、操作符的优先顺序： </p>
<p style="text-indent: 2em">后缀：[subbarName][subStringRange].(mathodParams) </p>
<p style="text-indent: 2em">一元：+expr、-expr、! (not) </p>
<p style="text-indent: 2em">内建：? </p>
<p style="text-indent: 2em">乘法：*、/、% </p>
<p style="text-indent: 2em">加法：+、- </p>
<p style="text-indent: 2em">关系：&lt;、&lt;=、&gt;、&gt;= (lt、lte、gt、gte) </p>
<p style="text-indent: 2em">相等：=、==、!= </p>
<p style="text-indent: 2em">逻辑与：&amp;&amp; (and) </p>
<p style="text-indent: 2em">逻辑或：|| (or) </p>
<p style="text-indent: 2em">数字范围：.. </p>
<p style="text-indent: 2em">四、interpolation </p>
<p style="text-indent: 2em">inperpolation只能用于文本，有两种类型：通用interpolation及数字interpolation </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">1、通用interpolation </span></p>
<p style="text-indent: 2em">如${expr} </p>
<p style="text-indent: 2em">1-1、插入字符串值：直接输出表达式结果。 </p>
<p style="text-indent: 2em">1-2、插入数字值：根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation </p>
<p style="text-indent: 2em">如： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">&lt;#setting number_format="currency" /&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">&lt;#assign answer=42 /&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${answer}&nbsp; &lt;#-- ￥42.00 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${answer?string}&nbsp; &lt;#-- ￥42.00 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${answer?string.number}&nbsp; &lt;#-- 42 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${answer?string.currency}&nbsp; &lt;#-- ￥42.00 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${answer?string.percent}&nbsp; &lt;#-- 42,00％ --&gt; </span></p>
<p style="text-indent: 2em">1-3、插入日期值：根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation </p>
<p style="text-indent: 2em">如： </p>
<p style="text-indent: 2em">${lastupdata?string("yyyy-MM-dd HH:mm:ss zzzz")}&nbsp; &lt;#-- 2003-04-08 21:24:44 Pacific Daylight Time --&gt; </p>
<p style="text-indent: 2em">${lastupdata?string("EEE,MMM d, ''yy")}&nbsp; &lt;#-- tue,Apr 8, '03 --&gt; </p>
<p style="text-indent: 2em">${lastupdata?string("EEEE,MMMM dd, yyyy,hh:mm:ss a '('zzz')'")}&nbsp; &lt;#-- Tuesday,April 08, 2003, 09:24:44 PM (PDT)--&gt; </p>
<p style="text-indent: 2em">1-4、插入布尔值：根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation </p>
<p style="text-indent: 2em">如： </p>
<p style="text-indent: 2em">&lt;#assign foo=ture /&gt; </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">${foo?string("yes","no")} &lt;#-- yes --&gt;</span> </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">2、数字interpolation:</span> </p>
<p style="text-indent: 2em">有两种形式： </p>
<p style="text-indent: 2em">1)、#{expr} </p>
<p style="text-indent: 2em">2)、#{expr;format}：format可以用来格式化数字，format可以是如下： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">mX:小数部分最小X位 </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">MX:小数部分最大X位 </span></p>
<p style="text-indent: 2em">例如： </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">&lt;#assign x=2.582 /&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">&lt;#assign y=4 /&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{x;M2} &lt;#-- 2.58 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{y;M2} &lt;#-- 4 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{x;m1} &lt;#-- 2.582 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{y;m1} &lt;#-- 4.0 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{x;m1M2} &lt;#-- 2.58 --&gt; </span></p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">#{y;m1M2} &lt;#-- 4.0 --&gt; </span></p>
<p style="text-indent: 2em">杂项 </p>
<p style="text-indent: 2em">一、<span style="background-color: #00ff00">用户定义指令</span> </p>
<p style="text-indent: 2em"><span style="background-color: #00ff00">宏</span>和<span style="background-color: #00ff00">变换器变量</span>是两种不同类型的用户自定义指令，他们的区别是： </p>
<p style="text-indent: 2em">宏可以在模板中用macro指令来定义 </p>
<p style="text-indent: 2em">变换器是在模板外由程序定义 </p>
<p style="text-indent: 2em">1、宏：和某个变量关联的模板片段，以便在模板中通过用户自定义指令使用该变量 </p>
<p style="text-indent: 2em">1-1、基本用法： </p>
<p style="text-indent: 2em">例如： </p>
<p style="text-indent: 2em">&lt;#macro greet&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2"&gt; Hello JOE!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">使用时： </p>
<p style="text-indent: 2em">&lt;@greet&gt;&lt;/@greet&gt; </p>
<p style="text-indent: 2em">如果没有体内容也可以用 </p>
<p style="text-indent: 2em">&lt;@greet /&gt; </p>
<p style="text-indent: 2em">1-2、变量： </p>
<p style="text-indent: 2em">1)、可以在宏定义之后定义参数，宏参数是局部变量，只在宏定义中有效。如： </p>
<p style="text-indent: 2em">&lt;#macro greet person&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2"&gt; Hello ${person}!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">使用时： </p>
<p style="text-indent: 2em">&lt;@greet person="emma"&gt; and &lt;@greet person="LEO"&gt; </p>
<p style="text-indent: 2em">输出为： </p>
<p style="text-indent: 2em">&lt;font size="+2"&gt; Hello emma!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2"&gt; Hello LEO!&lt;/font&gt; </p>
<p style="text-indent: 2em">注意：宏的参数是FTL表达式，所以，person=emma和上面的例子中具有不同的意义，这意味着将变量emma的值传给person,这个值可能是任意一种数据类型，甚至是一个复杂的表达式。 </p>
<p style="text-indent: 2em">宏可以有多个参数，使用时参数的次序是无关的，但是只能使用宏中定义的参数，并且对所有参数赋值。如： </p>
<p style="text-indent: 2em">&lt;#macro greet person color&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2" color="${color}"&gt; Hello ${person}!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">使用时： </p>
<p style="text-indent: 2em">&lt;@greet color="black" person="emma" /&gt;正确 </p>
<p style="text-indent: 2em">&lt;@greet person="emma" /&gt;错误，color没有赋值，此时，如果在定义宏时为color定义缺省值&lt;#macro greet person color="black"&gt;这样的话，这个使用方法就是正确的。 </p>
<p style="text-indent: 2em">&lt;@greet color="black" person="emma" bgcolor="yellow" /&gt;错误，宏greet定义中未指定bgcolor这个参数 </p>
<p style="text-indent: 2em">2、嵌套内容： </p>
<p style="text-indent: 2em">2-1、自定义指令可以有嵌套内容，使用&lt;#nested&gt;指令，执行自定义指令开始和结束标记之间的模板片段。例如： </p>
<p style="text-indent: 2em">&lt;#macro greet&gt; </p>
<p style="text-indent: 2em">&lt;p&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;/p&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;@greet&gt;hello Emma!&lt;/@greet&gt; </p>
<p style="text-indent: 2em">输出为 </p>
<p style="text-indent: 2em">&lt;p&gt;hello Emma!&lt;/p&gt; </p>
<p style="text-indent: 2em">2-2、&lt;#nested&gt;指令可以被多次调用，例如 </p>
<p style="text-indent: 2em">&lt;#macro greet&gt; </p>
<p style="text-indent: 2em">&lt;p&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;/p&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;@greet&gt;hello Emma!&lt;/@greet&gt; </p>
<p style="text-indent: 2em">输出为 </p>
<p style="text-indent: 2em">&lt;p&gt; </p>
<p style="text-indent: 2em">hello Emma! </p>
<p style="text-indent: 2em">hello Emma! </p>
<p style="text-indent: 2em">hello Emma! </p>
<p style="text-indent: 2em">hello Emma! </p>
<p style="text-indent: 2em">&lt;/p&gt; </p>
<p style="text-indent: 2em">2-3、嵌套的内容可以是有效的FTL，例如： </p>
<p style="text-indent: 2em">&lt;#macro welcome&gt; </p>
<p style="text-indent: 2em">&lt;p&gt; </p>
<p style="text-indent: 2em">&lt;#nested&gt; </p>
<p style="text-indent: 2em">&lt;/p&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;#macro greet person color="black"&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2" color="${color}"&gt; Hello ${person}!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;@welcome&gt; </p>
<p style="text-indent: 2em">&lt;@greet person="Emma" color="red" /&gt; </p>
<p style="text-indent: 2em">&lt;@greet person="Andrew" /&gt; </p>
<p style="text-indent: 2em">&lt;@greet person="Peter" /&gt; </p>
<p style="text-indent: 2em">&lt;/@welcome&gt; </p>
<p style="text-indent: 2em">输出为： </p>
<p style="text-indent: 2em">&lt;p&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2" color="red"&gt; Hello Emma!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2" color="black"&gt; Hello Andrew!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;font size="+2" color="black"&gt; Hello Peter!&lt;/font&gt; </p>
<p style="text-indent: 2em">&lt;/p&gt; </p>
<p style="text-indent: 2em">2-4、宏定义中的局部变量对嵌套内容是不可见的，例如： </p>
<p style="text-indent: 2em">&lt;#macro repeat count&gt; </p>
<p style="text-indent: 2em">&lt;#local y="test" /&gt; </p>
<p style="text-indent: 2em">&lt;#list 1..count as x&gt; </p>
<p style="text-indent: 2em">${y}${count}/${x}:&lt;#nested /&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;@repeat count=3&gt; </p>
<p style="text-indent: 2em">${y?default("?")} </p>
<p style="text-indent: 2em">${x?default("?")} </p>
<p style="text-indent: 2em">${count?default("?")} </p>
<p style="text-indent: 2em">&lt;/@repeat&gt; </p>
<p style="text-indent: 2em">输出结果为 </p>
<p style="text-indent: 2em">test 3/1:??? </p>
<p style="text-indent: 2em">test 3/2:??? </p>
<p style="text-indent: 2em">test 3/3:??? </p>
<p style="text-indent: 2em">2-5、在宏定义中使用循环变量，通常用来重复嵌套内容，基本用法为：作为nested指令的参数，传递循环变量的实际值，而在调用自定义指令时，在标记的参数后面指定循环变量的名字。 </p>
<p style="text-indent: 2em">例如： </p>
<p style="text-indent: 2em">&lt;#macro repeat count&gt; </p>
<p style="text-indent: 2em">&lt;#list 1..count as x&gt; </p>
<p style="text-indent: 2em">&lt;#nested x,x/2,x==count /&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">&lt;@repeat count=4;c,halfc,last&gt; </p>
<p style="text-indent: 2em">${c}. ${halfc} </p>
<p style="text-indent: 2em">&lt;#if last&gt; </p>
<p style="text-indent: 2em">last! </p>
<p style="text-indent: 2em">&lt;/#if&gt; </p>
<p style="text-indent: 2em">&lt;/@repeat&gt; </p>
<p style="text-indent: 2em">输出结果是 </p>
<p style="text-indent: 2em">1. 0.5 </p>
<p style="text-indent: 2em">2. 1 </p>
<p style="text-indent: 2em">3. 1.5 </p>
<p style="text-indent: 2em">4. 2last! </p>
<p style="text-indent: 2em">注意：指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题 </p>
<p style="text-indent: 2em">调用时，少指定循环变量，多指定的值会不见 </p>
<p style="text-indent: 2em">调用时，多指定循环变量，多余的循环变量不会被创建 </p>
<p style="text-indent: 2em">二、在模板中定义变量 </p>
<p style="text-indent: 2em">1、在模板中定义的变量有三种类型 </p>
<p style="text-indent: 2em">1-1、plain变量：可以在模板的任何地方访问，包括使用include指令插入的模板，使用assign指令创建和替换。 </p>
<p style="text-indent: 2em">1-2、局部变量：在宏定义体中有效，使用local指令创建和替换。 </p>
<p style="text-indent: 2em">1-3、循环变量：只能存在于指令的嵌套内容，由指令(如list)自动创建。 </p>
<p style="text-indent: 2em">注意： </p>
<p style="text-indent: 2em">1)、宏的参数是局部变量，不是循环变量。 </p>
<p style="text-indent: 2em">2)、局部变量隐藏同名的plain变量 </p>
<p style="text-indent: 2em">3)、循环变量隐藏同名的plain变量和局部变量。 </p>
<p style="text-indent: 2em">例如： </p>
<p style="text-indent: 2em">&lt;#assign x="plain"&gt; </p>
<p style="text-indent: 2em">1. ${x} &lt;#-- plain --&gt; </p>
<p style="text-indent: 2em">&lt;@test /&gt; </p>
<p style="text-indent: 2em">6. ${x} </p>
<p style="text-indent: 2em">&lt;#list ["loop"] as x&gt; </p>
<p style="text-indent: 2em">7. ${x} &lt;#-- loop --&gt; </p>
<p style="text-indent: 2em">&lt;#assign x="plain2"&gt; </p>
<p style="text-indent: 2em">8. ${x} &lt;#-- loop --&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">9. ${x} &lt;#-- plain2 --&gt; </p>
<p style="text-indent: 2em">&lt;#macro test&gt; </p>
<p style="text-indent: 2em">2. ${x} &lt;#-- plain --&gt; </p>
<p style="text-indent: 2em">&lt;#local x="local"&gt; </p>
<p style="text-indent: 2em">3. ${x} &lt;#-- local --&gt; </p>
<p style="text-indent: 2em">&lt;#list ["loop"] as x&gt; </p>
<p style="text-indent: 2em">4. ${x} &lt;#-- loop --&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">5. ${x} &lt;#-- local --&gt; </p>
<p style="text-indent: 2em">&lt;/#macro&gt; </p>
<p style="text-indent: 2em">4)、内部循环变量隐藏同名的外部循环变量 </p>
<p style="text-indent: 2em">&lt;#list ["loop1"] as x&gt; </p>
<p style="text-indent: 2em">${x} &lt;#-- loop1 --&gt; </p>
<p style="text-indent: 2em">&lt;#list ["loop2"] as x&gt; </p>
<p style="text-indent: 2em">${x} &lt;#-- loop2 --&gt; </p>
<p style="text-indent: 2em">&lt;#list ["loop3"] as x&gt; </p>
<p style="text-indent: 2em">${x} &lt;#-- loop3 --&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">${x} &lt;#-- loop2 --&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">${x} &lt;#-- loop1 --&gt; </p>
<p style="text-indent: 2em">&lt;/#list&gt; </p>
<p style="text-indent: 2em">5)、模板中的变量会隐藏数据模型中的同名变量，如果需访问数据模型中的变量，使用特殊变量global。 </p>
<p style="text-indent: 2em">例如： </p>
<p style="text-indent: 2em">假设数据模型中的user值为Emma </p>
<p style="text-indent: 2em">&lt;#assign user="Man"&gt; </p>
<p style="text-indent: 2em">${user} &lt;#-- Man --&gt; </p>
<p style="text-indent: 2em">${.global.user} &lt;#-- Emma --&gt; </p>
<img src ="http://www.blogjava.net/ywj-316/aggbug/300168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ywj-316/" target="_blank">junly</a> 2009-10-29 13:23 <a href="http://www.blogjava.net/ywj-316/archive/2009/10/29/300168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>