﻿<?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-不做浮躁的人-随笔分类-freemarker</title><link>http://www.blogjava.net/bjwulin/category/15369.html</link><description>2001开始做pb，我以为java离我很远很远，2004年初不得不转型做java，做java的时候，我以为c++离我很远很远，而2007年开始，我不得不转型做c++...</description><language>zh-cn</language><lastBuildDate>Sat, 28 Apr 2007 04:04:39 GMT</lastBuildDate><pubDate>Sat, 28 Apr 2007 04:04:39 GMT</pubDate><ttl>60</ttl><item><title>freemaker的多栏横向复选框列表组件。</title><link>http://www.blogjava.net/bjwulin/archive/2007/04/28/114287.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Sat, 28 Apr 2007 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/04/28/114287.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/114287.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/04/28/114287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/114287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/114287.html</trackback:ping><description><![CDATA[
		<p>环境：使用fm是2.3.9，webwork2.2.4（使用切换语法）：<br />一：作为components组件的参数如果值为字符串，则需要在字符串上加上单引号。<br />&lt;ww:component template="checkboxlist_portraitCols.ftl"&gt;<br /> &lt;ww:param name="name" value="'test'" /&gt;&lt;!--注意单引号--&gt;<br /> &lt;ww:param name="colCnt" value="4" /&gt;<br /> &lt;ww:param name="list" value="{'1','2','3','4','5','6'}" /&gt;<br />&lt;/ww:component&gt;<br /><br />二：终于理解freemaker的多值类型。<br /><br />&lt;#if (parameters.list?size%parameters.colCnt)?int==0&gt;：求余数是否为0，必须加上内置方法int。<br /><br />freemaker内置了chunk分块的方法，但是我始终没有想到怎么将这个快按纵向进行排列。横向好说，直接按行输出。因此写下列模板代码来实现。<br /><br /><br />&lt;#assign itemCount = 0/&gt;<br />&lt;#if parameters.list??&gt; <br /> &lt;#assign width=(100/parameters.colCnt)?int&gt;<br /> <br /> &lt;#assign itemCount = itemCount + 1/&gt;</p>
		<p> &lt;#assign rowCnt=0/&gt;<br /> &lt;#assign colCnt=0/&gt;<br /> &lt;#list parameters.list?chunk(parameters.colCnt) as row&gt; <br />  &lt;#assign rowCnt=rowCnt+1/&gt;<br />  &lt;tr&gt;<br />  &lt;#list row as cell&gt;<br />   &lt;#assign itemCount = itemCount + 1/&gt;<br />   &lt;#assign colCnt=colCnt+1/&gt;<br />   &lt;#if rowCnt==0 &amp;&amp; col&lt;parameters.colCnt-1 &gt;<br />    &lt;td width='${width}%'&gt;<br />   &lt;#else&gt;<br />    &lt;td&gt;<br />   &lt;/#if&gt;<br />   &lt;#if parameters.listKey??&gt;<br />    &lt;#assign itemKey = cell[parameters.listKey]/&gt;<br />   &lt;#else&gt;<br />     &lt;#assign itemKey = cell/&gt;<br />   &lt;/#if&gt;<br />   <br />   &lt;#if parameters.listValue??&gt;<br />     &lt;#assign itemValue = cell[parameters.listValue]/&gt;<br />   &lt;#else&gt;<br />     &lt;#assign itemValue = cell/&gt;<br />   &lt;/#if&gt;<br />   &lt;#assign itemKeyStr=itemKey.toString() /&gt;<br />    &lt;input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}"&lt;#rt/&gt;<br />   &lt;#if tag.contains(parameters.nameValue, itemKey)&gt;<br />    checked="checked"&lt;#rt/&gt;<br />   &lt;/#if&gt;<br />   &lt;#if parameters.disabled!(false)&gt;<br />    disabled="disabled"&lt;#rt/&gt;<br />   &lt;/#if&gt;<br />   /&gt;<br />   &lt;label for="${parameters.name?html}-${itemCount}" class="checkboxLabel"&gt;${itemValue?html}&lt;/label&gt;<br />   &lt;/td&gt;   <br />  &lt;/#list&gt;<br /> &lt;/#list&gt; <br />&lt;#else&gt;<br />  &amp;nbsp;<br />&lt;/#if&gt;<br /><br />jsp引用页面测试代码：<br />&lt;table width="80%"&gt;<br />&lt;ww:component template="checkboxlist_landscapeCols.ftl"&gt;<br /> &lt;ww:param name="name" value="'test'" /&gt;<br /> &lt;ww:param name="colCnt" value="4" /&gt;<br /> &lt;ww:param name="list" value="{'1','2','3','4','5','6'}" /&gt;<br />&lt;/ww:component&gt;<br />&lt;/table&gt;<br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/114287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-04-28 11:38 <a href="http://www.blogjava.net/bjwulin/archive/2007/04/28/114287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker的多栏纵向复选框列表组件。</title><link>http://www.blogjava.net/bjwulin/archive/2007/04/21/112471.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Sat, 21 Apr 2007 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/04/21/112471.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/112471.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/04/21/112471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/112471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/112471.html</trackback:ping><description><![CDATA[
		<p>环境：使用fm是2.3.9，webwork2.2.4（使用切换语法）：<br />一：作为components组件的参数如果值为字符串，则需要在字符串上加上单引号。<br />&lt;ww:component template="checkboxlist_portraitCols.ftl"&gt;<br /> &lt;ww:param name="name" value="'test'" /&gt;&lt;!--注意单引号--&gt;<br /> &lt;ww:param name="colCnt" value="4" /&gt;<br /> &lt;ww:param name="list" value="{'1','2','3','4','5','6'}" /&gt;<br />&lt;/ww:component&gt;<br /><br />二：终于理解freemaker的多值类型。<br /><br />&lt;#if (parameters.list?size%parameters.colCnt)?int==0&gt;：求余数是否为0，必须加上内置方法int。<br /><br />freemaker内置了chunk分块的方法，但是我始终没有想到怎么将这个快按纵向进行排列。横向好说，直接按行输出。因此写下列模板代码来实现。<br /><br />&lt;#assign itemCount = 0/&gt;<br />&lt;#if parameters.list??&gt;<br /> &lt;#if (parameters.list?size%parameters.colCnt)?int==0&gt;<br />  &lt;#assign rowCnt=(parameters.list?size/parameters.colCnt)?int/&gt;<br /> &lt;#else&gt;<br />  &lt;#assign rowCnt=(parameters.list?size/parameters.colCnt)?int+1/&gt;<br /> &lt;/#if&gt;<br /> <br /> &lt;#assign width=(100/parameters.colCnt)?int&gt;<br /> <br /> &lt;#assign itemCount = itemCount + 1/&gt;</p>
		<p> &lt;#list 0..rowCnt-1 as row&gt;<br />  &lt;tr&gt;<br />  &lt;#list 0..parameters.colCnt?int-1 as col&gt;<br />   &lt;#assign itemCount = itemCount + 1/&gt;<br />   &lt;#if row==0 &amp;&amp; col&lt;parameters.colCnt-1 &gt;<br />    &lt;td width='${width}%'&gt;<br />   &lt;#else&gt;<br />    &lt;td&gt;<br />   &lt;/#if&gt;<br />    &lt;#if row+col*rowCnt&lt;parameters.list?size &gt;<br />     &lt;#assign item=parameters.list[row+col*rowCnt] /&gt;<br />     &lt;#if parameters.listKey??&gt;<br />      &lt;#assign itemKey = item[parameters.listKey]/&gt;<br />       &lt;#else&gt;<br />         &lt;#assign itemKey = item/&gt;<br />       &lt;/#if&gt;<br />       <br />       &lt;#if parameters.listValue??&gt;<br />         &lt;#assign itemValue = item[parameters.listValue]/&gt;<br />       &lt;#else&gt;<br />         &lt;#assign itemValue = item/&gt;<br />       &lt;/#if&gt;<br />       &lt;#assign itemKeyStr=itemKey.toString() /&gt;<br />     &lt;input type="checkbox" name="${parameters.name?html}" value="${itemKeyStr?html}" id="${parameters.name?html}-${itemCount}"&lt;#rt/&gt;<br />       &lt;#if tag.contains(parameters.nameValue, itemKey)&gt;<br />       checked="checked"&lt;#rt/&gt;<br />       &lt;/#if&gt;<br />       &lt;#if parameters.disabled!(false)&gt;<br />       disabled="disabled"&lt;#rt/&gt;<br />       &lt;/#if&gt;<br />     /&gt;<br />     &lt;label for="${parameters.name?html}-${itemCount}" class="checkboxLabel"&gt;${itemValue?html}&lt;/label&gt;<br />    &lt;#else&gt;<br />     &amp;nbsp;<br />    &lt;/#if&gt;<br />   &lt;/td&gt;<br />  &lt;/#list&gt; <br />  &lt;/tr&gt;<br /> &lt;/#list&gt;<br /> <br />&lt;#else&gt;<br />  &amp;nbsp;<br />&lt;/#if&gt;<br />jsp引用页面测试代码：<br />&lt;table width="80%"&gt;<br />&lt;ww:component template="checkboxlist_portraitCols.ftl"&gt;<br /> &lt;ww:param name="name" value="'test'" /&gt;<br /> &lt;ww:param name="colCnt" value="4" /&gt;<br /> &lt;ww:param name="list" value="{'1','2','3','4','5','6'}" /&gt;<br />&lt;/ww:component&gt;<br />&lt;/table&gt;<br /><br /></p>
<img src ="http://www.blogjava.net/bjwulin/aggbug/112471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-04-21 18:21 <a href="http://www.blogjava.net/bjwulin/archive/2007/04/21/112471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker学习笔记--指令参考</title><link>http://www.blogjava.net/bjwulin/archive/2007/03/27/106295.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Mon, 26 Mar 2007 17:04:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/03/27/106295.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/106295.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/03/27/106295.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/106295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/106295.html</trackback:ping><description><![CDATA[一：if指令：<br /><font color="#a03d10">&lt;#if </font><i style="COLOR: #dd4400">condition</i><font color="#a03d10">&gt;<br />  </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">&lt;#elseif </font><i style="COLOR: #dd4400">condition2</i><font color="#a03d10">&gt;<br />  </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">&lt;#elseif </font><i style="COLOR: #dd4400">condition3</i><font color="#a03d10">&gt;<br />  </font><i style="COLOR: #dd4400">...</i><br /><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">&lt;#else&gt;<br />  </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">&lt;/#if&gt;</font><br /><br />二：switch<br /><font color="#a03d10">&lt;#switch </font><i style="COLOR: #dd4400">value</i><font color="#a03d10">&gt;<br />  &lt;#case </font><i style="COLOR: #dd4400">refValue1</i><font color="#a03d10">&gt;<br />    </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">    &lt;#break&gt;<br />  &lt;#case </font><i style="COLOR: #dd4400">refValue2</i><font color="#a03d10">&gt;<br />    </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">    &lt;#break&gt;<br />  </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">  &lt;#case </font><i style="COLOR: #dd4400">refValueN</i><font color="#a03d10">&gt;<br />    </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">    &lt;#break&gt;<br />  &lt;#default&gt;<br />    </font><i style="COLOR: #dd4400">...</i><br /><font color="#a03d10">&lt;/#switch&gt;<br /><br />三：list，break<br />&lt;#list <i style="COLOR: #dd4400">sequence</i> as <i style="COLOR: #dd4400">item</i>&gt;<br />    <i style="COLOR: #dd4400">...</i><br />&lt;/#list&gt;<br /><tt style="COLOR: #a03d10"><font face="Times New Roman">两个特殊的循环变量：</font></tt><br /><tt style="COLOR: #a03d10"><em>item</em>_index</tt>: 当前变量的索引值。<br /><tt style="COLOR: #a03d10"><i style="COLOR: #dd4400">item</i>_has_next</tt>: 是否存在下一个对象。<br /><br />可以用&lt;#break/&gt;指令离开loop循环。<br /><br />四：include指令<br />&lt;#include <i style="COLOR: #dd4400">filename</i>&gt;<br /><tt style="COLOR: #a03d10">或者<br />&lt;#include <i style="COLOR: #dd4400">filename</i><i style="COLOR: #dd4400">options</i>&gt;</tt><br /><tt style="COLOR: #a03d10"><i style="COLOR: #dd4400"><br />filename</i></tt>: 表达式转换为字符串<br /><tt style="COLOR: #a03d10"><i style="COLOR: #dd4400">options</i></tt>: <tt style="COLOR: #a03d10">encoding=<i style="COLOR: #dd4400">encoding</i></tt>, <tt style="COLOR: #a03d10">parse=<i style="COLOR: #dd4400">parse</i></tt><br />   <tt style="COLOR: #a03d10"><i style="COLOR: #dd4400">encoding</i></tt>: 表达式转换为字符串<br />   <tt style="COLOR: #a03d10"><i style="COLOR: #dd4400">parse</i></tt>: 表达式转换为逻辑值，是否作为ftl文件解析。<br />&lt;#include "/common/navbar.html" parse=false encoding="Shift_JIS"&gt;<br /><br /><font color="#000000">&lt;#include "*/footer.ftl"&gt;表示当前目录下以及所有父目录下的文件。<br /></font>如果当前模版在<font face="Courier New">/foo/bar/template.ftl</font><font color="#000000"> ，那么查找footer.ftl的顺序为：<br /></font><tt style="COLOR: #a03d10">/foo/bar/footer.ftl</tt><br /><tt style="COLOR: #a03d10">/foo/footer.ftl</tt><br />/<tt style="COLOR: #a03d10">footer.ftl</tt><br />这种方式讲允许设计者将通用的模版放在父文件夹里面。<br />也可以只指定部分路径：<font color="#000000">&lt;#include "*/commons/footer.ftl"&gt;<br /><br />五：import指令<br /></font>&lt;#import <i style="COLOR: #dd4400">path</i> as <i style="COLOR: #dd4400">hash</i>&gt;<br />六：noparse<br />&lt;#noparse&gt;<br />  <i style="COLOR: #dd4400">...</i><br />&lt;/#noparse&gt;<br /><br />七：compress<br />&lt;#compress&gt;<br />  <i style="COLOR: #dd4400">...</i><br />&lt;/#compress&gt;<br />八：escape，noescape<br />&lt;#escape <i style="COLOR: #dd4400">identifier</i> as <i style="COLOR: #dd4400">expression</i>&gt;<br />  <i style="COLOR: #dd4400">...</i><br />  &lt;#noescape&gt;...&lt;/#noescape&gt;<br />  <i style="COLOR: #dd4400">...</i><br />&lt;/#escape&gt;<br /><br />escape指令body区的ftl的<font color="#000000">interpolations都会被自动加上escape表达式。但是不会影响字符串内的interpolations。而且也只会影响到body内出现的interpolations，比如不会影响到include的ftl的interpolations。<br /></font><p><strong>&lt;#escape x as x?html&gt;</strong><br />  First name: ${firstName}<br />  Last name: ${lastName}<br />  Maiden name: ${maidenName}<br /><b>&lt;/#escape&gt;<br />等同于：<br /></b></p><div align="left">First name: ${firstName<b>?html</b>}<br />  Last name: ${lastName<b>?html</b>}<br />  Maiden name: ${maidenName<b>?html</b>}<br /><br />escape指令在解析模版时起作用，而不是运行时起作用。<br /><br />escape指令还能嵌套使用，子继承父的escape规则。<br /><br /><strong>&lt;#escape x as x?html&gt;</strong><br />  Customer Name: ${customerName}<br />  Items to ship:<br />  <b>&lt;#escape x as itemCodeToNameMap[x]&gt;</b><br />    ${itemCode1}<br />    ${itemCode2}<br />    ${itemCode3}<br />    ${itemCode4}<br />  <b>&lt;/#escape&gt;</b><br /><strong>&lt;/#escape&gt;<br />等同于：<br /></strong>Customer Name: ${customerName?html}<br />  Items to ship:<br />    ${itemCodeToNameMap[itemCode1]?html}<br />    ${itemCodeToNameMap[itemCode2]?html}<br />    ${itemCodeToNameMap[itemCode3]?html}<br />    ${itemCodeToNameMap[itemCode4]?html}<br /><br />九：assign指令<br /><pre class="metaTemplate"><tt style="COLOR: #a03d10">&lt;#assign <i style="COLOR: #dd4400">name</i>=<i style="COLOR: #dd4400">value</i>&gt;</tt>
or
<tt style="COLOR: #a03d10">&lt;#assign <i style="COLOR: #dd4400">name1</i>=<i style="COLOR: #dd4400">value1</i><i style="COLOR: #dd4400">name2</i>=<i style="COLOR: #dd4400">value2</i><i style="COLOR: #dd4400">... nameN</i>=<i style="COLOR: #dd4400">valueN</i>&gt;</tt>
or
<tt style="COLOR: #a03d10">&lt;#assign <i style="COLOR: #dd4400">same as above...</i> in <i style="COLOR: #dd4400">namespacehash</i>&gt;</tt>
or
<tt style="COLOR: #a03d10">&lt;#assign <i style="COLOR: #dd4400">name</i>&gt;
  <i style="COLOR: #dd4400">capture this</i>
&lt;/#assign&gt;</tt>
or
<tt style="COLOR: #a03d10">&lt;#assign <i style="COLOR: #dd4400">name</i> in <i style="COLOR: #dd4400">namespacehash</i>&gt;
  <i style="COLOR: #dd4400">capture this</i>
&lt;/#assign&gt;<br /></tt><br />创建或者替换一个已经存在的变量，只能作用于顶层变量。
不好的做法：&lt;#assign x&gt;Hello ${user}!&lt;/#assign&gt;<br />更改为：&lt;#assign x="Hello ${user}!"&gt;<br /><br /><br /><br /><br /></pre>十：global指令<br />&lt;#global <i style="COLOR: #dd4400">name</i>=<i style="COLOR: #dd4400">value</i>&gt;<br />or<br /><tt style="COLOR: #a03d10">&lt;#global <i style="COLOR: #dd4400">name1</i>=<i style="COLOR: #dd4400">value1</i><i style="COLOR: #dd4400">name2</i>=<i style="COLOR: #dd4400">value2</i><i style="COLOR: #dd4400">... nameN</i>=<i style="COLOR: #dd4400">valueN</i>&gt;</tt><br />or<br /><tt style="COLOR: #a03d10">&lt;#global <i style="COLOR: #dd4400">name</i>&gt;<br />  <i style="COLOR: #dd4400">capture this</i><br />&lt;/#global&gt;</tt><br /><br /><br />十一：local指令<br />&lt;#local <i style="COLOR: #dd4400">name</i>=<i style="COLOR: #dd4400">value</i>&gt;<br />or<br /><tt style="COLOR: #a03d10">&lt;#local <i style="COLOR: #dd4400">name1</i>=<i style="COLOR: #dd4400">value1</i><i style="COLOR: #dd4400">name2</i>=<i style="COLOR: #dd4400">value2</i><i style="COLOR: #dd4400">... nameN</i>=<i style="COLOR: #dd4400">valueN</i>&gt;</tt><br />or<br /><tt style="COLOR: #a03d10">&lt;#local <i style="COLOR: #dd4400">name</i>&gt;<br />  <i style="COLOR: #dd4400">capture this</i><br />&lt;/#local&gt;<br /></tt>只能用于macro的定义body中。<br /><br /><br />十二：setting指令：<br /><br />&lt;#setting <i style="COLOR: #dd4400">name</i>=<i style="COLOR: #dd4400">value</i>&gt;<br />name的取值范围：<br />local：<br /><font face="Courier New">number_format：<br />boolean_format</font>:缺省值为<font face="Courier New">"true,false"<br />date_format, <tt style="COLOR: #a03d10">time_format</tt>, </font><tt style="COLOR: #a03d10">datetime_format<br />time_zone：<br /></tt><font face="Courier New">url_escaping_charset<br />classic_compatible<br /><br />十三：用户自定义指令<br /><pre class="metaTemplate"><tt style="COLOR: #a03d10">&lt;@<i style="COLOR: #dd4400">macro_or_transf</i><i style="COLOR: #dd4400">param1</i>=<i style="COLOR: #dd4400">val1</i><i style="COLOR: #dd4400">param2</i>=<i style="COLOR: #dd4400">val2</i><i style="COLOR: #dd4400">...</i><i style="COLOR: #dd4400">paramN</i>=<i style="COLOR: #dd4400">valN</i>/&gt;</tt><tt style="COLOR: #a03d10">&lt;@<i style="COLOR: #dd4400">macro_or_transf</i><i style="COLOR: #dd4400">param1</i>=<i style="COLOR: #dd4400">val1</i><i style="COLOR: #dd4400">param2</i>=<i style="COLOR: #dd4400">val2</i><i style="COLOR: #dd4400">...</i><i style="COLOR: #dd4400">paramN</i>=<i style="COLOR: #dd4400">valN</i> ; <i style="COLOR: #dd4400">lv1</i>, <i style="COLOR: #dd4400">lv2</i>, <i style="COLOR: #dd4400">...</i>, <i style="COLOR: #dd4400">lvN</i>/&gt;</tt><tt style="COLOR: #a03d10">&lt;@<i style="COLOR: #dd4400">macro_or_transf</i><i style="COLOR: #dd4400">...</i>&gt;
  ...
&lt;/@<i style="COLOR: #dd4400">macro_or_transf</i>&gt;<br /></tt><tt style="COLOR: #a03d10"><br /><br />&lt;@<i style="COLOR: #dd4400">macro_or_transf</i><i style="COLOR: #dd4400">...</i>&gt;
  ...
&lt;/@&gt;</tt><tt style="COLOR: #a03d10">&lt;@<i style="COLOR: #dd4400">macro_or_transf</i><i style="COLOR: #dd4400">val1</i>, <i style="COLOR: #dd4400">val2</i>, <i style="COLOR: #dd4400">...</i>, <i style="COLOR: #dd4400">valN</i>/&gt;</tt><br /><br /></pre>十四：macro,nested,return<br />&lt;#macro <i style="COLOR: #dd4400">name</i><i style="COLOR: #dd4400">param1</i><i style="COLOR: #dd4400">param2</i><i style="COLOR: #dd4400">... paramN</i>&gt;<br />  <i style="COLOR: #dd4400">...</i><br />  &lt;#nested <i style="COLOR: #dd4400">loopvar1</i>, <i style="COLOR: #dd4400">loopvar2</i>, <i style="COLOR: #dd4400">...</i>, <i style="COLOR: #dd4400">loopvarN</i>&gt;<br />  <i style="COLOR: #dd4400">...</i><br />  &lt;#return&gt;<br />  <i style="COLOR: #dd4400">...</i><br />&lt;/#macro&gt;<br /><br />十五：function, return<br />&lt;#function <i style="COLOR: #dd4400">name</i><i style="COLOR: #dd4400">param1</i><i style="COLOR: #dd4400">param2</i><i style="COLOR: #dd4400">... paramN</i>&gt;<br />  <i style="COLOR: #dd4400">...</i> &lt;#return <i style="COLOR: #dd4400">returnValue</i>&gt;<br />  <i style="COLOR: #dd4400">...</i><br />&lt;/#function&gt;<br /><br />&lt;#function avg x y&gt;<br />  &lt;#return (x + y) / 2&gt;<br />&lt;/#function&gt;<br />${avg(10, 20)} <br /><br />十六：flush<br />&lt;#flush&gt;<br /><br />十七：stop<br />&lt;#stop&gt;<br />or<br /><tt style="COLOR: #a03d10">&lt;#stop <i style="COLOR: #dd4400">reason</i>&gt;</tt><br />取消处理模版。<br /><br />十八：ftl指令<br />&lt;#ftl <i style="COLOR: #dd4400">param1</i>=<i style="COLOR: #dd4400">value1</i><i style="COLOR: #dd4400">param2</i>=<i style="COLOR: #dd4400">value2</i><i style="COLOR: #dd4400">...</i><i style="COLOR: #dd4400">paramN</i>=<i style="COLOR: #dd4400">valueN</i>&gt;<br />ftl指令必须放在ftl文件的最上面。<br /><br />参数范围：<br />encoding：<br />strip_whitespace<br />strip_text<br />strict_syntax<br /><br />十九：t, lt, rt<br />二十：attempt, recover<br />&lt;#attempt&gt;<br />  <i style="COLOR: #dd4400">attempt block<br /></i>&lt;#recover&gt;   <br /><i style="COLOR: #dd4400">recover block</i><br />&lt;/#attempt&gt;<br /><br /><div align="left">&lt;#attempt&gt;<br />  Optional content: ${thisMayFails}<br />&lt;#recover&gt;<br />  Ops! The optional content is not available.<br />&lt;/#attempt&gt;<br /></div></font></div></font><img src ="http://www.blogjava.net/bjwulin/aggbug/106295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-03-27 01:04 <a href="http://www.blogjava.net/bjwulin/archive/2007/03/27/106295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker学习笔记--设计指导</title><link>http://www.blogjava.net/bjwulin/archive/2007/03/27/106121.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Mon, 26 Mar 2007 17:03:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/03/27/106121.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/106121.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/03/27/106121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/106121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/106121.html</trackback:ping><description><![CDATA[
		<font face="Courier New">
				<font color="#0000ff">&lt;# ... &gt;</font> 中存放所有freemaker的内容，之外的内容全部原样输出。<br /><font color="#0000ff">&lt;@ ... /&gt;</font> 是函数调用<br />两个定界符内的内容中，第一个符号表示指令或者函数名，其后的跟随参数。freemaker提供的控制包括如下：<br /><font color="#0000ff">&lt;#if condition&gt;&lt;#elseif condition&gt;&lt;#else&gt;&lt;/#if&gt;</font> 条件判断<br /><font color="#0000ff">&lt;#list hash_or_seq as var&gt;&lt;/#list&gt;</font> 遍历hash表或者collection（freemaker称作sequence）的成员<br /><font color="#0000ff">&lt;#macro name param1 param2 ... &gt;&lt;#nested param&gt;&lt;/#macro&gt;</font> 宏，无返回参数<br /><font color="#0000ff">&lt;#function name param1 param2&gt;&lt;#return val&gt;&lt;/#function&gt;</font>函数，有返回参数<br /><font color="#0000ff">var?member_function(...)</font> 用函数对var进行转换，freemaker称为build-ins。实际内部实现类似member_function(var, ...)<br /><font color="#0000ff">stringA[M .. N]</font> 取子字符串，类似substring(stringA, M, N)<br /><font color="#0000ff">{key:value, key2:value2 ...}</font> 直接定义一个hash表<br /><font color="#0000ff">[item0, item1, item2 ...]</font> 直接定义一个序列<br /><font color="#0000ff">hash0[key0]</font> 存取hash表中key对应的元素<br /><font color="#0000ff">seq0[5]</font> 存取序列指定下标的元素<br /><font color="#0000ff">&lt;@function1 param0 param1 ... /&gt;</font> 调用函数function1<br /><font color="#0000ff">&lt;@macro0 param0 param1 ; nest_param0 nest_param1 ...&gt; nest_body &lt;</font></font>
		<a>
				<font face="Courier New" color="#0000ff">/@macro</font>
		</a>
		<font face="Courier New">
				<font color="#0000ff">&gt;</font> 调用宏，并处理宏的嵌套<br /><font color="#0000ff">&lt;#assign var = value &gt;</font> 定义变量并初始化<br /><font color="#0000ff">&lt;#local var = value&gt;</font> 在 macro 或者 function 中定义局部变量并初始化<br /><font color="#0000ff">&lt;#global var = value &gt;</font> 定义全局变量并初始化<br /><font color="#0000ff">${var}</font> 输出并替换为表达式的值<br /><font color="#0000ff">&lt;#visit xmlnode&gt;</font> 调用macro匹配xmlnode本身及其子节点<br /><font color="#0000ff">&lt;#recurse xmlnode&gt;</font> 调用macro匹配xmlnode的子节点</font>
		<br />
		<br />
		<br />
		<font face="Courier New">
				<font color="#a03d10">&lt;#if </font>
				<i style="COLOR: #dd4400">condition</i>
				<font color="#a03d10">&gt;</font>
		</font>
		<tt style="COLOR: #a03d10">&lt;/#if&gt;</tt>
		<br />
		<font face="Courier New">
				<font color="#a03d10">&lt;#list </font>
				<i style="COLOR: #dd4400">SequenceVar</i>
				<font color="#a03d10">as </font>
				<i style="COLOR: #dd4400">variable</i>
				<font color="#a03d10">&gt;</font>
				<i style="COLOR: #dd4400">repeatThis</i>
				<font color="#a03d10">&lt;/#list&gt;<br /></font>
				<font color="#000000">
						<strong>&lt;#include "/copyright_footer.html"&gt;<br /><br />一个ftl标记不能放在另外一个ftl标记里面，但是注释标记能够放在ftl标记里面。<br /><br />系统预定义指令采用&lt;#...&gt;&lt;/#&gt;<br />用户自定义指令采用&lt;@...&gt;&lt;/@&gt;<br /><br />hash片段可以采用：</strong>
						<font color="#a03d10">products[10..19]</font> or <tt style="COLOR: #a03d10">products[5..]</tt> 的格式。<br /><br /><font color="#a03d10">序列也可以做加法计算：passwords + {"joe":"secret42"}</font><br /><br /><p>缺省值: <tt style="COLOR: #a03d10">name!"unknown"</tt> 或者 <tt style="COLOR: #a03d10">(user.name)!"unknown"</tt> 或者 <tt style="COLOR: #a03d10">name!</tt> 或者 <tt style="COLOR: #a03d10">(user.name)!</tt></p><p>null值检查: <tt style="COLOR: #a03d10">name??</tt> or <tt style="COLOR: #a03d10">(user.name)??</tt><br /><br />转义列表：<br /></p><table cellpadding="4" border="1"><thead><tr><th align="left"><p>Escape sequence</p></th><th align="left"><p>Meaning</p></th></tr></thead><tbody><tr><td align="left"><p><tt style="COLOR: #a03d10">\"</tt></p></td><td align="left"><p>Quotation mark (u0022)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\'</tt></p></td><td align="left"><p>Apostrophe (a.k.a. apostrophe-quote) (u0027)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\\</tt></p></td><td align="left"><p>Back slash (u005C)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\n</tt></p></td><td align="left"><p>Line feed (u000A)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\r</tt></p></td><td align="left"><p>Carriage return (u000D)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\t</tt></p></td><td align="left"><p>Horizontal tabulation (a.k.a. tab) (u0009)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\b</tt></p></td><td align="left"><p>Backspace (u0008)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\f</tt></p></td><td align="left"><p>Form feed (u000C)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\l</tt></p></td><td align="left"><p>Less-than sign: <tt style="COLOR: #a03d10">&lt;</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\g</tt></p></td><td align="left"><p>Greater-than sign: <tt style="COLOR: #a03d10">&gt;</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\a</tt></p></td><td align="left"><p>Ampersand: <tt style="COLOR: #a03d10">&amp;</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\{</tt></p></td><td align="left"><p>Curly bracket: <tt style="COLOR: #a03d10">{</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">\x<i style="COLOR: #dd4400">Code</i></tt></p></td><td align="left"><p>Character given with its hexadecimal <a href="file:///C:/Documents%20and%20Settings/Administrator/桌面/freemarker-2.3.9/docs/docs/gloss.html#gloss.unicode"><font color="#002c99">Unicode</font></a> code (<a href="file:///C:/Documents%20and%20Settings/Administrator/桌面/freemarker-2.3.9/docs/docs/gloss.html#gloss.UCS"><font color="#002c99">UCS</font></a> code)</p></td></tr></tbody></table><br />如果想打印${，则需要将{转义，可以写成"$\{user}"，或者可以用生字符（r指令）：$(r "${xx}"}<br /><br />序列构成：&lt;#list <b>["winter", "spring", "summer", "autumn"]</b> as x&gt;${x}&lt;/#list&gt;<br /><br />不同的对象可以存放在一个序列里面，比如：<font color="#a03d10">[2 + 2, [1, 2, 3, 4], "whatnot"]</font>. 第一个是数字，第二个是序列，第三个是字符串。<br /><br />可用采用start..end的方式来定义一个数字序列，start可以小于end，同时，end也可以省略。<br /><br />hash取值支持一下四种模式：<font color="#a03d10">book.author.name</font>, <tt style="COLOR: #a03d10">book["author"].name</tt>, <tt style="COLOR: #a03d10">book.author.["name"]</tt>, <tt style="COLOR: #a03d10">book["author"]["name"]</tt>.<br /><p>特殊变量是指freemaker引擎本身定义的变量。访问时，以.variable_name的语法访问。<br /><br />变量表达式支持嵌套模式，比如：${"Hello ${user}!"}。<br /><br />变量表达式在指令中的使用情况：<br />变量表达式可以在指令中，用“”的方式存在，不如：<font color="#a03d10">&lt;#include "/footer/${company}.html"&gt;</font>. <br />但是不允许下面的方式存在： <tt style="COLOR: #a03d10">&lt;#if ${isBig}&gt;Wow!&lt;/#if&gt;</tt>, 正确写法是：<tt style="COLOR: #a03d10">&lt;#if isBig&gt;Wow!&lt;/#if&gt;</tt>. <br />而且 <tt style="COLOR: #a03d10">&lt;#if "${isBig}"&gt;Wow!&lt;/#if&gt;写法也不正确，因为"${isBig}"返回的是字符串，不是boolean类型。<br /></tt><br />字符串中取字符或字符串采用以下语法：${user[0]},${user[0..2]} ${user[4..]},${user?string(4)}<br /><br />序列操作：<br />   加法：&lt;#list ["Joe", "Fred"] + ["Julia", "Kate"] as user&gt; 但要注意串联之后的读取速度变慢。<br />   子序列：<font color="#a03d10">seq[1..4]<br /><br />序列和hash的串联都只能用于两个相加，不能有多个相加的模式，hash相加，如果两个相加的hash存在相同的key，则后面会覆盖前面的。<br /></font><br />在使用&gt;=或者&gt;时，需要注意一些问题，因为freemaker会将&gt;解释成标记的关闭符，为了解决这个问题，需要在表达式加上括号，比如： <tt style="COLOR: #a03d10">&lt;#if (x &gt; y)&gt;</tt>. 或者使用 <tt style="COLOR: #a03d10">&amp;gt;</tt> and <tt style="COLOR: #a03d10">&amp;lt符号来代替。</tt><br /><br />无值变量（包括无该变量，null，返回void，无属性等）：<em><font color="#dd4400">unsafe_expr</font></em><font color="#a03d10">!</font><i style="COLOR: #dd4400">default_expr</i> or <tt style="COLOR: #a03d10"><i style="COLOR: #dd4400">unsafe_expr</i>!</tt> or <tt style="COLOR: #a03d10">(<i style="COLOR: #dd4400">unsafe_expr</i>)!<i style="COLOR: #dd4400">default_expr</i></tt> or <tt style="COLOR: #a03d10">(<i style="COLOR: #dd4400">unsafe_expr</i>)!<br /></tt>缺省值可以是任何类型，不一定是数字，比如：<font color="#a03d10">hits!0</font> 或者 <tt style="COLOR: #a03d10">colors!["red", "green", "blue"]</tt>. <br /><br />如果缺省值忽略，那么将会默认为空串、空序列或者空hash，因为freemarker支持多类型的值。不过要让默认值为0或false，则不能省略缺省值。<br /><br />非顶层变量的无值处理：<br />   product.color!"red"：只处理product不为空，color为空的缺省值处理，如果product为空，则freemaker会抛出异常。(product.color)!"red"：则会处理product为空，color为空，或者没有color属性的无值情况。<br /><br />无值变量的判断操作：<em><font color="#dd4400">unsafe_expr</font></em><font color="#a03d10">??</font> or <tt style="COLOR: #a03d10">(<i style="COLOR: #dd4400">unsafe_expr</i>)??<br /></tt></p>判断变量是否是无值。<br /><br />普通变量插入方式: <tt style="COLOR: #a03d10">${<i style="COLOR: #dd4400">expression</i>},${3+5);<br /></tt>数字变量插入方式: <tt style="COLOR: #a03d10">#{<i style="COLOR: #dd4400">expression</i>}</tt> or <tt style="COLOR: #a03d10">#{<i style="COLOR: #dd4400">expression</i>; <i style="COLOR: #dd4400">format</i>}：过期。<br />变量只能用于文本区或者是字符串里面，比如：&lt;h1&gt;Hello ${name}!&lt;/h1&gt;<font color="#000000">以及 <tt style="COLOR: #a03d10">&lt;#include "/footer/${company}.html"&gt;<br /><br />数字值的插入：根据缺省的number_format输出，以及可以通过setting来达到设置数字格式的目的，也可以通过内置函数string来改变输出格式。<br /><br />日期类型的格式设置：date_format<font color="#000000">, </font><tt style="COLOR: #a03d10">time_format</tt><font color="#000000"> 和 </font><tt style="COLOR: #a03d10">datetime_format</tt><font color="#000000"><br /><br /><br /></font>定义宏：<br />   不带参数：<b>&lt;#macro 宏名&gt;...</b><b>&lt;/#macro&gt;，引用&lt;@宏名 /&gt;<br /></b>   带参数：<strong>&lt;#macro 宏名 参数...&gt;...&lt;/#macro&gt;，引用&lt;@宏名 参数1=值1.../&gt;，带有参数的宏，调用是参数的值必须和参数的个数相同。当然也可以在宏定义时给参数一些默认值。比如：&lt;#</strong><font color="#000000">macro greet person color<strong>="black"</strong>&gt;<br /></font><br /><br />宏里面的嵌套内容：<br />&lt;<font color="#000000">#macro border&gt;<br />  &lt;table border=4 cellspacing=0 cellpadding=4&gt;&lt;tr&gt;&lt;td&gt;<br />    <b>&lt;#nested&gt;</b><br />  &lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;<br />&lt;/#macro&gt; <br />在宏的定义body中加入&lt;#nested&gt;指令。嵌套的内容可以是任何正确的ftl块。<br /><br />宏的本地变量在嵌套内容中是不可见的。<br /><br />宏定义时，&lt;#nest&gt;指令相当于调用定义的内容，而使用宏时，nest body相当于定义。<br /></font><pre class="smallpre" style="MARGIN: 0px">&lt;#macro repeat count&gt;
  &lt;#list 1..count as x&gt;
    &lt;#nested <b>x, x/2, x==count</b>&gt;
  &lt;/#list&gt;
&lt;/#macro&gt;
&lt;@repeat count=4 ; <b>c, halfc, last</b>&gt;
  ${<b>c</b>}. ${<b>halfc</b>}&lt;#if <b>last</b>&gt; Last!&lt;/#if&gt;
&lt;/@repeat&gt; <span style="FONT-SIZE: 1pt"><br /></span></pre><br /><br />定义变量：<br />   在模板中定义的变量将会隐藏（不是更改）数据模型根下面的同名的变量。<br /><br />模板中的3种类型变量：<br />   1：<strong>plain variables，能够在模板中的任何地方访问，一个模板include另外一个模板，也可以访问被包含模板的变量。可以通过assign或者macro指令产生或替换变量。<br />   如果要访问数据模型中的变量，则可以通过.global来访问：<br /></strong>   &lt;#assign user = "Joe Hider"&gt;<br />   ${user}          &lt;#-- prints: Joe Hider --&gt;<br />   ${.globals.user} &lt;#-- prints: Big Joe--&gt; <br />   2：<strong>Local variables，宏定义body中用local指令创建或者替换。<br />   3：Loop variables:由list指令产生。<br /></strong><br /><br /></tt></font>namespaces:<br />&lt;#import "/lib/my_test.ftl" as <b>my</b>&gt; &lt;#-- the hash called "my" will be the "gate" --&gt;<br />&lt;@<b>my</b>.copyright date="1999-2002"/&gt;<br />${<b>my</b>.mail} <span style="FONT-SIZE: 1pt"><br /></span><br />设置命名空间里面的变量：&lt;#assign mail="jsmith@other.com" <b>in my</b>&gt;<br /><br />命名空间与数据模型：命名空间的ftl可以访问数据模型的变量。同样命名空间的变量也会隐藏数据模型中同名的变量。<br /><br />空白问题：<br />1：White-space stripping，默认为enabled，清除ftl标记带来的空白以及缩进。处理模板的空白。<br />2：t, <tt style="COLOR: #a03d10">rt</tt>, <tt style="COLOR: #a03d10">lt指令。<br /></tt>3：ftl的参数strip_text.<br /><br />用compress directive或者transform来处理输出。<br />&lt;#compress&gt;<i style="COLOR: #dd4400">...</i>&lt;/#compress&gt;：消除空白行。<br />&lt;@compress single_line=true&gt;<i style="COLOR: #dd4400">...</i><a>/@compress</a>将输出压缩为一行。<br /><br />可替换语法：<br />freemarker可用"["代替"&lt;".在模板的文件开头加上<strong>[#ftl].</strong><br /></tt></font>
		</font>
<img src ="http://www.blogjava.net/bjwulin/aggbug/106121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-03-27 01:03 <a href="http://www.blogjava.net/bjwulin/archive/2007/03/27/106121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker学习笔记--其它内置方法</title><link>http://www.blogjava.net/bjwulin/archive/2007/03/26/106271.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Sun, 25 Mar 2007 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/03/26/106271.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/106271.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/03/26/106271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/106271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/106271.html</trackback:ping><description><![CDATA[一：数字型<br />&lt;#assign answer=42/&gt;<br />${answer}<br />${answer?string}  &lt;#-- the same as ${answer} --&gt;<br />${answer?string.number}<br />${answer?string.currency}<br />${answer?string.percent}<br /><br />&lt;#setting number_format="0.###E0"/&gt;<br /><br />${12345?string("0.####E0")} <span style="FONT-SIZE: 1pt"> <br /><br /></span><br /><tt style="COLOR: #a03d10">${answer?string("number")}</tt> 等同于：<font face="Courier New" color="#a03d10">${answer?string.number}</font>.<br /><br />二：日期型：<br />预定义格式包括：short ，middle和long。<br /><br /><pre class="smallpre" style="MARGIN: 0px">${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
</pre>组合使用：${lastUpdated?string.short_long}<br />${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}<br /><br />三：逻辑型<br /><font face="Courier New" color="#a03d10">foo?string<br /><tt style="COLOR: #a03d10">foo?string("yes", "no")<br /></tt></font><br />四：序列的内置方法：<br />first<br /><br />last<br /><br />seq_contains<br />${x?seq_contains("blue")?string("yes", "no")}<br /><br />seq_index_of<br /><br />seq_last_index_of<br /><br />reverse<br /><br />size<br /><br />sort<br /><br />sort_by<br />多层次的hash排序<br /><br />&lt;#assign members = [<br />    {"name": {"first": "Joe", "last": "Smith"}, "age": 40},<br />    {"name": {"first": "Fred", "last": "Crooger"}, "age": 35},<br />    {"name": {"first": "Amanda", "last": "Fox"}, "age": 25}]&gt;<br />Sorted by name.last: <br />&lt;#list members?sort_by(['name', 'last']) as m&gt;<br />- ${m.name.last}, ${m.name.first}: ${m.age} years old<br />&lt;/#list&gt; <br /><br />chunk：将一个序列分解成几个序列。<br /><br />&lt;#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']&gt;<br /><br />&lt;#list seq?chunk(4) as row&gt;<br />  &lt;#list row as cell&gt;${cell} &lt;/#list&gt;<br />&lt;/#list&gt;<br /><br />&lt;#list seq?chunk(4, '-') as row&gt;<br />  &lt;#list row as cell&gt;${cell} &lt;/#list&gt;<br />&lt;/#list&gt;<br />chunk经常用于分栏或者表格输出的格式。<br /><br />五：hash内置方法：<br /><br />keys：<br />values：<br /><br />六：很少使用或者专家级的内置方法：<br />byte,double,float,int,long,short。<br /><br />eval<br /><br />has_content：变量存在，不是指null也不是空串，一般情况下可以使用<font face="Courier New" color="#a03d10">expr!?size &gt; 0</font> or <tt style="COLOR: #a03d10">expr!?length &gt; 0</tt> 代替<tt style="COLOR: #a03d10">expr?has_content</tt>。<br /><br />interpret将一个字符串解析为ftl模版，产生一个<font face="Courier New" color="#a03d10">TemplateTransformModel对象。<br /></font>&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;def<a>/@inlineTemplate</a><br /><br />is_...检查变量类型：<br /><table cellpadding="4" border="1"><thead><tr><th align="left"><p>Built-in</p></th><th align="left"><p>Returns <tt style="COLOR: #a03d10">true</tt> if the value is a ...</p></th></tr></thead><tbody><tr><td align="left"><p><tt style="COLOR: #a03d10">is_string</tt></p></td><td align="left"><p>string</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_number</tt></p></td><td align="left"><p>number</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_boolean</tt></p></td><td align="left"><p>boolean</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_date</tt></p></td><td align="left"><p>date (all types: date-only, time-only and date-time)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_method</tt></p></td><td align="left"><p>method</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_transform</tt></p></td><td align="left"><p>transform</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_macro</tt></p></td><td align="left"><p>macro</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_hash</tt></p></td><td align="left"><p>hash</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_hash_ex</tt></p></td><td align="left"><p>extended hash (i.e. supports <tt style="COLOR: #a03d10">?keys</tt> and <tt style="COLOR: #a03d10">?values</tt>)</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_sequence</tt></p></td><td align="left"><p>sequence</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_collection</tt></p></td><td align="left"><p>collection</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_enumerable</tt></p></td><td align="left"><p>sequence or collection</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_indexable</tt></p></td><td align="left"><p>sequence</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_directive</tt></p></td><td align="left"><p>macro or transform</p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">is_node</tt></p></td><td align="left"><p>node</p></td></tr></tbody></table><br />namespace：返回宏变量的命名空间，只能用于宏。<br /><br />new：创建一个TemplateModel实现的变量。<br />&lt;#assign word_wrapp = "com.acmee.freemarker.WordWrapperTransform"?new()&gt;<br /><img src ="http://www.blogjava.net/bjwulin/aggbug/106271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-03-26 00:04 <a href="http://www.blogjava.net/bjwulin/archive/2007/03/26/106271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker学习笔记--字符串内置方法</title><link>http://www.blogjava.net/bjwulin/archive/2007/03/25/106264.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Sun, 25 Mar 2007 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/03/25/106264.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/106264.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/03/25/106264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/106264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/106264.html</trackback:ping><description><![CDATA[
		<p>一：字符串内置方法<br />      <font face="Courier New"><font color="#a03d10">substring(</font><i style="COLOR: #dd4400">from</i><font color="#a03d10">, </font><i style="COLOR: #dd4400">toExclusive</i><font color="#a03d10">)<br />  <br />   cap_first<br /><br />   <font color="#000000">uncap_first<br /><br />   capitalize<br /><br />   chop_linebreak<br /><br />   date, time, datetime:<br /></font>   <font color="#000000">&lt;#assign test1 = "10/25/1995"?date("MM/dd/yyyy")&gt;<br />   &lt;#assign test2 = "15:05:30"?time("HH:mm:ss")&gt;<br />   &lt;#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")&gt;<br /></font><br />   <font color="#000000">ends_with<br /><br />   html<br />   <tt style="COLOR: #a03d10">&lt;</tt> replaced with <tt style="COLOR: #a03d10">&amp;lt;</tt> <br />   <tt style="COLOR: #a03d10">&gt;</tt> replaced with <tt style="COLOR: #a03d10">&amp;gt;</tt> <br />   <tt style="COLOR: #a03d10">&amp;</tt> replaced with <tt style="COLOR: #a03d10">&amp;amp;</tt> <br />   <tt style="COLOR: #a03d10">"</tt> replaced with <tt style="COLOR: #a03d10">&amp;quot;</tt> <br /></font><br />   <font color="#000000">groups用于</font><font color="#a03d10">matches的结果。<br /><br />   <font color="#000000">index_of<br /><br />   j_string<br /><br />   js_string<br /></font><br />   <font color="#000000">last_index_of<br /><br />   length<br /><br />   lower_case<br /><br />   left_pad<br /><br />   right_pad<br /><br />   contains<br /><br />   matchs<br />   返回boolean或者sequence。<br />   &lt;#if "fxo"?matches("f.?o")&gt;Matches.&lt;#else&gt;Does not match.&lt;/#if&gt;<br />   &lt;#assign res = "foo bar fyo"?matches("f.?o")&gt;<br />   &lt;#if res&gt;Matches.&lt;#else&gt;Does not match.&lt;/#if&gt;<br />   Matching sub-strings:<br />   &lt;#list res as m&gt;<br />   - ${m}<br />   &lt;/#list&gt;<br />   res就是典型的多值类型。<br /><br />   如果正则表达式包含组（圆括号），可以通过groups访问。<br />   &lt;#assign res = "aa/rx; ab/r;"?matches("(\\w[^/]+)/([^;]+);")&gt;<br />   &lt;#list res as m&gt;<br />   - ${m} is ${m?groups[1]} per ${m?groups[2]}<br />   &lt;/#list&gt; <span style="FONT-SIZE: 1pt"></span></font></font></font></font></p>
		<p>   number<br /><br />   replace<br /><br />   rtf<br />   <tt style="COLOR: #a03d10">\</tt> replaced with <tt style="COLOR: #a03d10">\\<br /></tt><tt style="COLOR: #a03d10">   {</tt> replaced with <tt style="COLOR: #a03d10">\{<br /></tt><tt style="COLOR: #a03d10">   }</tt> replaced with <tt style="COLOR: #a03d10">\}<br /></tt></p>
		<div align="left">
				<br />   url<br />   将所有url的保留字符进行转码。<br />   <font face="Courier New" color="#a03d10">url_escaping_charset<br /> <br /></font>  split <span style="FONT-SIZE: 1pt"></span></div>
		<p>  starts_with<br /><br />   trim，upper_case。word_list，xml<br /><br />   字符串内置方法可以接受的通用标记：<br />   <tt style="COLOR: #a03d10">i</tt>: 大小写不敏感。<br /><tt style="COLOR: #a03d10"> f</tt>: 只用于第一个，常用于替换，查找等，取第一次出现<br /><tt style="COLOR: #a03d10"> r</tt>: 子串是个正则表达式。<br /><tt style="COLOR: #a03d10"> m</tt>: 正则表达式的多行模式。<br />   <tt style="COLOR: #a03d10">s</tt>: 单行模式。<br /><tt style="COLOR: #a03d10"> c</tt>: 允许空白或注释在正则表达式中。<br />&lt;#assign s = 'foo bAr baar'&gt;<br />${s?replace('ba', 'XY')}<br />i: ${s?replace('ba', 'XY', 'i')}<br />if: ${s?replace('ba', 'XY', 'if')}<br />r: ${s?replace('ba*', 'XY', 'r')}<br />ri: ${s?replace('ba*', 'XY', 'ri')}<br />rif: ${s?replace('ba*', 'XY', 'rif')}<br /><br /><br /></p>
		<table cellpadding="4" border="1">
				<thead>
						<tr>
								<th align="left">
										<p>Built-in</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">i</tt>
										</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">r</tt>
										</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">m</tt>
										</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">s</tt>
										</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">c</tt>
										</p>
								</th>
								<th align="left">
										<p>
												<tt style="COLOR: #a03d10">f</tt>
										</p>
								</th>
						</tr>
				</thead>
				<tbody>
						<tr>
								<td align="left">
										<p>
												<tt style="COLOR: #a03d10">replace</tt>
										</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
						</tr>
						<tr>
								<td align="left">
										<p>
												<tt style="COLOR: #a03d10">split</tt>
										</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>Only with <tt style="COLOR: #a03d10">r</tt></p>
								</td>
								<td align="left">
										<p>No</p>
								</td>
						</tr>
						<tr>
								<td align="left">
										<p>
												<tt style="COLOR: #a03d10">match</tt>
										</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>No</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>Yes</p>
								</td>
								<td align="left">
										<p>No</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/bjwulin/aggbug/106264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-03-25 21:38 <a href="http://www.blogjava.net/bjwulin/archive/2007/03/25/106264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>freemaker学习笔记--编码指导</title><link>http://www.blogjava.net/bjwulin/archive/2007/03/25/106255.html</link><dc:creator>不做浮躁的人</dc:creator><author>不做浮躁的人</author><pubDate>Sun, 25 Mar 2007 13:38:00 GMT</pubDate><guid>http://www.blogjava.net/bjwulin/archive/2007/03/25/106255.html</guid><wfw:comment>http://www.blogjava.net/bjwulin/comments/106255.html</wfw:comment><comments>http://www.blogjava.net/bjwulin/archive/2007/03/25/106255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bjwulin/comments/commentRss/106255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bjwulin/services/trackbacks/106255.html</trackback:ping><description><![CDATA[
		<p>1、配置对象：<br />Configuration cfg = new Configuration();<br />cfg.setDirectoryForTemplateLoading(new File("<i>/where/you/store/templates</i>"));<br />cfg.setObjectWrapper(new DefaultObjectWrapper()); <br /><br /><br />2：得到模板对象：<br />Template temp = cfg.getTemplate("test.ftl"); <br /><font face="Courier New" color="#a03d10">Configuration对Template对象进行缓存。<br /></font><br />3：合并模板和数据模型：<br />Writer out = new OutputStreamWriter(System.out);<br />temp.process(root, out);<br />out.flush(); <span style="FONT-SIZE: 1pt"><br /></span><br /><br />4：数据模型：<br />      任何模板要使用的数据模型都是通过<strong>object wrapping将传入的对象包装成实现</strong><font face="Courier New" color="#a03d10">TemplateModel接口的对象。<br /></font>      TemplateModel提供几个下级接口：<font face="Courier New" color="#a03d10">TemplateSequenceModel等。</font><br /><br />5：单值模型：Scalars   <br />      Boolean <br />      Number <br />      String <br />      Date </p>
		<p>
				<font face="Courier New">
						<font color="#a03d10">  Template</font>
						<i style="COLOR: #dd4400">Type</i>
						<font color="#a03d10">Model<br /></font>
				</font>6：方法    <br />public class IndexOfMethod implements TemplateMethodModel {<br />    <br />    public TemplateModel exec(List args) throws TemplateModelException {<br />        if (args.size() != 2) {<br />            throw new TemplateModelException("Wrong arguments");<br />        }<br />        return new SimpleNumber(<br />            ((String) args.get(1)).indexOf((String) args.get(0)));<br />    }<br />} </p>
		<p>root.put("indexOf", new IndexOfMethod()); <br /><br />&lt;#assign x = "something"&gt;<br />${indexOf("met", x)}<br />${indexOf("foo", x)} <span style="FONT-SIZE: 1pt"></span></p>
		<div align="left">7：Transforms<br />   import java.io.*;<br />import java.util.*;<br />import freemarker.template.TemplateTransformModel;<br /><br />class UpperCaseTransform implements TemplateTransformModel {<br /><br />    public Writer getWriter(Writer out, Map args) {<br />        return new UpperCaseWriter(out);<br />    }<br /><br />    private class UpperCaseWriter extends Writer {<br />       <br />        private Writer out;<br />           <br />        UpperCaseWriter (Writer out) {<br />            this.out = out;<br />        }<br /><br />        public void write(char[] cbuf, int off, int len)<br />                throws IOException {<br />            out.write(new String(cbuf, off, len).toUpperCase());<br />        }<br /><br />        public void flush() throws IOException {<br />            out.flush();<br />        }<br /><br />        public void close() {<br />        }<br />    }<br />}<br /><br />root.put("upperCase", new UpperCaseTransform());<br /><br />&lt;@upperCase&gt;<br />blah2<br />blah3<br />&lt;/@upperCase&gt;<br /><br />8：访问freemarker的环境变量：<font face="Courier New" color="#a03d10">Environment.getCurrentEnvironment()</font>. <br /><br />9：共享变量是指所有模板都能访问的变量，在configuration中设置。<br />      cfg.setSharedVariable("to_upper", new UpperCaseTransform());<br />      cfg.setSharedVariable("company", "Foo Inc.");      <br /><br />      数据模型中的变量将会隐藏同名的共享变量。<br /><br />      <font face="Courier New" color="#a03d10">TemplateModel</font>的实现不是线层安全的，因此不能用于共享变量。<br /><br />      预置共享变量：<br />       
<table cellpadding="4" border="1"><thead><tr><th align="left"><p>name</p></th><th align="left"><p>class</p></th></tr></thead><tbody><tr><td align="left"><p><tt style="COLOR: #a03d10">capture_output</tt></p></td><td align="left"><p><tt style="COLOR: #a03d10">freemarker.template.utility.CaptureOutput</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">compress</tt></p></td><td align="left"><p><tt style="COLOR: #a03d10">freemarker.template.utility.StandardCompress</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">html_escape</tt></p></td><td align="left"><p><tt style="COLOR: #a03d10">freemarker.template.utility.HtmlEscape</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">normalize_newlines</tt></p></td><td align="left"><p><tt style="COLOR: #a03d10">freemarker.template.utility.NormalizeNewlines</tt></p></td></tr><tr><td align="left"><p><tt style="COLOR: #a03d10">xml_escape</tt></p></td><td align="left"><p><tt style="COLOR: #a03d10">freemarker.template.utility.XmlEscape</tt></p></td></tr></tbody></table> <br />10：设置层次：configuration, template, runtime environment<br /><br /><span style="FONT-SIZE: 1pt">   </span> </div>
<img src ="http://www.blogjava.net/bjwulin/aggbug/106255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bjwulin/" target="_blank">不做浮躁的人</a> 2007-03-25 21:38 <a href="http://www.blogjava.net/bjwulin/archive/2007/03/25/106255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>