<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java豆技术站点 &#187; Freemarker</title>
	<atom:link href="http://javadou.com/tag/freemarker/feed/" rel="self" type="application/rss+xml" />
	<link>http://javadou.com</link>
	<description>Java</description>
	<lastBuildDate>Thu, 12 Aug 2010 09:01:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>struts2 rest freemarker实战项目下载struts2 教程 rest plugin</title>
		<link>http://javadou.com/struts2-rest-freemarker-struts2-rest-plugin-567/</link>
		<comments>http://javadou.com/struts2-rest-freemarker-struts2-rest-plugin-567/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 01:18:50 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[Guice]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/struts2-rest-freemarker%e5%ae%9e%e6%88%98%e9%a1%b9%e7%9b%ae%e4%b8%8b%e8%bd%bdstruts2-%e6%95%99%e7%a8%8b-rest-plugin-567/</guid>
		<description><![CDATA[网站上很多网友都看了前面的那篇文章Struts 2 的REST 支持基础教程 收获很多 但是想现在一个项目来实战一下，应广大网友的支持 我把在公司的一个项目(struts2 rest freemarker实战项目)分享一下给大家，里面用了Google Guic... ]]></description>
			<content:encoded><![CDATA[<p>网站上很多网友都看了前面的那篇文章<a href="/struts2-rest-for-183/" target="_blank">Struts 2 的REST 支持基础教程</a><br />
收获很多 但是想现在一个项目来实战一下，应广大网友的支持 我把在公司的一个项目(struts2 rest freemarker实战项目)分享一下给大家，里面用了Google Guice还有struts2 rest插件 完全不需要配置任何的文件就可以写一个action 很方便 项目当中还实用了freemarker很多技术都在里面哦 大家一定要珍惜这个项目啊 欢迎留言交流！</p>
<p>下载<a href="http://60.12.73.46/down/upload/lovebay-gift.rar">struts2 rest freemarker</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/struts2-rest-freemarker-struts2-rest-plugin-567/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使 Hibernate Tools生成注释</title>
		<link>http://javadou.com/hibernate-tools-create-marke-430/</link>
		<comments>http://javadou.com/hibernate-tools-create-marke-430/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 12:24:09 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[hibernate]]></category>

		<guid isPermaLink="false">http://javadou.com/?p=430</guid>
		<description><![CDATA[&160;&160;&160; 最近做项目时，使用Hibernate Tools 3.2.4生成entity和hbm.xml，但默认情况下，DB中的comments没法生成到javadoc和xml中，改了templates倒是有注释了，但却是乱码，心里一直耿耿于怀&8230;（这不符合咱一直强调的编... ]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 最近做项目时，使用Hibernate Tools 3.2.4生成entity和hbm.xml，但默认情况下，DB中的comments没法生成到javadoc和xml中，改了templates倒是有注释了，但却是乱码，心里一直耿耿于怀&#8230;（这不符合咱一直强调的编码规范不是？最主要的是人懒，有时用entity不想再找文档）。在网上找了半天，大多说是freemarker编码设置问题，但不管怎么设置，都没一点效果，决定自己动手。下了源码，查到原因，人家压根就没处理中文问题。记录一下处理过程。<br />
  <br />ftl是freemarker模板，可以通过在jar包外使用，java和properties重新打包替换hibernate-tools.jar，如果是eclipse-plugins，jar包在plugins\org.hibernate.eclipse_3.2.4.GA-R200905070146-H18\lib\tools\hibernate-tools.jar </p>
<p>pojo\PojoFields.ftl</p>
<pre class="html">&lt;#-- // Fields --&gt;

&lt;#foreach field in pojo.getAllPropertiesIterator()&gt;&lt;#if pojo.getMetaAttribAsBool(field, &quot;gen-property&quot;, true)&gt;    /** *//** *//** *//**
&lt;#if pojo.hasMetaAttribute(field, &quot;field-description&quot;)&gt;
     ${pojo.getFieldJavaDoc(field, 0)}
&lt;/#IF&gt;
&lt;#foreach column in field.columnIterator&gt;&lt;#if column.comment?exists &amp;&amp; column.comment?trim?length!=0&gt;     * ${column.comment}.
&lt;/#IF&gt;
&lt;/#FOREACH&gt;
     */
    ${pojo.getFieldModifiers(field)} ${pojo.getJavaTypeName(field, jdk5)} ${field.name}&lt;#if pojo.hasFieldInitializor(field, jdk5)&gt; = ${pojo.getFieldInitialization(field, jdk5)}&lt;/#IF&gt;;
&lt;/#IF&gt;
&lt;/#FOREACH&gt;</pre>
<p>pojo\PojoPropertyAccessors.ftl </p>
<pre class="html">&lt;#-- // Property accessors --&gt;
&lt;#foreach property in pojo.getAllPropertiesIterator()&gt;
&lt;#if pojo.getMetaAttribAsBool(property, &quot;gen-property&quot;, true)&gt;
    /** *//**
&lt;#if pojo.hasFieldJavaDoc(property)&gt;
     * ${pojo.getFieldJavaDoc(property, 4)}
&lt;/#IF&gt;
&lt;#foreach column in property.columnIterator&gt;&lt;#if column.comment?exists &amp;&amp; column.comment?trim?length!=0&gt;     * 取得 ${column.comment}.
&lt;/#IF&gt;
&lt;/#FOREACH&gt;
     */
    &lt;#include &quot;GetPropertyAnnotation.ftl&quot;/&gt;
    ${pojo.getPropertyGetModifiers(property)} ${pojo.getJavaTypeName(property, jdk5)} ${pojo.getGetterSignature(property)}() {
        return this.${property.name};
    }

    /** *//**
&lt;#if pojo.hasFieldJavaDoc(property)&gt;
     * ${pojo.getFieldJavaDoc(property, 4)}
&lt;/#IF&gt;
&lt;#foreach column in property.columnIterator&gt;&lt;#if column.comment?exists &amp;&amp; column.comment?trim?length!=0&gt;     * 设置 ${column.comment}.
&lt;/#IF&gt;
&lt;/#FOREACH&gt;
     */
    ${pojo.getPropertySetModifiers(property)} void set${pojo.getPropertyName(property)}(${pojo.getJavaTypeName(property, jdk5)} ${property.name}) {
        this.${property.name} = ${property.name};
    }
&lt;/#IF&gt;
&lt;/#FOREACH&gt;</pre>
<p>org\hibernate\tool\hbm2x\TemplateProducer.java </p>
<pre class="java">public void produce(Map additionalContext, String templateName, File destination, String identifier, String fileType, String rootContext) {

        String tempResult = produceToString( additionalContext, templateName, rootContext );

        if(tempResult.trim().length()==0) {
            log.warn(&quot;Generated output is empty. Skipped creation for file &quot; + destination);
            return;
        }
        FileWriter fileWriter = null;
        Writer fileWriter = null;
        try {

            th.ensureExistence( destination );    

            ac.addFile(destination, fileType);
            log.debug(&quot;Writing &quot; + identifier + &quot; to &quot; + destination.getAbsolutePath() );
            fileWriter = new FileWriter(destination);
            fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destination), &quot;UTF-8&quot;));

            fileWriter.write(tempResult);
        }
        catch (Exception e) {
            throw new ExporterException(&quot;Error while writing result to file&quot;, e);
        } finally {
            if(fileWriter!=null) {
                try {
                    fileWriter.flush();
                    fileWriter.close();
                }
                catch (IOException e) {
                    log.warn(&quot;Exception while flushing/closing &quot; + destination,e);
                }
            }
        }

    }</pre>
<p>org\hibernate\tool\hbm2x\jtidy.properties </p>
<pre class="html">indent=auto
indent-spaces=4
#indent-attributes=yes
    wrap=180
markup=yes
clean=yes
output-xml=yes
input-xml=yes
show-warnings=yes
trim-empty-elements=yes
input-encoding=utf-8
output-encoding=utf-8</pre>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/hibernate-tools-create-marke-430/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freemarker网站静态化</title>
		<link>http://javadou.com/freemarker-site-html-155/</link>
		<comments>http://javadou.com/freemarker-site-html-155/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 19:36:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[recommend]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-site-html-155/</guid>
		<description><![CDATA[/** * 生成静态页面主方法 * param context ServletContext * param data 一个Map的数据结果集 * param templatePath ftl模版路径 * param targetHtmlPath 生成静态页面的路径 */ ublic static void crateHTML(ServletContext context,Map data,String templatePath,Str... ]]></description>
			<content:encoded><![CDATA[<pre class="java">/**
* 生成静态页面主方法
* @param context ServletContext
* @param data 一个Map的数据结果集
* @param templatePath ftl模版路径
* @param targetHtmlPath 生成静态页面的路径
*/
ublic static void crateHTML(ServletContext context,Map<string  ,OBJECT> data,String templatePath,String targetHtmlPath){
Configuration freemarkerCfg = new Configuration();
//加载模版
freemarkerCfg.setServletContextForTemplateLoading(context, &quot;/&quot;);
freemarkerCfg.setEncoding(Locale.getDefault(), &quot;UTF-8&quot;);
try {
//指定模版路径
Template template = freemarkerCfg.getTemplate(templatePath,&quot;UTF-8&quot;);
template.setEncoding(&quot;UTF-8&quot;);
//静态页面路径
String htmlPath = context.getRealPath(&quot;/html&quot;)+&quot;/&quot;+targetHtmlPath;
File htmlFile = new File(htmlPath);
      Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), &quot;UTF-8&quot;));
     //处理模版
      template.process(data, out);
      out.flush();
      out.close();
} catch (Exception e) {
e.printStackTrace();
}   </pre>
<pre class="java">/**
  * 生成静态页面主方法
  * @param context ServletContext
  * @param data 一个Map的数据结果集
  * @param templatePath ftl模版路径
  * @param targetHtmlPath 生成静态页面的路径
  */
 public static void crateHTML(ServletContext context,Map<string  ,OBJECT> data,String templatePath,String targetHtmlPath){
  Configuration freemarkerCfg = new Configuration();
  //加载模版
  freemarkerCfg.setServletContextForTemplateLoading(context, &quot;/&quot;);
  freemarkerCfg.setEncoding(Locale.getDefault(), &quot;UTF-8&quot;);
  try {
   //指定模版路径
   Template template = freemarkerCfg.getTemplate(templatePath,&quot;UTF-8&quot;);
   template.setEncoding(&quot;UTF-8&quot;);
   //静态页面路径
   String htmlPath = context.getRealPath(&quot;/html&quot;)+&quot;/&quot;+targetHtmlPath;
   File htmlFile = new File(htmlPath);
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(htmlFile), &quot;UTF-8&quot;));
            //处理模版
            template.process(data, out);
            out.flush();
            out.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }</pre>
<p>其实很简单，只要Google一下就有很多这方面的代码。我也是Google的代码然后自己再根据实际情况修改。简单说明一下参数： ServletContext ：这个不用说了吧。做java web的应该都知道，只不过struts2中这样获取ServletActionContext.getServletContext() Map<string  ,OBJECT> data : 模版的数据来源。freemarker通过一个Map给ftl模版送数据。现在已友情链接为列子详细介绍静态页面如何生成。其他模块以此类推。 String templatePath : ftl所在的路径。我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 String targetHtmlPath : 最后生成静态页的路径：我这里相对于网站的一个相对路径然后通过ServerContext获取绝对路径。 友情链接根据这段代码<jsp:include flush="true" page="/html/index_link.html"></jsp:include>我们需要freemarker生成一个index_link.html文件。友情链接数据来源通过数据库查询获取。然后再写一个方法专门生成友情链接静态页面： </p>
<pre class="java">/**
* 生成友情链接的静态页index_link.html
* @param context
* @param data
*/
ublic static void createIndexFriendLink(ServletContext context,Map<string  ,OBJECT> data){
crateHTML(context,data,&quot;index_link.ftl&quot;,&quot;index_link.html&quot;);   </pre>
<pre class="java">/**
  * 生成友情链接的静态页index_link.html
  * @param context
  * @param data
  */
 public static void createIndexFriendLink(ServletContext context,Map<string  ,OBJECT> data){
  crateHTML(context,data,&quot;index_link.ftl&quot;,&quot;index_link.html&quot;);
 }</pre>
<p>此方法调用上面的createHTML方法。然后根据以上方法我们就可以再Struts2的action里面从数据库查询数据放入map调用createIndexFriendLink()方法生成静态页了。这是action中的一个方法: </p>
<pre class="java">/**
* 生成友情链接静态页index_link.html
* @return
*/
public String createLink(){
//权限验证
if(! this.isAccess())
    return &quot;error&quot;;
try{
   //得到友情链接
    List links = friendLinkDAO.findAll();
   //准备数据
    HashMap<string  ,OBJECT> data = new HashMap<string  ,OBJECT>();
    data.put(&quot;links&quot;, links);
   //调用静态页面方法
    HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);
    addActionMessage(&quot;静态页面生成成功！&quot;);
   return &quot;message&quot;;
}catch(Exception e){
    e.printStackTrace();
   return &quot;failure&quot;;
}
}  </pre>
<pre class="java">/**
  * 生成友情链接静态页index_link.html
  * @return
  */
 public String createLink(){
  //权限验证
  if(! this.isAccess())
   return &quot;error&quot;;
  try{
   //得到友情链接
   List links = friendLinkDAO.findAll();
   //准备数据
   HashMap<string  ,OBJECT> data = new HashMap<string  ,OBJECT>();
   data.put(&quot;links&quot;, links);
   //调用静态页面方法
   HTML.createIndexFriendLink(ServletActionContext.getServletContext(), data);
   addActionMessage(&quot;静态页面生成成功！&quot;);
   return &quot;message&quot;;
  }catch(Exception e){
   e.printStackTrace();
   return &quot;failure&quot;;
  }
 }</pre>
<p>List links = friendLinkDAO.findAll();通过spring注入action的hiberate DAO获取数据给list然后通过以下代码 HashMap<string  ,OBJECT> data = new HashMap<string  ,OBJECT>(); data.put(&quot;links&quot;, links); 准备数据调用createIndexFriendLink()方法。以下是：ftl模版源码： </p>
<pre class="xml">&lt;#if links?size != 0&gt;   
<div class="link">
     <strong>友情链接：</strong>
     &lt;#list links as link&gt;
     <a title="${link.linkName}" href="${link.linkUrl}" target="_blank">${link.linkName}</a>
     &lt;/#LIST&gt;
</div>

&lt;#else&gt;   
<div class="link"></div>

&lt;/#IF&gt;  

&lt;#if links?size != 0&gt;
<div class="link">
     <strong>友情链接：</strong>
     &lt;#list links as link&gt;
  <a title="${link.linkName}" href="${link.linkUrl}" target="_blank">${link.linkName}</a>
  &lt;/#LIST&gt;
</div>

&lt;#else&gt;
<div class="link"></div>

&lt;/#IF&gt;</pre>
<p>这样友情链接静态页就生成了。 </p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-site-html-155/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker macro 传入任意个参数</title>
		<link>http://javadou.com/freemarker-macro-any-var-154/</link>
		<comments>http://javadou.com/freemarker-macro-any-var-154/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 18:31:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-macro-any-var-154/</guid>
		<description><![CDATA[freemarker macro 传入任意个参数的实现，这个问题想了很久都没想明白，网上更加搜索不到相关资料。

今天终于把他完美实现了，最主要的作用是可以不传入参数和轻松取得需要的参数。

把代码拿出来给大家晒晒... ]]></description>
			<content:encoded><![CDATA[<p>freemarker macro 传入任意个参数的实现，这个问题想了很久都没想明白，网上更加搜索不到相关资料。</p>
<p>今天终于把他完美实现了，最主要的作用是可以不传入参数和轻松取得需要的参数。</p>
<p>把代码拿出来给大家晒晒：</p>
<pre class="xml">&lt;#macro topic_new extra...&gt;
  &lt;#if extra?size gt 0&gt;

&#160;&#160; &lt;#assign param_forumId&gt;

&#160;&#160; ${extra?keys?seq_contains(&quot;forum.id&quot;)?string(&quot;?forum.id=${extra['forum.id']}&quot;,&quot;&quot;)}

&#160;&#160; &lt;/#assign&gt;

&lt;/#if&gt;

&lt;input type=&quot;text&quot; value=&quot;topic_new.action${param_forumId?if_exists}&quot;/&gt;

&lt;/#macro&gt;</pre>
<p>关键的：</p>
<p>1. &lt;#if extra?size gt 0&gt;判断不传入参数的情况</p>
<p>2. extra?keys?seq_contains(&quot;forum.id&quot;)判断是否存在forum.id这个参数</p>
<p>3. ?string(&quot;?forum.id=${extra['forum.id']}&quot;,&quot;&quot;)如果不存在则为空，${extra['forum.id']}快速取得forum.id的值</p>
<p>不用再在外面加个list用${extra[attr]}的方式来取数据。</p>
<p>4. ${param_forumId?if_exists}取得上面定义的变量值，用?if_exists实现没有变量时为空，有变量则现实值</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-macro-any-var-154/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用freemarker标签实现一行五列的表格算法</title>
		<link>http://javadou.com/freemarker-table-five-tds-153/</link>
		<comments>http://javadou.com/freemarker-table-five-tds-153/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 17:29:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-table-five-tds-153/</guid>
		<description><![CDATA[&60;table cellspacing=&34;0&34; cellpadding=&34;0&34; border=&34;0&34; class=&34;listTable&34;&62; &60;list tagPage.result as tag&62; &60;-- 取5的模，即除于5的倍数余数为0的生成行的开头&60;tr&62; --&62; &60;if tag_index%5==0&62;&60;tr&62;&60... ]]></description>
			<content:encoded><![CDATA[<pre class="html">&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; class=&quot;listTable&quot;&gt;
  &lt;#list tagPage.result as tag&gt;

&lt;#-- 取5的模，即除于5的倍数余数为0的生成行的开头&lt;tr&gt; --&gt;

&lt;#if tag_index%5==0&gt;&lt;tr&gt;&lt;/#if&gt;

&#160;&#160; &lt;td&gt;

&#160;&#160;&#160; &amp;nbsp;&lt;a href=&quot;post_bytag.action?tagId=${tag.id}&quot;&gt;${tag.name}&lt;/a&gt;(${tag.counts})&amp;nbsp;

&#160;&#160; &lt;/td&gt;

&#160;&#160; &lt;#-- 如果最后一个不是刚好5列，则要补充完剩下的列 --&gt;

&lt;#if tag_index == (tagPage.result?size-1) &amp;&amp; tag_index%5!=4&gt;

&#160;&#160; &lt;#assign end=(tagPage.result?size-tag_index+1) /&gt;

&#160;&#160; &lt;#-- 根据缺少的列数重新定义一个list生成列 --&gt;

&#160;&#160; &lt;#list 0..end as x&gt;

&#160;&#160; &lt;td&gt;&amp;nbsp;&lt;/td&gt;

&#160;&#160; &lt;/#list&gt;

&#160;&#160; &lt;/tr&gt;

&lt;/#if&gt;

&lt;#-- 取5的模，即除于5的倍数余数为4（0到4刚好5列）的生成行的结尾&lt;/tr&gt; --&gt;

&lt;#if tag_index%5==4&gt;&lt;/tr&gt;&lt;/#if&gt;

&lt;/#list&gt;

&lt;/table&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-table-five-tds-153/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker常用语法收集</title>
		<link>http://javadou.com/freemarker-yufa-conllect-151/</link>
		<comments>http://javadou.com/freemarker-yufa-conllect-151/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 15:23:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-yufa-conllect-151/</guid>
		<description><![CDATA[假设有对象book

一.输出 ${book.name}
空值判断：${book.name?if_exists },
${book.name?default('xxx')}//默认值xxx
${ book.name!"xxx"}//默认值xxx
日期格式：${book.date?string('yyyy-MM-dd')}
数字格式：${book?string.number}--20
${book?string.currency}--<-- $20... ]]></description>
			<content:encoded><![CDATA[<p>假设有对象book</p>
<p>一.输出 ${book.name}   <br />空值判断：${book.name?if_exists },    <br />${book.name?default(&#8216;xxx&#8217;)}//默认值xxx    <br />${ book.name!&quot;xxx&quot;}//默认值xxx    <br />日期格式：${book.date?string(&#8216;yyyy-MM-dd&#8217;)}    <br />数字格式：${book?string.number}&#8211;20    <br />${book?string.currency}&#8211;&lt;#&#8211; $20.00 &#8211;&gt;    <br />${book?string.percent}—&lt;#&#8211; 20% &#8211;&gt;    <br />插入布尔值：    <br />&lt;#assign foo=ture /&gt;    <br />${foo?string(&quot;yes&quot;,&quot;no&quot;)} &lt;#&#8211; yes &#8211;&gt;</p>
<p>二．逻辑判断   <br />1:    <br />&lt;#if condition&gt;    <br />&#8230;.    <br />&lt;#elseif condition2&gt;    <br />&#8230;.    <br />&lt;#elseif condition3&gt;    <br />&#8230;&#8230;    <br />&lt;#else&gt;    <br />&#8230;    <br />&lt;/#if&gt;    <br />其中空值判断可以写成&lt;#if book.name?? &gt;</p>
<p>2:   <br />&lt;#switch value&gt;    <br />&lt;#case refValue1&gt;    <br />&#160;&#160;&#160; &#8230;    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&lt;#case refValue2&gt;    <br />&#160;&#160;&#160; &#8230;    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&#8230;    <br />&lt;#case refValueN&gt;    <br />&#160;&#160;&#160; &#8230;    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&lt;#default&gt;    <br />&#160;&#160;&#160; &#8230;    <br />&lt;/#switch&gt;</p>
<p>三．循环读取   <br />&lt;#list sequence as item&gt;    <br />&lt;#if item_index == 10&gt;    <br />&#160;&#160; ${item.id}    <br />&#160;&#160; &lt;#break /&gt;    <br />&lt;/#if&gt;    <br />&#8230;    <br />&lt;/#list&gt;    <br />实例：    <br />&lt;#if (post.attachments?size &gt; 0)&gt;    <br />&lt;table width=&quot;100%&quot; height=&quot;20px&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;post_bodyTable&quot;&gt;    <br />&lt;tbody&gt;    <br />&lt;tr&gt;    <br />&lt;td class=&quot;post_body_text&quot; valign=&quot;bottom&quot;&gt;    <br />相关附件：    <br />&lt;#list post.attachments as attach&gt;    <br />&#160;&#160; 链接：&lt;a href=&quot;${attach.physicalFilename}&quot;&gt;${attach.realFilename}&lt;/a&gt;&amp;nbsp;    <br />&#160;&#160; 大小：${attach.filesize}&amp;nbsp;描述：${attach.description}&amp;nbsp;上传日期：${attach.uploadDate}    <br />&#160;&#160; &lt;br /&gt;    <br />&lt;/#list&gt;    <br />&lt;/td&gt;    <br />&lt;/tr&gt;    <br />&lt;/tbody&gt;    <br />&lt;/table&gt;    <br />&lt;/#if&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-yufa-conllect-151/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker 判断list记录大于0</title>
		<link>http://javadou.com/freemarker-list-size-gt-0-150/</link>
		<comments>http://javadou.com/freemarker-list-size-gt-0-150/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 14:22:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-list-size-gt-0-150/</guid>
		<description><![CDATA[freemarker 判断list记录大于0 用&60;if (list?size &62; 0)&62;&60;/if&62;即可。下面是个显示附件的实例 &60;if (post.attachments?size &62; 0)&62; &160;&160;&160;&160;&160; &60;table width=&34;100%&34; height=&34;20px&34; cellpadding=&34;0&34; c... ]]></description>
			<content:encoded><![CDATA[<p>freemarker 判断list记录大于0 用&lt;#if (list?size &gt; 0)&gt;&lt;/#if&gt;即可。下面是个显示附件的实例</p>
<p>&lt;#if (post.attachments?size &gt; 0)&gt;   <br />&#160;&#160;&#160;&#160;&#160; &lt;table width=&quot;100%&quot; height=&quot;20px&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;post_bodyTable&quot;&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;tbody&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tr&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td class=&quot;post_body_text&quot; valign=&quot;bottom&quot;&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 相关附件：    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;#list post.attachments as attach&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 链接：&lt;a href=&quot;${attach.physicalFilename}&quot;&gt;${attach.realFilename}&lt;/a&gt;&amp;nbsp;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 大小：${attach.filesize}&amp;nbsp;描述：${attach.description}&amp;nbsp;上传日期：${attach.uploadDate}    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/#list&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/tr&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;/tbody&gt;    <br />&#160;&#160;&#160;&#160;&#160; &lt;/table&gt;    <br />&#160;&#160;&#160;&#160;&#160; &lt;/#if&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-list-size-gt-0-150/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker str?number字符串转换成整数</title>
		<link>http://javadou.com/freemarker-str-to-number-149/</link>
		<comments>http://javadou.com/freemarker-str-to-number-149/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 13:20:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-str-to-number-149/</guid>
		<description><![CDATA[freemarker 字符串转换成整数str?number，注意：index是freemarker的关键字，不能作为变量。宏里面定义的变量不能跟宏的名称相同。(如下面的定义成 就会报错... ]]></description>
			<content:encoded><![CDATA[<p>freemarker 字符串转换成整数str?number，注意：index是freemarker的关键字，不能作为变量。宏里面定义的变量不能跟宏的名称相同。(如下面的&lt;#assign class=&quot;commonTR1&quot; /&gt;定义成&lt;#assign className=&quot;commonTR1&quot; /&gt; 就会报错) </p>
<p>实例：</p>
<p>&lt;#macro className indexNumber&gt;   <br />&lt;#if indexNumber?number%2 != 0&gt;    <br />&#160;&#160; &lt;#assign class=&quot;commonTR1&quot; /&gt;    <br />&lt;#else&gt;    <br />&#160;&#160; &lt;#assign class=&quot;commonTR2&quot; /&gt;    <br />&lt;/#if&gt;    <br />${class}    <br />&lt;/#macro&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-str-to-number-149/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker 中文乱码</title>
		<link>http://javadou.com/freemarker-luanma2-148/</link>
		<comments>http://javadou.com/freemarker-luanma2-148/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 12:19:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[乱码]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-luanma2-148/</guid>
		<description><![CDATA[freemarker 中文乱码问题解决办法

freemarker的Configurartion中有默认的编码为ISO-8859-1所以读取有中文的模板时就会变乱码。

解决办法一：通过修改配置文件freemarker.properties，修改默认编码... ]]></description>
			<content:encoded><![CDATA[<p>freemarker 中文乱码问题解决办法</p>
<p>freemarker的Configurartion中有默认的编码为ISO-8859-1所以读取有中文的模板时就会变乱码。</p>
<p>解决办法一：通过修改配置文件freemarker.properties，修改默认编码：</p>
<p>locale=zh_CN   <br /><strong>default_encoding=gbk</strong>    <br />number_format=#    <br />date_format=yyyy-MM-dd    <br />time_format=HH:mm:Ss    <br />datetime_format=yyyy-MM-dd HH:mm:Ss</p>
<p>解决办法二：通过spring或其他第三方工具配置：</p>
<p>&lt;bean id=&quot;freemakerCongfig&quot;</p>
<p>&#160;&#160;&#160; class=&quot;org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer&quot;&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;templateLoaderPath&quot;&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;value&gt;/WEB-INF/web/&lt;/value&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name=&quot;freemarkerSettings&quot;&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;props&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;prop key=&quot;defaultEncoding&quot;&gt;gbk&lt;/prop&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;/props&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt;</p>
<p>&#160;&#160;&#160; &lt;/bean&gt;</p>
<p>注：org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer在spring-webmvc.jar 包里面，项目要导入这个jar包才可以，或者会找不到类。</p>
<p>另外，页面编码和charset要跟上面配置的一致才可以，&lt;meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=gbk&quot;&gt;</p>
<p>注意：还有一种常见的导致乱码问题：编辑器或文件保存的编码和页面设置的编码不一致会导致乱码，例如文件的编码(用记事本打开,另存为可以看到文件的编码)为UTF-8而页面的charset=gbk就会出现乱码，反之也一样。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-luanma2-148/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker list循环用法&#8211;取list的第一个元素</title>
		<link>http://javadou.com/freemarker-list-get-first-147/</link>
		<comments>http://javadou.com/freemarker-list-get-first-147/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 11:17:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-list-get-first-147/</guid>
		<description><![CDATA[我们直接上代码： &60;list categories as c&62; &160;&160;&160; &60;list c.getForums() as f&62; &160;&160;&160;&160; &60;if f_index == 0&62; &160;&160;&160;&160;&160; &60;assign default_forum_id = &34;${f.id}&34; /&62; &160;&160;&160;&160; &60;/i... ]]></description>
			<content:encoded><![CDATA[<p>我们直接上代码：
<pre class="html">&lt;#list categories as c&gt;
  &#160;&#160;&#160; &lt;#list c.getForums() as f&gt;

&#160;&#160;&#160;&#160; &lt;#if f_index == 0&gt;

&#160;&#160;&#160;&#160;&#160; &lt;#assign default_forum_id = &quot;${f.id}&quot; /&gt;

&#160;&#160;&#160;&#160; &lt;/#if&gt;

&#160;&#160;&#160; &lt;/#list&gt;

&lt;/#list&gt;


&lt;div class=&quot;forumNameTags&quot; id=&quot;forumNameTags&quot;&gt;
  ${I18n.getMessage(&quot;ForumIndex.forumNameTags&quot;)}

&lt;#assign n = 0 /&gt;

&lt;#list categories as category&gt;

&#160;&#160; &lt;#list category.getForums() as forum&gt;

&#160;&#160;&#160;&#160; &lt;#assign n = n+1 /&gt; 

&#160;&#160;&#160;&#160; &lt;#if n gt 5&gt;&lt;#break&gt;&lt;/#if&gt;//取前五条记录

&#160;&#160;&#160;&#160; &lt;a href=&quot;${JForumContext.encodeURL(&quot;/forums/show/${forum.id}&quot;)}&quot;&gt;${forum.name?html}&lt;/a&gt;&amp;nbsp;&amp;nbsp;&#160;&#160; &#160;&#160; &lt;/#list&gt;

&#160;&#160; &lt;#if n gt 5&gt;//在五条记录后面加上一条更多的标签

&#160;&#160;&#160; &lt;span onclick=&quot;showMoreTags('forumNameMoreTags',event,-250,135);&quot;&gt;&lt;a href=&quot;#this&quot; &gt;${I18n.getMessage(&quot;ForumIndex.forumNameTagsMore&quot;)}&lt;/a&gt;&lt;/span&gt;

&#160;&#160;&#160; &lt;#break&gt;

&#160;&#160; &lt;/#if&gt; 

&lt;/#list&gt;

&lt;/div&gt;

&lt;div id=&quot;forumNameMoreTags&quot; class=&quot;popWindow&quot; style=&quot;left:0px;top:0px;display:none;&quot;&gt;
  &lt;div onclick=&quot;hiddenMoreTags('forumNameMoreTags')&quot; class=&quot;popWindowTitle&quot;&gt;x&amp;nbsp;&amp;nbsp;&lt;/div&gt; 

&lt;div class=&quot;padding&quot;&gt;

&lt;#assign n = 0 /&gt;

&lt;#list categories as category&gt;

&#160;&#160; &lt;#list category.getForums() as forum&gt;

&#160;&#160;&#160;&#160; &lt;#assign n = n+1 /&gt;

&#160;&#160;&#160;&#160; &lt;a href=&quot;${JForumContext.encodeURL(&quot;/forums/show/${forum.id}&quot;)}&quot;&gt;${forum.name?html}&lt;/a&gt;&amp;nbsp;&amp;nbsp; 

&#160;&#160;&#160;&#160; &lt;#if n gt 2&gt;&lt;br/&gt;&lt;#assign n = 0 /&gt;&lt;/#if&gt; //取三条记录

&#160;&#160; &lt;/#list&gt;

&lt;/#list&gt;

&lt;/div&gt;

&lt;/div&gt;
</pre>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<p>生成html</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<pre class="html">&lt;div id=&quot;forumNameTags&quot; class=&quot;forumNameTags&quot;&gt;
  热门标签：

&#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/1.page&quot;&gt;股票大家谈&lt;/a&gt;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/2.page&quot;&gt;行业公司研究&lt;/a&gt;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/3.page&quot;&gt;投资交易策略&lt;/a&gt;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/4.page&quot;&gt;创新产业研究&lt;/a&gt;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/5.page&quot;&gt;社区资源下载&lt;/a&gt;&#160;&#160;&#160;&#160; &#160;&#160;&#160; &lt;span onclick=&quot;showMoreTags('forumNameMoreTags',event,-250,135);&quot;&gt;&lt;a href=&quot;#this&quot;&gt;更多...&lt;/a&gt;&lt;/span&gt;

&lt;/div&gt;

&lt;div style=&quot;left: 0px; top: 0px; display: none;&quot; class=&quot;popWindow&quot; id=&quot;forumNameMoreTags&quot;&gt;

&lt;div class=&quot;popWindowTitle&quot; onclick=&quot;hiddenMoreTags('forumNameMoreTags')&quot;&gt;x&#160;&#160; &lt;/div&gt; 

&lt;div class=&quot;padding&quot;&gt;

&#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/1.page&quot;&gt;股票大家谈&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/2.page&quot;&gt;行业公司研究&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/3.page&quot;&gt;投资交易策略&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;br/&gt; 

&#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/4.page&quot;&gt;创新产业研究&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/5.page&quot;&gt;社区资源下载&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/7.page&quot;&gt;上海个股&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;br/&gt; 

&#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/6.page&quot;&gt;深圳个股&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/8.page&quot;&gt;红岭公告区&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/9.page&quot;&gt;社区事务处理&lt;/a&gt;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &lt;br/&gt; 

&#160;&#160;&#160;&#160; &lt;a href=&quot;/apollo/forums/show/10.page&quot;&gt;金牌分析师&lt;/a&gt;&#160;&#160;&#160; &lt;/div&gt;

&lt;/div&gt;

</pre>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-list-get-first-147/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker常见配置收集</title>
		<link>http://javadou.com/freemarker-config-conllect-146/</link>
		<comments>http://javadou.com/freemarker-config-conllect-146/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 10:15:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-config-conllect-146/</guid>
		<description><![CDATA[配置

tag_syntax = square_bracket&124;&124;auto_detect

这也是开发中最常用的方式

-------------------------------------------------

classic_compatible=true

可以满足一般需要。默认情况变量为null则替换为空字符串，如果需要自定义，写上$... ]]></description>
			<content:encoded><![CDATA[<p>配置</p>
<p>tag_syntax = square_bracket||auto_detect</p>
<p>这也是开发中最常用的方式</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>classic_compatible=true</p>
<p>可以满足一般需要。默认情况变量为null则替换为空字符串，如果需要自定义，写上${empty!&quot;EmptyValue of fbysss&quot;}的形式即可</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>number_format=#</p>
<p>设置数字格式 以免出现 000.00</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>template_update_delay=毫秒</p>
<p>模板延迟加载</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-config-conllect-146/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对freemarker空值null的处理 ?exists ?default(&quot;&quot;)</title>
		<link>http://javadou.com/freemarker-exists-default-145/</link>
		<comments>http://javadou.com/freemarker-exists-default-145/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:14:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-exists-default-145/</guid>
		<description><![CDATA[

如果 listBlogPost 为NULL 会报错.加上?exists(是否存在) 或者?default("")
如果为null时默认为空，例子：
... ]]></description>
			<content:encoded><![CDATA[<p>&lt;#list listBlogPost as blogPost&gt;   <br />&lt;/#list&gt;    <br />如果 listBlogPost 为NULL 会报错.加上?exists(是否存在) 或者?default(&quot;&quot;)    <br />如果为null时默认为空，例子：</p>
<p><strong>&lt;#if listBlogPost?exists &amp;&amp; listBlogPost.size != 0 &gt;</strong></p>
<p>&lt;#if Session[&quot;cartList&quot;]?exists&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&lt;#list Session[&quot;cartList&quot;] as item&gt;</p>
<p>${pageTitle?default(&quot;&quot;)}</p>
<p>&lt;#if s?exists&gt;&#160;&#160; <br />${s?if_exists}&#160;&#160; <br />exists用在逻辑判断,而if_exists用来打印东西时用到,如果存在打印,不存在打印空字符串.&#160;&#160; <br />exp1?exists将会被exp1??代替&#160;&#160; <br />exp1?if_exists将会被exp1!代替&#160;&#160; <br />exp1?default(exp2)将会被exp1!exp2. </p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-exists-default-145/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeMarker 同一模板文件中一个macro调用另外一个macro的方法</title>
		<link>http://javadou.com/freemarker-macro-to-macro-144/</link>
		<comments>http://javadou.com/freemarker-macro-to-macro-144/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 08:13:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[macro]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-macro-to-macro-144/</guid>
		<description><![CDATA[外部引用可以用:


nested code

而ftl文件里面引用另外一个macro则可以直接... ]]></description>
			<content:encoded><![CDATA[<p>外部引用可以用:   <br />&lt;#import &quot;../macros/presentation.ftl&quot; as presentation/&gt;    <br />&lt;@presentation.commonDivHead headTitle=&#8217;${postFormTitle}&#8217; style=&quot;margin:2px;&quot;&gt;    <br />nested code    <br />&lt;<a>/@presentation.commonDivHead</a>&gt;    <br />而ftl文件里面引用另外一个macro则可以直接用    <br />&lt;@commonDivHead headTitle=&#8217;${postFormTitle}&#8217; style=&quot;margin:2px;&quot;&gt;    <br />nested code    <br />&lt;<a>/@commonDivHead</a>&gt;</p>
<p>注：macros里面可以传入多个变量，变量的顺序可以随便写，不传入的变量时为默认值，所有定义变量的时候最好给个默认值。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-macro-to-macro-144/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker手册－－常用命令</title>
		<link>http://javadou.com/freemarker-my-study-143/</link>
		<comments>http://javadou.com/freemarker-my-study-143/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 07:11:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-my-study-143/</guid>
		<description><![CDATA[1.条件语句 if

your code


注：if后面跟的是判断条件，判断条件不能用${变量名}的形式，直接用变量名就可以了

2.条件判断语句 if els... ]]></description>
			<content:encoded><![CDATA[<p>1.条件语句 if   <br />&lt;#if !readonly &amp;&amp; !replyOnly&gt;    <br />your code    <br />&lt;/#if&gt;</p>
<p>注：if后面跟的是判断条件，判断条件不能用${变量名}的形式，直接用变量名就可以了</p>
<p>2.条件判断语句 if else   <br />&lt;#if (session.privateMessages &gt; 0)&gt;    <br />${I18n.getMessage(&quot;ForumBase.newPm&quot;)}: (${session.privateMessages})    <br />&lt;#else&gt;    <br />${I18n.getMessage(&quot;ForumBase.privateMessages&quot;)}    <br />&lt;/#if&gt;</p>
<p>注：if else语句跟普通的不同之处是在中间可以有多句代码，而不是只执行if后面的一句代码</p>
<p>3.嵌套条件判断语句if if else   <br />&lt;#if logged&gt;    <br />&lt;#if !readonly &amp;&amp; !replyOnly&gt;    <br />&#160;&#160; your code    <br />&lt;#/if&gt;</p>
<p>other code</p>
<p>&lt;#if (session.privateMessages &gt; 0)&gt;   <br />&#160;&#160; ${I18n.getMessage(&quot;ForumBase.newPm&quot;)}: (${session.privateMessages})    <br />&lt;#else&gt;    <br />&#160;&#160; ${I18n.getMessage(&quot;ForumBase.privateMessages&quot;)}    <br />&lt;/#if&gt;</p>
<p>other code   <br />&lt;/#if&gt;</p>
<p>4.循环指令 list   <br />&lt;#list allCategories as category&gt;    <br />you code    <br />&lt;/#list&gt;</p>
<p>&lt;!&#8211; 1～3的循环 &#8211;&gt;   <br />&lt;#list 1 .. 3 as page&gt;    <br />&lt;@pageLink page, id/&gt;    <br />&lt;/#list&gt;</p>
<p>4.嵌套循环指令 list   <br />&lt;#list allCategories as category&gt;    <br />your code:${category.name}</p>
<p>&lt;#list category.getForums() as forum&gt;   <br />&#160;&#160; inner code:${category.forum.name}    <br />&#160;&#160; &lt;#list moderators as m&gt;    <br />&#160;&#160;&#160; ${m_index + 1}.${m.name?html}    <br />&#160;&#160; &lt;/#list&gt;    <br />&lt;/#list&gt;</p>
<p>&lt;#if category.name = &quot;&quot;&gt;   <br />&lt;#break&gt;    <br />&lt;/#if&gt;</p>
<p>other code   <br />&lt;/#list&gt;</p>
<p>注：as后面是别名，在循环体中可直接用（类似sql语句表的别名，以用&lt;#break&gt;指令提前结束list循环</p>
<p>。${m_index + 1}.是取list的索引，其中m_index为list的下标，从0开始。</p>
<p>5.导入macros指令 import   <br />&lt;#import &quot;../macros/pagination.ftl&quot; as pagination&gt;    <br />使用：&lt;@pagination.doPagination action, forum.id/&gt;    <br />//&lt;@pagination 为引用macros模板 pagination为对应模板文件的别名    <br />//pagination.doPagination action 为模板文件里面的一个macro－－&lt;#macro doPagination action</p>
<p>id=-1&gt;</p>
<p>6.定义变量指令 assign   <br />&lt;!&#8211; 定义一个变量moderators 只能作用于同层或下层 &#8211;&gt;    <br />&lt;#assign moderators = forumRepository.getModeratorList(forum.id)/&gt;    <br />&lt;#list moderators as m&gt;    <br />${m.name?html}    <br />&lt;/#list&gt;    <br />//其中forumRepository.getModeratorList(forum.id)为变量moderators的值</p>
<p>&lt;#&#8211; define a variable to come from pagination.ftl file name as doPagination action macro-</p>
<p>-&gt;   <br />&lt;#assign paginationData&gt;&lt;@pagination.doPagination action, forum.id/&gt;&lt;/#assign&gt;    <br />${paginationData}    <br />//其中&lt;@pagination.doPagination action, forum.id/&gt;为变量paginationData的值</p>
<p>7.改变(替换)变量指令 assign   <br />&lt;#assign total = forum.totalPosts/&gt;    <br />&lt;!&#8211; 定义一个变量total 值为forum.totalPosts &#8211;&gt;    <br />&lt;#if (total == 0 &amp;&amp; forum.totalTopics &gt; 0)&gt;    <br />&lt;!&#8211; 替换原来变量的值，以后引用total变量的值为forum.totalTopics &#8211;&gt;    <br />&lt;#assign total = forum.totalTopics/&gt;    <br />&lt;/#if&gt;</p>
<p>8.switch指令   <br />&lt;#switch being.size&gt;    <br />&lt;#case &quot;small&quot;&gt;    <br />&#160;&#160;&#160; This will be processed if it is small    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&lt;#case &quot;medium&quot;&gt;    <br />&#160;&#160;&#160; This will be processed if it is medium    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&lt;#case &quot;large&quot;&gt;    <br />&#160;&#160;&#160; This will be processed if it is large    <br />&#160;&#160;&#160; &lt;#break&gt;    <br />&lt;#default&gt;    <br />&#160;&#160;&#160; This will be processed if it is neither    <br />&lt;/#switch&gt;</p>
<p>&lt;#escape x as x?html&gt;   <br />userName: ${userName}    <br />&lt;/#escape&gt;    <br />等同于    <br />userName: ${userName?html}</p>
<p>注：escape指令在解析模版时起作用，而不是运行时起作用</p>
<p>9.设置缺省格式指令setting   <br />&lt;#setting number_format = &quot;#&quot;/&gt;    <br />${1.234}    <br />输出1    <br />&lt;#setting number_format=&quot;0.##&quot;&gt;    <br />${1.234}    <br />输出    <br />1.23</p>
<p>10.包含文件指令 include   <br />&lt;#include &quot;header.htm&quot;/&gt;</p>
<p>除了相关的文本外，在FreeMarker模板中可以包括下面三种特定部分：   <br />${…}：称为插补(interpolations)，FreeMarker会在输出时用实际值进行替代。     <br />指令：也叫FreeMarker标记，与HTML标记类似，但用#开始（有些以@开始，在后面叙述）。     <br />注释：包含在&lt;#&#8211; 和 &#8211;&gt;（而不是&lt;!&#8211;和&#8211;&gt;）之间文本。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-my-study-143/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeMarker中文手册 &#8211; 获取变量</title>
		<link>http://javadou.com/freemarker-chinaese-get-variable-142/</link>
		<comments>http://javadou.com/freemarker-chinaese-get-variable-142/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 06:58:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[recommend]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-chinaese-get-variable-142/</guid>
		<description><![CDATA[获取变量

        顶层变量： ${variable}，变量名只能是字母、数字、下划线、$、和的组合，且不能以数字开头

        从散列中获取数据

        可以使用点语法或方括号语法，假设有下面的数据模型... ]]></description>
			<content:encoded><![CDATA[<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160; 获取变量</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 顶层变量： ${variable}，变量名只能是字母、数字、下划线、$、@和#的组合，且不能以数字开头</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 从散列中获取数据</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 可以使用点语法或方括号语法，假设有下面的数据模型：</p>
<pre>(root)</pre>
<pre>|</pre>
<pre>+- book</pre>
<pre>|&#160;&#160; |</pre>
<pre>|&#160;&#160; +- title = &quot;Breeding green mouses&quot;</pre>
<pre>|&#160;&#160; |</pre>
<pre>|&#160;&#160; +- author</pre>
<pre>|&#160;&#160;&#160;&#160;&#160;&#160; |</pre>
<pre>|&#160;&#160;&#160;&#160;&#160;&#160; +- name = &quot;Julia Smith&quot;</pre>
<pre>|&#160;&#160;&#160;&#160;&#160;&#160; |</pre>
<pre>|&#160;&#160;&#160;&#160;&#160;&#160; +- info = &quot;Biologist, 1923-1985, Canada&quot;</pre>
<pre>|</pre>
<pre>+- test = &quot;title&quot; </pre>
<p>下面都是等价的：</p>
<pre>book.author.name</pre>
<pre>book[&quot;author&quot;].name</pre>
<pre>book.author.[&quot;name&quot;]</pre>
<pre>book[&quot;author&quot;][&quot;name&quot;]</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 使用点语法，变量名字有顶层变量一样的限制，但方括号语法没有该限制，因为名字是任意表达式的结果</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 从序列获得数据：和散列的方括号语法语法一样，只是方括号中的表达式值必须是数字；注意：第一个项目的索引是<strong>0</strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 序列片断：使用<strong>[startIndex..endIndex]</strong>语法，从序列中获得序列片断（也是序列）；startIndex和endIndex是结果为数字的表达式</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 特殊变量：FreeMarker内定义变量，使用<strong>.variablename</strong>语法访问</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 字符串操作</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Interpolation（或连接操作）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 可以使用<strong>${..}</strong>（或<strong>#{..}</strong>）在文本部分插入表达式的值，例如：</p>
<pre>${&quot;Hello ${user}!&quot;}</pre>
<pre>${&quot;${user}${user}${user}${user}&quot;} </pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 可以使用<strong>+</strong>操作符获得同样的结果</p>
<pre>${&quot;Hello &quot; + user + &quot;!&quot;}</pre>
<pre>${user + user + user + user}</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>${..}</strong>只能用于文本部分，下面的代码是错误的：</p>
<pre>&lt;#if ${isBig}&gt;Wow!&lt;/#if&gt;</pre>
<pre>&lt;#if &quot;${isBig}&quot;&gt;Wow!&lt;/#if&gt;</pre>
<p>应该写成：</p>
<pre>&lt;#if isBig&gt;Wow!&lt;/#if&gt;</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 子串</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 例子（假设user的值为“Big Joe”）：</p>
<pre>${user[0]}${user[4]}</pre>
<pre>${user[1..4]}</pre>
<p>结果是（注意第一个字符的索引是0）：</p>
<pre>BJ</pre>
<pre>ig J </pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 序列操作</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 连接操作：和字符串一样，使用<strong>+</strong>，下面是一个例子：</p>
<pre>&lt;#list [&quot;Joe&quot;, &quot;Fred&quot;] + [&quot;Julia&quot;, &quot;Kate&quot;] as user&gt;</pre>
<pre>- ${user}</pre>
<pre>&lt;/#list&gt;</pre>
<p>输出结果是：</p>
<pre>- Joe</pre>
<pre>- Fred</pre>
<pre>- Julia</pre>
<pre>- Kate</pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 散列操作</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 连接操作：和字符串一样，使用<strong>+</strong>，如果具有相同的key，右边的值替代左边的值，例如：</p>
<pre>&lt;#assign ages = {&quot;Joe&quot;:23, &quot;Fred&quot;:25} + {&quot;Joe&quot;:30, &quot;Julia&quot;:18}&gt;</pre>
<pre>- Joe is ${ages.Joe}</pre>
<pre>- Fred is ${ages.Fred}</pre>
<pre>- Julia is ${ages.Julia} </pre>
<p>输出结果是：</p>
<pre>- Joe is 30</pre>
<pre>- Fred is 25</pre>
<pre>- Julia is 18 </pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 算术运算</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ＋、－、×、／、％，下面是一个例子：</p>
<pre>${x * x - 100}</pre>
<pre>${x / 2}</pre>
<pre>${12 % 10}</pre>
<p>输出结果是（假设x为5）：</p>
<pre>-75</pre>
<pre>2.5</pre>
<pre>2 </pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 操作符两边必须是数字，因此下面的代码是错误的：</p>
<pre>${3 * &quot;5&quot;} &lt;#-- WRONG! --&gt; </pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 使用+操作符时，如果一边是数字，一边是字符串，就会自动将数字转换为字符串，例如：</p>
<pre>${3 + &quot;5&quot;} </pre>
<p>输出结果是：</p>
<pre>35</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 使用内建的int（后面讲述）获得整数部分，例如：</p>
<pre>${(x/2)?int}</pre>
<pre>${1.1?int}</pre>
<pre>${1.999?int}</pre>
<pre>${-1.1?int}</pre>
<pre>${-1.999?int}</pre>
<p>输出结果是（假设x为5）：</p>
<pre>2</pre>
<pre>1</pre>
<pre>1</pre>
<pre>-1</pre>
<pre>-1</pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 比较操作符</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 使用=（或==，完全相等）测试两个值是否相等，使用!= 测试两个值是否不相等</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; =和!=两边必须是相同类型的值，否则会产生错误，例如&lt;#if 1 = &quot;1&quot;&gt;会引起错误</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; Freemarker是精确比较，所以对&quot;x&quot;、&quot;x &quot;和&quot;X&quot;是不相等的</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 对数字和日期可以使用&lt;、&lt;=、&gt;和&gt;=，但不能用于字符串</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 由于Freemarker会将&gt;解释成FTL标记的结束字符，所以对于&gt;和&gt;=可以使用括号来避免这种情况，例如&lt;#if (x &gt; y)&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 另一种替代的方法是，使用lt、lte、gt和gte来替代&lt;、&lt;=、&gt;和&gt;=</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 逻辑操作符</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;&amp;（and）、||（or）、!（not），只能用于布尔值，否则会产生错误</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160; 例子：</p>
<pre>&lt;#if x &lt; 12 &amp;&amp; color = &quot;green&quot;&gt;</pre>
<pre> We have less than 12 things, and they are green.</pre>
<pre>&lt;/#if&gt;</pre>
<pre>&lt;#if !hot&gt; &lt;#-- here hot must be a boolean --&gt;</pre>
<pre> It's not hot.</pre>
<pre>&lt;/#if&gt; </pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 内建函数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 内建函数的用法类似访问散列的子变量，只是使用“<strong>?</strong>”替代“<strong>.</strong>”，下面列出常用的一些函数</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; 字符串使用的：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; html：对字符串进行HTML编码</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cap_first：使字符串第一个字母大写</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lower_case：将字符串转换成小写</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; upper_case：将字符串转换成大写</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trim：去掉字符串前后的空白字符</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 序列使用的：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; size：获得序列中元素的数目</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 数字使用的：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int：取得数字的整数部分（如-1.9?int的结果是-1）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 例子（假设test保存字符串&quot;Tom &amp; Jerry&quot;）：</p>
<pre>${test?html}</pre>
<pre>${test?upper_case?html}</pre>
<p>输出结果是：</p>
<pre>Tom &amp;amp; Jerry</pre>
<pre>TOM &amp;amp; JERRY </pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 操作符优先顺序</p>
<p><strong>操作符组</strong></p>
<p><strong>操作符</strong></p>
<p>后缀</p>
<p>[subvarName] [subStringRange] <strong>.</strong> (methodParams)</p>
<p>一元</p>
<p>+expr、-expr、!</p>
<p>内建</p>
<p>?</p>
<p>乘法</p>
<p>*、 / 、%</p>
<p>加法</p>
<p>+、-</p>
<p>关系</p>
<p>&lt;、&gt;、&lt;=、&gt;=（lt、lte、gt、gte）</p>
<p>相等</p>
<p>==（=）、!=</p>
<p>逻辑and</p>
<p>&amp;&amp;</p>
<p>逻辑or</p>
<p>||</p>
<p>数字范围</p>
<p><strong>..</strong></p>
<p><strong>（</strong><strong>4</strong><strong>）</strong><strong>Interpolation</strong></p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Interpolation有两种类型：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 通用Interpolation：${expr}</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 数字Interpolation：#{expr}或#{expr; format}</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 注意：Interpolation只能用于文本部分</p>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 通用Interpolation</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 插入字符串值：直接输出表达式结果</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 插入数字值：根据缺省格式（由#setting指令设置）将表达式结果转换成文本输出；可以使用内建函数string格式化单个Interpolation，下面是一个例子：</p>
<pre>&lt;#setting number_format=&quot;currency&quot;/&gt;</pre>
<pre>&lt;#assign answer=42/&gt;</pre>
<pre>${answer}</pre>
<pre>${answer?string} &lt;#-- the same as ${answer} --&gt;</pre>
<pre>${answer?string.number}</pre>
<pre>${answer?string.currency}</pre>
<pre>${answer?string.percent} </pre>
<p>输出结果是：</p>
<pre>$42.00</pre>
<pre>$42.00</pre>
<pre>42</pre>
<pre>$42.00</pre>
<pre>4,200%</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 插入日期值：根据缺省格式（由#setting指令设置）将表达式结果转换成文本输出；可以使用内建函数string格式化单个Interpolation，下面是一个使用格式模式的例子：</p>
<pre>${lastUpdated?string(&quot;yyyy-MM-dd HH:mm:ss zzzz&quot;)}</pre>
<pre>${lastUpdated?string(&quot;EEE, MMM d, ''yy&quot;)}</pre>
<pre>${lastUpdated?string(&quot;EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'&quot;)} </pre>
<p>输出的结果类似下面的格式：</p>
<pre>2003-04-08 21:24:44 Pacific Daylight Time</pre>
<pre>Tue, Apr 8, '03</pre>
<pre>Tuesday, April 08, 2003, 09:24:44 PM (PDT)</pre>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 插入布尔值：根据缺省格式（由#setting指令设置）将表达式结果转换成文本输出；可以使用内建函数string格式化单个Interpolation，下面是一个例子：</p>
<pre>&lt;#assign foo=true/&gt;</pre>
<pre>${foo?string(&quot;yes&quot;, &quot;no&quot;)}</pre>
<p>输出结果是：</p>
<pre>yes</pre>
<p>l&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 数字Interpolation的#{expr; format}形式可以用来格式化数字，format可以是：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mX：小数部分最小X位</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MX：小数部分最大X位</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 例子：</p>
<pre>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;#-- If the language is US English the output is: --&gt;</pre>
<pre>&lt;#assign x=2.582/&gt;</pre>
<pre>&lt;#assign y=4/&gt;</pre>
<pre>#{x; M2}&#160;&#160; &lt;#-- 2.58 --&gt;</pre>
<pre>#{y; M2}&#160;&#160; &lt;#-- 4&#160;&#160;&#160; --&gt;</pre>
<pre>#{x; m1}&#160;&#160; &lt;#-- 2.6 --&gt;</pre>
<pre>#{y; m1}&#160;&#160; &lt;#-- 4.0 --&gt;</pre>
<pre>#{x; m1M2} &lt;#-- 2.58 --&gt;</pre>
<pre>#{y; m1M2} &lt;#-- 4.0 --&gt; </pre>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-chinaese-get-variable-142/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemaker学习手册&#8211;设计指导</title>
		<link>http://javadou.com/freemarker-study-chm-141/</link>
		<comments>http://javadou.com/freemarker-study-chm-141/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 06:07:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-study-chm-141/</guid>
		<description><![CDATA[ 中存放所有freemaker的内容，之外的内容全部原样输出。 
 是函数调用 
两个定界符内的内容中，第一个符号表示指令或者函数名，其后的跟随参数。freemaker提供的控制包括如下： 
<elseif conditi... ]]></description>
			<content:encoded><![CDATA[<p>&lt;# &#8230; &gt; 中存放所有freemaker的内容，之外的内容全部原样输出。    <br />&lt;@ &#8230; /&gt; 是函数调用     <br />两个定界符内的内容中，第一个符号表示指令或者函数名，其后的跟随参数。freemaker提供的控制包括如下：     <br />&lt;#if condition&gt;&lt;#elseif condition&gt;&lt;#else&gt;&lt;/#if&gt; 条件判断     <br />&lt;#list hash_or_seq as var&gt;&lt;/#list&gt; 遍历hash表或者collection（freemaker称作sequence）的成员     <br />&lt;#macro name param1 param2 &#8230; &gt;&lt;#nested param&gt;&lt;/#macro&gt; 宏，无返回参数     <br />&lt;#function name param1 param2&gt;&lt;#return val&gt;&lt;/#function&gt;函数，有返回参数     <br />var?member_function(&#8230;) 用函数对var进行转换，freemaker称为build-ins。实际内部实现类似member_function(var, &#8230;)     <br />stringA[M .. N] 取子字符串，类似substring(stringA, M, N)     <br />{key:value, key2:value2 &#8230;} 直接定义一个hash表     <br />[item0, item1, item2 ...] 直接定义一个序列     <br />hash0[key0] 存取hash表中key对应的元素     <br />seq0[5] 存取序列指定下标的元素     <br />&lt;@function1 param0 param1 &#8230; /&gt; 调用函数function1     <br />&lt;@macro0 param0 param1 ; nest_param0 nest_param1 &#8230;&gt; nest_body &lt; <a>/@macro </a>&gt; 调用宏，并处理宏的嵌套     <br />&lt;#assign var = value &gt; 定义变量并初始化     <br />&lt;#local var = value&gt; 在 macro 或者 function 中定义局部变量并初始化     <br />&lt;#global var = value &gt; 定义全局变量并初始化     <br />${var} 输出并替换为表达式的值     <br />&lt;#visit xmlnode&gt; 调用macro匹配xmlnode本身及其子节点     <br />&lt;#recurse xmlnode&gt; 调用macro匹配xmlnode的子节点     <br />&lt;#if <em>condition</em> &gt; <tt>&lt;/#if&gt;</tt>     <br />&lt;#list <em>SequenceVar</em> as <em>variable</em> &gt; <em>repeatThis</em> &lt;/#list&gt;     <br />&lt;#include &quot;/copyright_footer.html&quot;&gt;     <br />一个ftl标记不能放在另外一个ftl标记里面，但是注释标记能够放在ftl标记里面。     <br />系统预定义指令采用&lt;#&#8230;&gt;&lt;/#&gt;     <br />用户自定义指令采用&lt;@&#8230;&gt;&lt;/@&gt;     <br />hash片段可以采用： products[10..19] or <tt>products[5..]</tt> 的格式。     <br />序列也可以做加法计算：passwords + {&quot;joe&quot;:&quot;secret42&quot;}</p>
<p>缺省值: <tt>name!&quot;unknown&quot;</tt> 或者 <tt>(user.name)!&quot;unknown&quot;</tt> 或者 <tt>name!</tt> 或者 <tt>(user.name)!</tt></p>
<p>null值检查: <tt>name??</tt> or <tt>(user.name)??</tt></p>
<p>&#160;</p>
<p>如果想打印${，则需要将{转义，可以写成&quot;$\{user}&quot;，或者可以用生字符（r指令）：$(r &quot;${xx}&quot;}    <br />序列构成：&lt;#list <strong>[&quot;winter&quot;, &quot;spring&quot;, &quot;summer&quot;, &quot;autumn&quot;]</strong> as x&gt;${x}&lt;/#list&gt;     <br />不同的对象可以存放在一个序列里面，比如：[2 + 2, [1, 2, 3, 4], &quot;whatnot&quot;]. 第一个是数字，第二个是序列，第三个是字符串。     <br />可用采用start..end的方式来定义一个数字序列，start可以小于end，同时，end也可以省略。     <br />hash取值支持一下四种模式：book.author.name, <tt>book[&quot;author&quot;].name</tt>, <tt>book.author.[&quot;name&quot;]</tt>, <tt>book[&quot;author&quot;][&quot;name&quot;]</tt>.</p>
<p>特殊变量是指freemaker引擎本身定义的变量。访问时，以.variable_name的语法访问。    <br />变量表达式支持嵌套模式，比如：${&quot;Hello ${user}!&quot;}。     <br />变量表达式在指令中的使用情况：     <br />变量表达式可以在指令中，用“”的方式存在，不如：&lt;#include &quot;/footer/${company}.html&quot;&gt;.     <br />但是不允许下面的方式存在： <tt>&lt;#if ${isBig}&gt;Wow!&lt;/#if&gt;</tt>, 正确写法是：<tt>&lt;#if isBig&gt;Wow!&lt;/#if&gt;</tt>.     <br />而且 <tt>&lt;#if &quot;${isBig}&quot;&gt;Wow!&lt;/#if&gt;写法也不正确，因为&quot;${isBig}&quot;返回的是字符串，不是boolean类型。      <br /></tt>    <br />字符串中取字符或字符串采用以下语法：${user[0]},${user[0..2]} ${user[4..]},${user?string(4)}     <br />序列操作：     <br />&#160;&#160;&#160; 加法：&lt;#list [&quot;Joe&quot;, &quot;Fred&quot;] + [&quot;Julia&quot;, &quot;Kate&quot;] as user&gt; 但要注意串联之后的读取速度变慢。     <br />&#160;&#160;&#160; 子序列：seq[1..4]     <br />序列和hash的串联都只能用于两个相加，不能有多个相加的模式，hash相加，如果两个相加的hash存在相同的key，则后面会覆盖前面的。     <br />在使用&gt;=或者&gt;时，需要注意一些问题，因为freemaker会将&gt;解释成标记的关闭符，为了解决这个问题，需要在表达式加上括号，比如： <tt>&lt;#if (x &gt; y)&gt;</tt>. 或者使用 <tt>&amp;gt;</tt> and <tt>&amp;lt符号来代替。</tt>     <br />无值变量（包括无该变量，null，返回void，无属性等）：<em>unsafe_expr</em>!<em>default_expr</em> or <tt><em>unsafe_expr</em>!</tt> or <tt>(<em>unsafe_expr</em>)!<em>default_expr</em></tt> or <tt>(<em>unsafe_expr</em>)!       <br /></tt>缺省值可以是任何类型，不一定是数字，比如：hits!0 或者 <tt>colors![&quot;red&quot;, &quot;green&quot;, &quot;blue&quot;]</tt>.     <br />如果缺省值忽略，那么将会默认为空串、空序列或者空hash，因为freemarker支持多类型的值。不过要让默认值为0或false，则不能省略缺省值。     <br />非顶层变量的无值处理：     <br />&#160;&#160;&#160; product.color!&quot;red&quot;：只处理product不为空，color为空的缺省值处理，如果product为空，则freemaker会抛出异常。(product.color)!&quot;red&quot;：则会处理product为空，color为空，或者没有color属性的无值情况。     <br />无值变量的判断操作：<em>unsafe_expr</em>?? or <tt>(<em>unsafe_expr</em>)??       <br /></tt></p>
<p>判断变量是否是无值。    <br />普通变量插入方式: <tt>${<em>expression</em>},${3+5);       <br /></tt>数字变量插入方式: <tt>#{<em>expression</em>}</tt> or <tt>#{<em>expression</em>; <em>format</em>}：过期。       <br />变量只能用于文本区或者是字符串里面，比如：&lt;h1&gt;Hello ${name}!&lt;/h1&gt;以及 <tt>&lt;#include &quot;/footer/${company}.html&quot;&gt;        <br />数字值的插入：根据缺省的number_format输出，以及可以通过setting来达到设置数字格式的目的，也可以通过内置函数string来改变输出格式。         <br />日期类型的格式设置：date_format, <tt>time_format</tt> 和 <tt>datetime_format</tt>         <br />定义宏：         <br />&#160;&#160;&#160; 不带参数：<strong>&lt;#macro 宏名&gt;...</strong><strong>&lt;/#macro&gt;，引用&lt;@宏名 /&gt;          <br /></strong>&#160;&#160;&#160; 带参数：<strong>&lt;#macro 宏名 参数...&gt;...&lt;/#macro&gt;，引用&lt;@宏名 参数1=值1.../&gt;，</strong>带有参数的宏，调用是参数的值必须和参数的个数相同。当然也可以在宏定义时给参数一些默认值。比如<strong>：&lt;#</strong>macro greet person color<strong>=&quot;black&quot;</strong>&gt;         <br />宏里面的嵌套内容：         <br />&lt;#macro border&gt;         <br />&#160;&#160; &lt;table border=4 cellspacing=0 cellpadding=4&gt;&lt;tr&gt;&lt;td&gt;         <br /><strong>&lt;#nested&gt;</strong>         <br />&#160;&#160; &lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;         <br />&lt;/#macro&gt;         <br />在宏的定义body中加入&lt;#nested&gt;指令。嵌套的内容可以是任何正确的ftl块。         <br />宏的本地变量在嵌套内容中是不可见的。         <br />宏定义时，&lt;#nest&gt;指令相当于调用定义的内容，而使用宏时，nest body相当于定义。</tt> </tt>
<pre>&lt;#macro repeat count&gt;&#160;&#160; &lt;#list 1..count as x&gt;&#160;&#160;&#160;&#160; &lt;#nested <strong>x, x/2, x==count</strong>&gt;&#160;&#160; &lt;/#list&gt;&lt;/#macro&gt;&lt;@repeat count=4 ; <strong>c, halfc, last</strong>&gt;&#160;&#160; ${<strong>c</strong>}. ${<strong>halfc</strong>}&lt;#if <strong>last</strong>&gt; Last!&lt;/#if&gt;&lt;/@repeat&gt; </pre>
<p>定义变量： </p>
<p>&#160;&#160;&#160; 在模板中定义的变量将会隐藏（不是更改）数据模型根下面的同名的变量。 </p>
<p>模板中的3种类型变量： </p>
<p>&#160;&#160;&#160; 1：<strong>plain variables，</strong>能够在模板中的任何地方访问，一个模板include另外一个模板，也可以访问被包含模板的变量。可以通过assign或者macro指令产生或替换变量。 </p>
<p>&#160;&#160;&#160; 如果要访问数据模型中的变量，则可以通过.global来访问： </p>
<p>&#160;&#160;&#160; &lt;#assign user = &quot;Joe Hider&quot;&gt; </p>
<p>&#160;&#160;&#160; ${user}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;#&#8211; prints: Joe Hider &#8211;&gt; </p>
<p>&#160;&#160;&#160; ${.globals.user} &lt;#&#8211; prints: Big Joe&#8211;&gt; </p>
<p>&#160;&#160;&#160; 2：<strong>Local variables，</strong>宏定义body中用local指令创建或者替换。 </p>
<p>&#160;&#160;&#160; 3：Loop variables:由list指令产生。<strong><br />
    <br /></strong></p>
<p></p>
<p>namespaces: </p>
<p>&lt;#import &quot;/lib/my_test.ftl&quot; as <strong>my</strong>&gt; &lt;#&#8211; the hash called &quot;my&quot; will be the &quot;gate&quot; &#8211;&gt; </p>
<p>&lt;@<strong>my</strong>.copyright date=&quot;1999-2002&quot;/&gt; </p>
<p>${<strong>my</strong>.mail} </p>
<p>设置命名空间里面的变量：&lt;#assign mail=&quot;jsmith@other.com&quot; <strong>in my</strong>&gt; </p>
<p>命名空间与数据模型：命名空间的ftl可以访问数据模型的变量。同样命名空间的变量也会隐藏数据模型中同名的变量。 </p>
<p>空白问题： </p>
<p>1：White-space stripping，默认为enabled，清除ftl标记带来的空白以及缩进。处理模板的空白。 </p>
<p>2：t, <tt>rt</tt>, <tt>lt指令。<br />
  <br /></tt>3：ftl的参数strip_text. </p>
<p>用compress directive或者transform来处理输出。 </p>
<p>&lt;#compress&gt;<em>&#8230;</em>&lt;/#compress&gt;：消除空白行。 </p>
<p>&lt;@compress single_line=true&gt;<em>&#8230;</em><a>/@compress</a>将输出压缩为一行。 </p>
<p>可替换语法： </p>
<p>freemarker可用&quot;[&quot;代替&quot;&lt;&quot;.在模板的文件开头加上<strong>[#ftl].</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-study-chm-141/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>macro(宏)在FreeMarker的使用</title>
		<link>http://javadou.com/freemarker-macro-use-140/</link>
		<comments>http://javadou.com/freemarker-macro-use-140/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 05:42:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[recommend]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-macro-use-140/</guid>
		<description><![CDATA[有人说用freemarker，但没有用到它的宏（macro），就＝没有真正用过freemarker。说的就是宏是freemarker的一大特色。

    宏的定义可以查看相关的文档，里面介绍得很清楚，下面来看看它的一个用法（javaeye帖子里有讨论... ]]></description>
			<content:encoded><![CDATA[<p>有人说用freemarker，但没有用到它的宏（macro），就＝没有真正用过freemarker。说的就是宏是freemarker的一大特色。</p>
<p>&#160;&#160;&#160; 宏的定义可以查看相关的文档，里面介绍得很清楚，下面来看看它的一个用法（javaeye帖子里有讨论）。</p>
<p>&#160;&#160;&#160; /WEB-INF/template/common/common.ftl：</p>
<p>&lt;#macro html title&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;head&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=GBK&quot; /&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;title&gt;${title}&lt;/title&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;link rel=&quot;stylesheet&quot; rev=&quot;stylesheet&quot; href=&quot;/oa/file/css.css&quot; type=&quot;text/css&quot; media=&quot;all&quot; /&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/head&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;body&gt;    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;#nested/&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/body&gt;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/html&gt;    <br />&lt;/#macro&gt;</p>
<p>&#160;&#160;&#160; 然后在freemarker.properties里定义：    <br />auto_import=/WEB-INF/template/common/common.ftl as c</p>
<p>&#160;&#160;&#160; 然后其他的ftl文件就可以使用它了</p>
<p>&#160;&#160;&#160; test.ftl：    <br />&#160;&#160;&#160; &lt;@c.html title=&quot;OA&quot;&gt;     <br />&#160;&#160;&#160;&#160;&#160; 你的内容     <br />&#160;&#160;&#160; &lt;<a>/@c.html</a>&gt;</p>
<p>&#160;&#160;&#160; 如果不在freemarker.properties里定义，可以在每个文件里包含这个ftl：    <br />&lt;#import &quot;/WEB-INF/template/common/common.ftl&quot; as c&gt;</p>
<p>&#160;&#160;&#160; 不同的场合有不同的运用。使用得好的话，将会大大节省你的开发时间。</p>
<p>macro, nested, return    <br />语法</p>
<p>&lt;#macro name param1 param2 &#8230; paramN&gt;    <br />&#8230;     <br />&lt;#nested loopvar1, loopvar2, &#8230;, loopvarN&gt;     <br />&#8230;     <br />&lt;#return&gt;     <br />&#8230;     <br />&lt;/#macro&gt;     <br />用例     <br />&lt;#macro test foo bar=&quot;Bar&quot; baaz=-1&gt;     <br />Test text, and the params: ${foo}, ${bar}, ${baaz}     <br />&lt;/#macro&gt;     <br />&lt;@test foo=&quot;a&quot; bar=&quot;b&quot; baaz=5*5-2/&gt;     <br />&lt;@test foo=&quot;a&quot; bar=&quot;b&quot;/&gt;     <br />&lt;@test foo=&quot;a&quot; baaz=5*5-2/&gt;     <br />&lt;@test foo=&quot;a&quot;/&gt;</p>
<p>输出</p>
<p>Test text, and the params: a, b, 23    <br />Test text, and the params: a, b, -1     <br />Test text, and the params: a, Bar, 23     <br />Test text, and the params: a, Bar, -1</p>
<p>定义循环输出的宏</p>
<p>&lt;#macro list title items&gt;    <br />&lt;p&gt;${title?cap_first}:     <br />&lt;ul&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;#list items as x&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;li&gt;${x?cap_first}     <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;/#list&gt;     <br />&lt;/ul&gt;     <br />&lt;/#macro&gt;     <br />&lt;@list items=[&quot;mouse&quot;, &quot;elephant&quot;, &quot;python&quot;] title=&quot;Animals&quot;/&gt;</p>
<p>输出结果    <br />&lt;p&gt;Animals:     <br />&lt;ul&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;li&gt;Mouse     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;li&gt;Elephant     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;li&gt;Python     <br />&lt;/ul&gt;</p>
<p>包含body的宏</p>
<p>&lt;#macro repeat count&gt;    <br />&lt;#list 1..count as x&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;#nested x, x/2, x==count&gt;     <br />&lt;/#list&gt;     <br />&lt;/#macro&gt;     <br />&lt;@repeat count=4 ; c halfc last&gt;     <br />${c}. ${halfc}&lt;#if last&gt; Last!&lt;/#if&gt;     <br />&lt;<a>/@repeat</a>&gt;</p>
<p>输出</p>
<p>1. 0.5    <br />2. 1     <br />3. 1.5     <br />4. 2 Last!</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>注意在使用的时候：别忘了双引号。</p>
<p>&lt;#import &quot;/pagelibs/book.ftl&quot; as book&gt;</p>
<p>&lt;@workorder.price value=&quot;${book.price}&quot; /&gt;</p>
<p>宏Macro    <br />宏是在模板中使用macro指令定义</p>
<p>l.1 基本用法</p>
<p>宏是和某个变量关联的模板片断，以便在模板中通过用户定义指令使用该变量，下面是一个例子：</p>
<p>&lt;#macro greet&gt; &lt;font size=&quot;+2&quot;&gt;Hello Joe!&lt;/font&gt;&lt;/#macro&gt;    <br />调用宏时，与使用FreeMarker的其他指令类似，只是使用@替代FTL标记中的#。</p>
<p>&lt;@greet&gt;&lt;<a>/@greet</a>&gt; &lt;#&#8211;&lt;@greet/&gt;&#8211;&gt;     <br />在macro指令中可以在宏变量之后定义参数，如：</p>
<p>&lt;#macro greet person&gt; &lt;font size=&quot;+2&quot;&gt;Hello ${person}!&lt;/font&gt;&lt;/#macro&gt;    <br />可以这样使用这个宏变量：</p>
<p>&lt;@greet person=&quot;Fred&quot;/&gt;    <br />但是下面的代码具有不同的意思：</p>
<p>&lt;@greet person=Fred/&gt;    <br />这意味着将Fred变量的值传给person参数，该值不仅是字符串，还可以是其它类型，甚至是复杂的表达式。</p>
<p>宏可以有多参数，下面是一个例子：</p>
<p>&lt;#macro greet person color&gt; &lt;font size=&quot;+2&quot; color=&quot;${color}&quot;&gt;Hello ${person}!&lt;/font&gt;&lt;/#macro&gt;    <br />可以这样使用该宏变量，其中参数的次序是无关的：</p>
<p>&lt;@greet person=&quot;Fred&quot; color=&quot;black&quot;/&gt;    <br />可以在定义参数时指定缺省值，否则，在调用宏的时候，必须对所有参数赋值：</p>
<p>&lt;#macro greet person color=&quot;black&quot;&gt; &lt;font size=&quot;+2&quot; color=&quot;${color}&quot;&gt;Hello ${person}!&lt;/font&gt;&lt;/#macro&gt;    <br />注意：宏的参数是局部变量，只能在宏定义中有效。</p>
<p>嵌套内容    <br />FreeMarker的宏可以有嵌套内容，&lt;#nested&gt;指令会执行宏调用指令开始和结束标记之间的模板片断，举一个简单的例子：</p>
<p>&lt;#macro border&gt; &lt;table border=4 cellspacing=0 cellpadding=4&gt;&lt;tr&gt;&lt;td&gt;&#160;&#160;&#160; &lt;#nested&gt; &lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;&lt;/#macro&gt;    <br />执行宏调用：</p>
<p>&lt;@border&gt;The bordered text&lt;<a>/@border</a>&gt;     <br />输出结果：</p>
<p>&lt;table border=4 cellspacing=0 cellpadding=4&gt;&lt;tr&gt;&lt;td&gt;&#160;&#160;&#160; The bordered text &lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;    <br />&lt;#nested&gt;指令可以被多次调用，每次都会执行相同的内容。</p>
<p>&lt;#macro do_thrice&gt; &lt;#nested&gt; &lt;#nested&gt; &lt;#nested&gt;&lt;/#macro&gt;&lt;@do_thrice&gt; Anything.&lt;<a>/@do_thrice</a>&gt;     <br />FMPP 输出结果：</p>
<p>Anything.Anything.Anything.    <br />嵌套内容可以是有效的FTL，下面是一个有些复杂的例子，我们将上面三个宏组合起来：</p>
<p>&lt;@border&gt; &lt;ul&gt; &lt;@do_thrice&gt;&#160;&#160;&#160; &lt;li&gt;&lt;@greet person=&quot;Joe&quot;/&gt; &lt;<a>/@do_thrice</a>&gt; &lt;/ul&gt;&lt;<a>/@border</a>&gt;     <br />输出结果：</p>
<p>&lt;table border=4 cellspacing=0 cellpadding=4&gt;&lt;tr&gt;&lt;td&gt; &lt;ul&gt;&#160;&#160;&#160; &lt;li&gt;&lt;font size=&quot;+2&quot;&gt;Hello Joe!&lt;/font&gt;&lt;li&gt;&lt;font size=&quot;+2&quot;&gt;Hello Joe!&lt;/font&gt;&lt;li&gt;&lt;font size=&quot;+2&quot;&gt;Hello Joe!&lt;/font&gt;&lt;/ul&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/table&gt;    <br />宏定义中的局部变量对嵌套内容是不可见的，例如：</p>
<p>&lt;#macro repeat count&gt; &lt;#local y = &quot;test&quot;&gt; &lt;#list 1..count as x&gt;&#160;&#160;&#160; ${y} ${count}/${x}: &lt;#nested&gt; &lt;/#list&gt;&lt;/#macro&gt;&lt;@repeat count=3&gt;${y?default(&quot;?&quot;)} ${x?default(&quot;?&quot;)} ${count?default(&quot;?&quot;)}&lt;<a>/@repeat</a>&gt;     <br />输出结果：</p>
<p>test 3/1: ? ? ?test 3/2: ? ? ?test 3/3: ? ? ?    <br />在宏定义中使用循环变量     <br />nestted指令也可以有循环变量（循环变量的含义见下节），调用宏的时候在宏指令的参数后面依次列出循环变量的名字，格式如下：</p>
<p>&lt;@ macro_name paramter list; loop variable list[,]&gt;    <br />例如：</p>
<p>&lt;#macro repeat count&gt; &lt;#list 1..count as x&gt;&#160;&#160;&#160; &lt;#nested x, x/2, x==count&gt; &lt;/#list&gt;&lt;/#macro&gt;&lt;@repeat count=4 ; c, halfc, last&gt; ${c}. ${halfc}&lt;#if last&gt; Last!&lt;/#if&gt;&lt;<a>/@repeat</a>&gt;     <br />这里count是宏的参数，c, halfc,last则为循环变量，输出结果：</p>
<p>1. 0.5 2. 1 3. 1.5 4. 2 Last!    <br />循环变量和宏标记指定的不同不会有问题，如果调用时少指定了循环变量，那么多余的值不可见。调用时多指定了循环变量，多余的循环变量不会被创建：</p>
<p>&lt;@repeat count=4 ; c, halfc, last&gt; ${c}. ${halfc}&lt;#if last&gt; Last!&lt;/#if&gt;&lt;<a>/@repeat&gt;&lt;@repeat</a> count=4 ; c, halfc&gt; ${c}. ${halfc}&lt;<a>/@repeat&gt;&lt;@repeat</a> count=4&gt; Just repeat it&#8230;&lt;<a>/@repeat</a>&gt;     <br />在模板中定义变量     <br />在模板中定义的变量有三种类型：</p>
<p>plain变量：可以在模板的任何地方访问，包括使用include指令插入的模板，使用assign指令创建和替换。    <br />局部变量：在宏定义体中有效，使用local指令创建和替换。     <br />循环变量：只能存在于指令的嵌套内容，由指令（如list）自动创建；宏的参数是局部变量，而不是循环变量     <br />局部变量隐藏（而不是覆盖）同名的plain变量；循环变量隐藏同名的局部变量和plain变量，下面是一个例子：</p>
<p>&lt;#assign x = &quot;plain&quot;&gt;${x} &lt;#&#8211; we see the plain var. here &#8211;&gt;&lt;@test/&gt;6. ${x} &lt;#&#8211; the value of plain var. was not changed &#8211;&gt;&lt;#list [&quot;loop&quot;] as x&gt;&#160;&#160;&#160; 7. ${x} &lt;#&#8211; now the loop var. hides the plain var. &#8211;&gt;&#160;&#160;&#160; &lt;#assign x = &quot;plain2&quot;&gt; &lt;#&#8211; replace the plain var, hiding does not mater here &#8211;&gt;&#160;&#160;&#160; 8. ${x} &lt;#&#8211; it still hides the plain var. &#8211;&gt;&lt;/#list&gt;9. ${x} &lt;#&#8211; the new value of plain var. &#8211;&gt;&lt;#macro test&gt; 2. ${x} &lt;#&#8211; we still see the plain var. here &#8211;&gt; &lt;#local x = &quot;local&quot;&gt; 3. ${x} &lt;#&#8211; now the local var. hides it &#8211;&gt; &lt;#list [&quot;loop&quot;] as x&gt;&#160;&#160;&#160; 4. ${x} &lt;#&#8211; now the loop var. hides the local var. &#8211;&gt; &lt;/#list&gt; 5. ${x} &lt;#&#8211; now we see the local var. again &#8211;&gt;&lt;/#macro&gt;    <br />输出结果：</p>
<p>1. plain 2. plain 3. local 4. loop 5. local 6. plain 7. loop 8. loop 9. plain2    <br />内部循环变量隐藏同名的外部循环变量，如：</p>
<p>&lt;#list [&quot;loop 1&quot;] as x&gt; ${x} &lt;#list [&quot;loop 2&quot;] as x&gt;&#160;&#160;&#160; ${x}&#160;&#160;&#160; &lt;#list [&quot;loop 3&quot;] as x&gt;&#160;&#160;&#160;&#160;&#160; ${x}&#160;&#160;&#160; &lt;/#list&gt;&#160;&#160;&#160; ${x} &lt;/#list&gt; ${x}&lt;/#list&gt;    <br />输出结果：</p>
<p>loop 1&#160;&#160;&#160; loop 2&#160;&#160;&#160;&#160;&#160; loop 3&#160;&#160;&#160; loop 2 loop 1    <br />模板中的变量会隐藏（而不是覆盖）数据模型中同名变量，如果需要访问数据模型中的同名变量，使用特殊变量global，下面的例子假设数据模型中的user的值是Big Joe：</p>
<p>&lt;#assign user = &quot;Joe Hider&quot;&gt;${user}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;#&#8211; prints: Joe Hider &#8211;&gt;${.globals.user} &lt;#&#8211; prints: Big Joe &#8211;&gt;    <br />名字空间     <br />通常情况，只使用一个名字空间，称为主名字空间，但为了创建可重用的宏、变换器或其它变量的集合（通常称库），必须使用多名字空间，其目的是防止同名冲突</p>
<p>创建库    <br />下面是一个创建库的例子（假设保存在lib/my_test.ftl中）：</p>
<p>&lt;#macro copyright date&gt; &lt;p&gt;Copyright (C) ${date} Julia Smith. All rights reserved. &lt;br&gt;Email: ${mail}&lt;/p&gt;&lt;/#macro&gt; &lt;#assign mail = &quot;<a href="mailto:jsmith@acme.com">jsmith@acme.com</a>&quot;&gt;     <br />使用import指令导入库到模板中，Freemarker会为导入的库创建新的名字空间，并可以通过import指令中指定的散列变量访问库中的变量：</p>
<p>&lt;#import &quot;/lib/my_test.ftl&quot; as my&gt;&lt;#assign mail=&quot;<a href="mailto:fred@acme.com%22%3E%3C@my.copyright">fred@acme.com&quot;&gt;&lt;@my.copyright</a> date=&quot;1999-2002&quot;/&gt;${my.mail}${mail}     <br />输出结果：</p>
<p>&lt;p&gt;Copyright (C) 1999-2002 Julia Smith. All rights reserved. &lt;br&gt;Email: <a href="mailto:jsmith@acme.com%3C/p%3Ejsmith@acme.comfred@acme.com">jsmith@acme.com&lt;/p&gt;jsmith@acme.comfred@acme.com</a>     <br />可以看到例子中使用的两个同名变量并没有冲突，因为它们位于不同的名字空间。还可以使用assign指令在导入的名字空间中创建或替代变量，下面是一个例子：</p>
<p>&lt;#import &quot;/lib/my_test.ftl&quot; as my&gt;${my.mail}&lt;#assign mail=&quot;<a href="mailto:jsmith@other.com">jsmith@other.com</a>&quot; in my&gt;${my.mail}     <br />输出结果：</p>
<p><a href="mailto:jsmith@acme.comjsmith@other.com">jsmith@acme.comjsmith@other.com</a>     <br />数据模型中的变量任何地方都可见，也包括不同的名字空间，下面是修改的库：</p>
<p>&lt;#macro copyright date&gt; &lt;p&gt;Copyright (C) ${date} ${user}. All rights reserved.&lt;/p&gt;&lt;/#macro&gt;&lt;#assign mail = &quot;<a href="mailto:$%7Buser%7D@acme.com">${user}@acme.com</a>&quot;&gt;     <br />假设数据模型中的user变量的值是Fred，则下面的代码：</p>
<p>&lt;#import &quot;/lib/my_test.ftl&quot; as my&gt;&lt;@my.copyright date=&quot;1999-2002&quot;/&gt;${my.mail}    <br />输出结果：</p>
<p>&lt;p&gt;Copyright (C) 1999-2002 Fred. All rights reserved.&lt;/p&gt;Fred@acme.com    <br />选择Velocity还是FreeMarker?     <br />Velocity是另外一个优秀的模板引擎，它是FreeMarker的有力竞争者。但是它的模板语言不够强大，也不够严谨。</p>
<p>除开FreeMarker内建的Velocity所没有的强大函数外，FreeMarker还在以下方面更胜一筹：</p>
<p>与Velocity 相比，FreeMarker 对表现逻辑和业务逻辑的划分更为严格，Freemarker在模板中不允许对Servlet API进行直接操作（而Velocity可以），如FreeMarker 中禁止对HttpServletRequest 对象直接访问（但可以访问HttpServletRequest对象中的Attribute）。通过更加严格的隔离机制，牵涉逻辑处理的操作被强制转移到逻辑层。从而完全保证了层次之间的清晰性。</p>
<p>另外一个Velocity无法实现的特性，也是最具备实际意义的特性：FreeMarker提供了强大的宏。</p>
<p>此 外，FreeMarker对JSP Tag提供了良好支持。我们可以将FreeMarker看作是仅允许使用TAG的JSP页面（实际上，FreeMarker的表达式语法与EL语法也非常类似）。从开发角度而言，只允许使用TAG的JSP页面，已经在很大程度上保证了页面表现逻辑与业务逻辑的分离。程序员在JSP Script中混杂逻辑代码的原因，大部分是出于慵懒，只要无法在页面模板中直接编写Java代码，相信程序员也不会去专门编写一个JSP TAG来刻意违反层次划分原则。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-macro-use-140/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker生成html静态页面实例</title>
		<link>http://javadou.com/freemarker-to-html-139/</link>
		<comments>http://javadou.com/freemarker-to-html-139/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 05:00:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[recommend]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-to-html-139/</guid>
		<description><![CDATA[在原来web的例子中修改下java类和xml配置就可以了

原来的例子：http://javadou.com/freemarker-how-to-use-135... ]]></description>
			<content:encoded><![CDATA[<p>在原来web的例子中修改下java类和xml配置就可以了</p>
<p>原来的例子：<a title="http://javadou.com/freemarker-how-to-use-135/" href="http://javadou.com/freemarker-how-to-use-135/">http://javadou.com/freemarker-how-to-use-135/</a></p>
<p>BuildHTML.java</p>
<pre class="java">package example;
import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import freemarker.template.*;
public class BuildHTML extends HttpServlet{
  private Configuration cfg;

  public void init()

  {&#160;&#160;&#160;
//初始化FreeMarker配置&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
 //创建一个Configuration实例&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
cfg = new Configuration();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
//设置FreeMarker的模版文件位置&#160;&#160;&#160;
cfg.setServletContextForTemplateLoading(getServletContext(),&quot;templates&quot;);

  }</pre>
<pre class="java">public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
  {&#160;&#160;&#160;
//建立数据模型&#160;&#160;&#160; Map root = new HashMap();&#160;&#160;&#160;
//放入对应数据key value&#160;&#160;&#160; root.put(&quot;user&quot;,&quot;zdz&quot;);&#160;&#160;&#160;
//取得模版文件&#160;&#160;&#160; Template t =cfg.getTemplate(&quot;hello.ftl&quot;);&#160;&#160;&#160;
 //开始准备生成输出,输出到文件中&#160;&#160;&#160; File file = new File(getServletContext().getRealPath(&quot;/&quot;) + &quot;/hello.html&quot;);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!file.exists())&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; file.createNewFile();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Writer out = new FileWriter(file);&#160;&#160;&#160; //合并数据模型和模版，并将结果输出到out中&#160;&#160;&#160; try&#160;&#160;&#160; {&#160;&#160;&#160;&#160; t.process(root,out);// 用模板来开发servlet可以只在代码里面加入动态的数据&#160;&#160;&#160; }&#160;&#160;&#160; catch(TemplateException e)&#160;&#160;&#160; {&#160;&#160;&#160;&#160; throw new ServletException(&quot;处理Template模版中出现错误&quot;, e);&#160;&#160;&#160; }

  }

  }</pre>
<p>web.xml的配置</p>
<pre class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  &lt;web-app version=&quot;2.4&quot; xmlns=&quot;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&quot;

  xmlns:xsi=&quot;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&quot;

  xsi:schemaLocation=&quot;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>

  <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&quot;&gt;

  &lt;servlet&gt;&#160;&#160;&#160; &lt;servlet-name&gt;Hello&lt;/servlet-name&gt;&#160;&#160;&#160; &lt;servlet-class&gt;example.Hello&lt;/servlet-class&gt;

  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;&#160;&#160;&#160; &lt;servlet-name&gt;Hello&lt;/servlet-name&gt;&#160;&#160;&#160; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;

  &lt;/servlet-mapping&gt;

  &lt;servlet&gt;&#160;&#160;&#160; &lt;servlet-name&gt;BuildHTML&lt;/servlet-name&gt;&#160;&#160;&#160; &lt;servlet-class&gt;example.BuildHTML&lt;/servlet-class&gt;

  &lt;/servlet&gt;

  &lt;servlet-mapping&gt;&#160;&#160;&#160; &lt;servlet-name&gt;BuildHTML&lt;/servlet-name&gt;&#160;&#160;&#160; &lt;url-pattern&gt;*.b&lt;/url-pattern&gt;

  &lt;/servlet-mapping&gt;

  &lt;welcome-file-list&gt;&#160;&#160;&#160; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;

  &lt;/welcome-file-list&gt;

  &lt;/web-app&gt;</pre>
<p>========================</p>
<p>打开ie输入<a href="http://localhost:8080/testFM/zdz.b">http://localhost:8080/testFM/zdz.b</a></p>
<p>则在D:\Tomcat 5.5\webapps\testFM目录下生成了hello.html</p>
<p>效果跟<a href="http://localhost:8080/testFM/hello.do">http://localhost:8080/testFM/hello.do</a> 一样，以后就可以直接访问这个html页面了，更新内容只要执行下xxx.b就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-to-html-139/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在struts2中配置freemarker</title>
		<link>http://javadou.com/config-freemarker-in-struts2-138/</link>
		<comments>http://javadou.com/config-freemarker-in-struts2-138/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 04:52:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[Struts2]]></category>
		<category><![CDATA[struts2]]></category>

		<guid isPermaLink="false">http://javadou.com/config-freemarker-in-struts2-138/</guid>
		<description><![CDATA[普通的struts2配置文件一般是这么配置的：

    /page.jsp


这里的view是一个jsp页面，也可以改成是一个freemarker模板页面... ]]></description>
			<content:encoded><![CDATA[<p>普通的struts2配置文件一般是这么配置的： </p>
<pre class="xml">&lt;action name=&quot;Action1&quot; class=&quot;com.abc.Action1&quot;&gt;
  &lt;result&gt;/page.jsp&lt;/result&gt;

&lt;/action&gt;</pre>
<p>这里的view是一个jsp页面，也可以改成是一个freemarker模板页面：</p>
<pre class="xml">&lt;action name=&quot;Action1&quot; class=&quot;com.abc.Action1&quot;&gt;
  &lt;result type=&quot;freemarker&quot;&gt;/fm.ftl&lt;/result&gt;

&lt;/action&gt;</pre>
<p>当然我们希望能在fm.ftl上使用struts2的标签，需要在fm.ftl页面最开始添加对struts2标签的引用：</p>
<pre class="xml">&lt;#assign s=JspTaglibs[&quot;/WEB-INF/struts-tags.tld&quot;] /&gt;</pre>
<p>引用前把struts2-core-2.0.x.x.jar包里的META-INF/struts-tags.tld 复制到 /WEB-INF/struts-tags.tld</p>
<p>默认是不支持JspTaglibs的引用的，这里还需要一个额外的配置，修改web.xml，添加如下内容：</p>
<pre class="java">&lt;servlet&gt;
  &lt;servlet-name&gt;JspSupportServlet&lt;/servlet-name&gt;

&lt;servlet-class&gt;

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; org.apache.struts2.views.JspSupportServlet

&lt;/servlet-class&gt;

&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;

&lt;/servlet&gt;</pre>
<p>一个简单的fm.ftl文件的例子：</p>
<pre class="html">&lt;#assign s=JspTaglibs[&quot;/WEB-INF/struts-tags.tld&quot;] /&gt;
  &lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=GB2312&quot;&gt;

&lt;title&gt;Insert title here&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;@s.form action=&quot;Action1.action&quot;&gt;

&lt;@s.textfield name=&quot;username&quot;&gt;&lt;/@s.textfield&gt;

&lt;@s.textfield name=&quot;password&quot;&gt;&lt;/@s.textfield&gt;

&lt;@s.submit value=&quot;提交&quot;/&gt;

&lt;/@s.form&gt;

&lt;br/&gt;登录用户名：${username}

&lt;/body&gt;

&lt;/html&gt;</pre>
<p>注意：struts2在freemarker页面中标签写法和jsp页面的写法不同，freemarker里是&lt;@s.form&gt;，jsp里是&lt;s:form&gt;，一定不要写错了！</p>
<p>使用时发现对中文的支持不好，显示时中文出现乱码，这里修改下struts.xml配置文件：</p>
<pre class="xml">&lt;constant name=&quot;struts.i18n.encoding&quot; value=&quot;gb2312&quot; /&gt;</pre>
<p>现在就可以在struts2中正常使用freemarker了!</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/config-freemarker-in-struts2-138/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用freemarker不用web容器demo</title>
		<link>http://javadou.com/freemarker-with-out-web-server-137/</link>
		<comments>http://javadou.com/freemarker-with-out-web-server-137/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 03:50:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-with-out-web-server-137/</guid>
		<description><![CDATA[加入一个包含main方法的java文件： package example; import java.util.*; import java.io.*; import freemarker.template.*; public class HelloFreeMarker { &160;&160;&160; private Configuration cfg; &160;&160;&160; public void init() throws Exception { &160;&160;&160;&... ]]></description>
			<content:encoded><![CDATA[<p>加入一个包含main方法的java文件：</p>
<pre class="java">package example;
  import java.util.*;

import java.io.*;

import freemarker.template.*;


public class HelloFreeMarker
  {

&#160;&#160;&#160; private Configuration cfg; 

&#160;&#160;&#160; public void init() throws Exception

{

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //初始化FreeMarker配置

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //创建一个Configuration实例

&#160;&#160;&#160;&#160;&#160;&#160;&#160; cfg = new Configuration();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //设置FreeMarker的模版文件位置

&#160;&#160;&#160;&#160;&#160;&#160;&#160; cfg.setDirectoryForTemplateLoading(new File(&quot;WebRoot/templates&quot;));//这个路径一定要设置正确

&#160;&#160;&#160; }

public void process()throws Exception

{

&#160;&#160;&#160;&#160;&#160;&#160;&#160; Map root = new HashMap();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; root.put(&quot;name&quot;, &quot;zdz&quot;); 

&#160;&#160; root.put(&quot;msg&quot; , &quot;您已经完成了一个FreeMarker的示例&quot;);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; Template t = cfg.getTemplate(&quot;runInMain.ftl&quot;);

&#160;&#160;&#160;&#160;&#160;&#160;&#160; t.process(root, new OutputStreamWriter(System.out));

}

public static void main(String[] args)throws Exception
  {

&#160;&#160; HelloFreeMarker hf = new HelloFreeMarker();

&#160;&#160; hf.init();

&#160;&#160; hf.process(); 

}

}
</pre>
<p>＝＝＝＝＝＝＝＝＝＝＝</p>
<p>加入一个模板runInMain.ftl</p>
<p>====================</p>
<p>${name}，你好！${msg}</p>
<p>====================</p>
<p>用elcipse运行java类，</p>
<p>如果在控制台看到：</p>
<p>zdz，你好！您已经完成了一个FreeMarker的示例</p>
<p>则说明成功了。</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-with-out-web-server-137/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker教程基本指令介绍</title>
		<link>http://javadou.com/freemarker-orders-intro-136/</link>
		<comments>http://javadou.com/freemarker-orders-intro-136/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 02:54:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-orders-intro-136/</guid>
		<description><![CDATA[一：if指令： 
... 
... 
... 
...... 
 
二：switch 
 
... 
...... 
..... ]]></description>
			<content:encoded><![CDATA[<p>一：if指令：    <br />&lt;#if <em>condition</em>&gt;<em>&#8230;</em>     <br />&lt;#elseif <em>condition2</em>&gt;<em>&#8230;</em>     <br />&lt;#elseif <em>condition3</em>&gt;<em>&#8230;</em>     <br /><em>&#8230;</em>&lt;#else&gt;<em>&#8230;</em>     <br />&lt;/#if&gt;     <br />二：switch     <br />&lt;#switch <em>value</em>&gt;     <br />&lt;#case <em>refValue1</em>&gt;<em>&#8230;</em>&lt;#break&gt;     <br />&lt;#case <em>refValue2</em>&gt;<em>&#8230;</em>&lt;#break&gt;<em>&#8230;</em>     <br />&lt;#case <em>refValueN</em>&gt;<em>&#8230;</em>&lt;#break&gt;     <br />&lt;#default&gt;<em>&#8230;</em>&lt;/#switch&gt;     <br />三：list，break     <br />&lt;#list <em>sequence</em> as <em>item</em>&gt;     <br /><em>&#8230;</em>     <br />&lt;/#list&gt;     <br /><tt>两个特殊的循环变量：</tt>     <br /><tt><em>item</em>_index</tt>: 当前变量的索引值。     <br /><tt><em>item</em>_has_next</tt>: 是否存在下一个对象。     <br />可以用&lt;#break/&gt;指令离开loop循环。     <br />四：include指令     <br />&lt;#include <em>filename</em>&gt;<tt>或者      <br />&lt;#include <em>filename</em><em>options</em>&gt;</tt><tt><em>        <br />filename</em></tt>: 表达式转换为字符串     <br /><tt><em>options</em></tt>: <tt>encoding=<em>encoding</em></tt>, <tt>parse=<em>parse</em></tt> <tt><em>encoding</em></tt>: 表达式转换为字符串     <br /><tt><em>parse</em></tt>: 表达式转换为逻辑值，是否作为ftl文件解析。     <br />&lt;#include &quot;/common/navbar.html&quot; parse=false encoding=&quot;Shift_JIS&quot;&gt;     <br />&lt;#include &quot;*/footer.ftl&quot;&gt;表示当前目录下以及所有父目录下的文件。如果当前模版在/foo/bar/template.ftl ，那么查找footer.ftl的顺序为：<tt>/foo/bar/footer.ftl</tt>     <br /><tt>/foo/footer.ftl</tt>/<tt>footer.ftl</tt>这种方式讲允许设计者将通用的模版放在父文件夹里面。     <br />也可以只指定部分路径：&lt;#include &quot;*/commons/footer.ftl&quot;&gt;     <br />五：import指令&lt;#import <em>path</em> as <em>hash</em>&gt;     <br />六：noparse     <br />&lt;#noparse&gt;     <br /><em>&#8230;</em>     <br />&lt;/#noparse&gt;     <br />七：compress     <br />&lt;#compress&gt;     <br /><em>&#8230;</em>     <br />&lt;/#compress&gt;     <br />八：escape，noescape     <br />&lt;#escape <em>identifier</em> as <em>expression</em>&gt;     <br /><em>&#8230;</em>     <br />&lt;#noescape&gt;&#8230;&lt;/#noescape&gt;     <br /><em>&#8230;</em>     <br />&lt;/#escape&gt;     <br />escape指令body区的ftl的interpolations都会被自动加上escape表达式。但是不会影响字符串内的interpolations。而且也只会影响到body内出现的interpolations，比如不会影响到include的ftl的interpolations。</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<p>除了相关的文本外，在FreeMarker模板中可以包括下面三种特定部分：</p>
<ol>
<li>${…}：称为插补(interpolations)，FreeMarker会在输出时用实际值进行替代。 </li>
<li>指令：也叫FreeMarker标记，与HTML标记类似，但用#开始（有些以@开始，在后面叙述）。 </li>
<li>注释：包含在&lt;#&#8211; 和 &#8211;&gt;（而不是&lt;!&#8211;和&#8211;&gt;）之间文本。 </li>
</ol>
<h5>控制指令</h5>
<h5>if指令</h5>
<p>if指令与大部分程式语言一样，也支持&lt;#else if..&gt;，不再赘述。</p>
<pre>&lt;#if animals.python.price &lt; animals.elephant.price&gt;&#160;&#160; Pythons are cheaper than elephants today.&lt;#else&gt;&#160;&#160; Pythons are not cheaper than elephants today.&lt;/#if&gt;</pre>
<h5>list指令</h5>
<p>list指令将遍历Sequences里的每一个元素。list指令有两个隐含的特殊变量：</p>
<ol>
<li>item_index 该变量将返回元素在Sequences里的索引值。 </li>
<li>item_has_next 该变量是boolean型，false表明该元素是Sequences里的最后一个元素。 </li>
</ol>
<pre>&lt;p&gt;We have these animals:&lt;table border=1&gt;&#160;&#160; &lt;tr&gt;&lt;th&gt;Id&lt;th&gt;Name&lt;th&gt;Price&#160;&#160; &lt;#list animals as being&gt;&#160;&#160; &lt;tr&gt;&lt;td&gt;${being_index+1}&lt;td&gt;${being.name}&lt;td&gt;${being.price} Euros&#160;&#160; &lt;/#list&gt;&lt;/table&gt;</pre>
<p>上面的模板可以依次列印出三种动物的名字和价格，being_index和being_has_next则是它的特殊变量。</p>
<p>可以用&lt;#break&gt;指令提前结束list循环。</p>
<h5>switch指令</h5>
<p>与其他语言的switch语句类似。</p>
<pre>&lt;#switch being.size&gt;&#160;&#160; &lt;#case &quot;small&quot;&gt;&#160;&#160;&#160;&#160;&#160; This will be processed if it is small&#160;&#160;&#160;&#160;&#160; &lt;#break&gt;&#160;&#160; &lt;#case &quot;medium&quot;&gt;&#160;&#160;&#160;&#160;&#160; This will be processed if it is medium&#160;&#160;&#160;&#160;&#160; &lt;#break&gt;&#160;&#160; &lt;#case &quot;large&quot;&gt;&#160;&#160;&#160;&#160;&#160; This will be processed if it is large&#160;&#160;&#160;&#160;&#160; &lt;#break&gt;&#160;&#160; &lt;#default&gt;&#160;&#160;&#160;&#160;&#160; This will be processed if it is neither&lt;/#switch&gt;</pre>
<p><strong>&lt;#escape x as x?html&gt;</strong> </p>
<p>First name: ${firstName} </p>
<p>Last name: ${lastName} </p>
<p>Maiden name: ${maidenName}<strong>&lt;/#escape&gt;<br />
    <br />等同于：</strong></p>
<p>First name: ${firstName<strong>?html</strong>} </p>
<p>Last name: ${lastName<strong>?html</strong>} </p>
<p>Maiden name: ${maidenName<strong>?html</strong>} </p>
<p>escape指令在解析模版时起作用，而不是运行时起作用。 </p>
<p>escape指令还能嵌套使用，子继承父的escape规则。 </p>
<p><strong>&lt;#escape x as x?html&gt;</strong> </p>
<p>Customer Name: ${customerName} </p>
<p>Items to ship: </p>
<p><strong>&lt;#escape x as itemCodeToNameMap[x]&gt;</strong> </p>
<p>${itemCode1} </p>
<p>${itemCode2} </p>
<p>${itemCode3} </p>
<p>${itemCode4} </p>
<p><strong>&lt;/#escape&gt;</strong><strong>&lt;/#escape&gt;<br />
    <br />等同于：</strong>Customer Name: ${customerName?html} </p>
<p>Items to ship: </p>
<p>${itemCodeToNameMap[itemCode1]?html} </p>
<p>${itemCodeToNameMap[itemCode2]?html} </p>
<p>${itemCodeToNameMap[itemCode3]?html} </p>
<p>${itemCodeToNameMap[itemCode4]?html} </p>
<p>九：assign指令</p>
<pre><tt>&lt;#assign <em>name</em>=<em>value</em>&gt;</tt>
or
<tt>&lt;#assign <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>
or
<tt>&lt;#assign <em>same as above...</em> in <em>namespacehash</em>&gt;</tt>
or
<tt>&lt;#assign <em>name</em>&gt;&#160;&#160; <em>capture this</em>
&lt;/#assign&gt;</tt>
or
<tt>&lt;#assign <em>name</em> in <em>namespacehash</em>&gt;&#160;&#160; <em>capture this</em>
&lt;/#assign&gt;</tt>创建或者替换一个已经存在的变量，只能作用于顶层变量。
不好的做法：&lt;#assign x&gt;Hello ${user}!&lt;/#assign&gt;更改为：&lt;#assign x=&quot;Hello ${user}!&quot;&gt;

</pre>
<p>十：global指令 </p>
<p>&lt;#global <em>name</em>=<em>value</em>&gt; </p>
<p>or </p>
<p><tt>&lt;#global <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>or<tt>&lt;#global <em>name</em>&gt; </p>
<p><em>capture this</em> </p>
<p>&lt;/#global&gt;</tt> </p>
<p>十一：local指令 </p>
<p>&lt;#local <em>name</em>=<em>value</em>&gt; </p>
<p>or </p>
<p><tt>&lt;#local <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>or<tt>&lt;#local <em>name</em>&gt; </p>
<p><em>capture this</em> </p>
<p>&lt;/#local&gt;</tt>只能用于macro的定义body中。 </p>
<p>十二：setting指令： </p>
<p>&lt;#setting <em>name</em>=<em>value</em>&gt; </p>
<p>name的取值范围： </p>
<p>local：number_format： </p>
<p>boolean_format:缺省值为&quot;true,false&quot; </p>
<p>date_format, <tt>time_format</tt>, <tt>datetime_format<br />
  <br />time_zone：</tt>url_escaping_charset </p>
<p>classic_compatible </p>
<p>十三：用户自定义指令 </p>
<pre><tt>&lt;@<em>macro_or_transf</em><em>param1</em>=<em>val1</em><em>param2</em>=<em>val2</em><em>...</em><em>paramN</em>=<em>valN</em>/&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>param1</em>=<em>val1</em><em>param2</em>=<em>val2</em><em>...</em><em>paramN</em>=<em>valN</em> ; <em>lv1</em>, <em>lv2</em>, <em>...</em>, <em>lvN</em>/&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>...</em>&gt;&#160;&#160;&#160; ...
&lt;/@<em>macro_or_transf</em>&gt;</tt><tt>

&lt;@<em>macro_or_transf</em><em>...</em>&gt;&#160;&#160;&#160; ...
&lt;/@&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>val1</em>, <em>val2</em>, <em>...</em>, <em>valN</em>/&gt;</tt></pre>
<p>十四：macro,nested,return </p>
<p>&lt;#macro <em>name</em><em>param1</em><em>param2</em><em>&#8230; paramN</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;#nested <em>loopvar1</em>, <em>loopvar2</em>, <em>&#8230;</em>, <em>loopvarN</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;#return&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;/#macro&gt; </p>
<p>十五：function, return </p>
<p>&lt;#function <em>name</em><em>param1</em><em>param2</em><em>&#8230; paramN</em>&gt; </p>
<p><em>&#8230;</em> &lt;#return <em>returnValue</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;/#function&gt; </p>
<p>&lt;#function avg x y&gt; </p>
<p>&lt;#return (x + y) / 2&gt; </p>
<p>&lt;/#function&gt; </p>
<p>${avg(10, 20)} </p>
<p>十六：flush </p>
<p>&lt;#flush&gt; </p>
<p>十七：stop </p>
<p>&lt;#stop&gt; </p>
<p>or </p>
<p><tt>&lt;#stop <em>reason</em>&gt;</tt>取消处理模版。 </p>
<p>十八：ftl指令 </p>
<p>&lt;#ftl <em>param1</em>=<em>value1</em><em>param2</em>=<em>value2</em><em>&#8230;</em><em>paramN</em>=<em>valueN</em>&gt; </p>
<p>ftl指令必须放在ftl文件的最上面。 </p>
<p>参数范围： </p>
<p>encoding： </p>
<p>strip_whitespace </p>
<p>strip_text </p>
<p>strict_syntax </p>
<p>十九：t, lt, rt </p>
<p>二十：attempt, recover </p>
<p>&lt;#attempt&gt; </p>
<p><em>attempt block</em>&lt;#recover&gt; </p>
<p><em>recover block</em> </p>
<p>&lt;/#attempt&gt; </p>
<p>&lt;#attempt&gt;<br />
  <br />Optional content: ${thisMayFails} </p>
<p>&lt;#recover&gt; </p>
<p>Ops! The optional content is not available. </p>
<p>&lt;/#attempt&gt;</p>
<p><strong>&lt;#escape x as x?html&gt;</strong> </p>
<p>First name: ${firstName} </p>
<p>Last name: ${lastName} </p>
<p>Maiden name: ${maidenName}<strong>&lt;/#escape&gt;<br />
    <br />等同于：</strong></p>
<p>First name: ${firstName<strong>?html</strong>} </p>
<p>Last name: ${lastName<strong>?html</strong>} </p>
<p>Maiden name: ${maidenName<strong>?html</strong>} </p>
<p>escape指令在解析模版时起作用，而不是运行时起作用。 </p>
<p>escape指令还能嵌套使用，子继承父的escape规则。 </p>
<p><strong>&lt;#escape x as x?html&gt;</strong> </p>
<p>Customer Name: ${customerName} </p>
<p>Items to ship: </p>
<p><strong>&lt;#escape x as itemCodeToNameMap[x]&gt;</strong> </p>
<p>${itemCode1} </p>
<p>${itemCode2} </p>
<p>${itemCode3} </p>
<p>${itemCode4} </p>
<p><strong>&lt;/#escape&gt;</strong><strong>&lt;/#escape&gt;<br />
    <br />等同于：</strong>Customer Name: ${customerName?html} </p>
<p>Items to ship: </p>
<p>${itemCodeToNameMap[itemCode1]?html} </p>
<p>${itemCodeToNameMap[itemCode2]?html} </p>
<p>${itemCodeToNameMap[itemCode3]?html} </p>
<p>${itemCodeToNameMap[itemCode4]?html} </p>
<p>九：assign指令</p>
<pre><tt>&lt;#assign <em>name</em>=<em>value</em>&gt;</tt>
or
<tt>&lt;#assign <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>
or
<tt>&lt;#assign <em>same as above...</em> in <em>namespacehash</em>&gt;</tt>
or
<tt>&lt;#assign <em>name</em>&gt;
  <em>capture this</em>
&lt;/#assign&gt;</tt>
or
<tt>&lt;#assign <em>name</em> in <em>namespacehash</em>&gt;
  <em>capture this</em>
&lt;/#assign&gt;</tt>创建或者替换一个已经存在的变量，只能作用于顶层变量。
不好的做法：&lt;#assign x&gt;Hello ${user}!&lt;/#assign&gt;更改为：&lt;#assign x=&quot;Hello ${user}!&quot;&gt;

</pre>
<p>十：global指令 </p>
<p>&lt;#global <em>name</em>=<em>value</em>&gt; </p>
<p>or </p>
<p><tt>&lt;#global <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>or<tt>&lt;#global <em>name</em>&gt; </p>
<p><em>capture this</em> </p>
<p>&lt;/#global&gt;</tt> </p>
<p>十一：local指令 </p>
<p>&lt;#local <em>name</em>=<em>value</em>&gt; </p>
<p>or </p>
<p><tt>&lt;#local <em>name1</em>=<em>value1</em><em>name2</em>=<em>value2</em><em>... nameN</em>=<em>valueN</em>&gt;</tt>or<tt>&lt;#local <em>name</em>&gt; </p>
<p><em>capture this</em> </p>
<p>&lt;/#local&gt;</tt>只能用于macro的定义body中。 </p>
<p>十二：setting指令： </p>
<p>&lt;#setting <em>name</em>=<em>value</em>&gt; </p>
<p>name的取值范围： </p>
<p>local：number_format： </p>
<p>boolean_format:缺省值为&quot;true,false&quot; </p>
<p>date_format, <tt>time_format</tt>, <tt>datetime_format<br />
  <br />time_zone：</tt>url_escaping_charset </p>
<p>classic_compatible </p>
<p>十三：用户自定义指令 </p>
<pre><tt>&lt;@<em>macro_or_transf</em><em>param1</em>=<em>val1</em><em>param2</em>=<em>val2</em><em>...</em><em>paramN</em>=<em>valN</em>/&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>param1</em>=<em>val1</em><em>param2</em>=<em>val2</em><em>...</em><em>paramN</em>=<em>valN</em> ; <em>lv1</em>, <em>lv2</em>, <em>...</em>, <em>lvN</em>/&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>...</em>&gt;
  ...
&lt;/@<em>macro_or_transf</em>&gt;</tt><tt>

&lt;@<em>macro_or_transf</em><em>...</em>&gt;
  ...
&lt;/@&gt;</tt><tt>&lt;@<em>macro_or_transf</em><em>val1</em>, <em>val2</em>, <em>...</em>, <em>valN</em>/&gt;</tt></pre>
<p>十四：macro,nested,return </p>
<p>&lt;#macro <em>name</em><em>param1</em><em>param2</em><em>&#8230; paramN</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;#nested <em>loopvar1</em>, <em>loopvar2</em>, <em>&#8230;</em>, <em>loopvarN</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;#return&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;/#macro&gt; </p>
<p>十五：function, return </p>
<p>&lt;#function <em>name</em><em>param1</em><em>param2</em><em>&#8230; paramN</em>&gt; </p>
<p><em>&#8230;</em> &lt;#return <em>returnValue</em>&gt; </p>
<p><em>&#8230;</em> </p>
<p>&lt;/#function&gt; </p>
<p>&lt;#function avg x y&gt; </p>
<p>&lt;#return (x + y) / 2&gt; </p>
<p>&lt;/#function&gt; </p>
<p>${avg(10, 20)} </p>
<p>十六：flush </p>
<p>&lt;#flush&gt; </p>
<p>十七：stop </p>
<p>&lt;#stop&gt; </p>
<p>or </p>
<p><tt>&lt;#stop <em>reason</em>&gt;</tt>取消处理模版。 </p>
<p>十八：ftl指令 </p>
<p>&lt;#ftl <em>param1</em>=<em>value1</em><em>param2</em>=<em>value2</em><em>&#8230;</em><em>paramN</em>=<em>valueN</em>&gt; </p>
<p>ftl指令必须放在ftl文件的最上面。 </p>
<p>参数范围： </p>
<p>encoding： </p>
<p>strip_whitespace </p>
<p>strip_text </p>
<p>strict_syntax </p>
<p>十九：t, lt, rt </p>
<p>二十：attempt, recover </p>
<p>&lt;#attempt&gt; </p>
<p><em>attempt block</em>&lt;#recover&gt; </p>
<p><em>recover block</em> </p>
<p>&lt;/#attempt&gt; </p>
<p>&lt;#attempt&gt;<br />
  <br />Optional content: ${thisMayFails} </p>
<p>&lt;#recover&gt; </p>
<p>Ops! The optional content is not available. </p>
<p>&lt;/#attempt&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-orders-intro-136/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker实例搭建环境和配置</title>
		<link>http://javadou.com/freemarker-how-to-use-135/</link>
		<comments>http://javadou.com/freemarker-how-to-use-135/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 01:20:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-how-to-use-135/</guid>
		<description><![CDATA[下面演示一个简单的使用项目过程： 
1. 使用myeclipse创建一个web项目testFM 
2. 把下载到的jar包（freemarker-2.3.9.jar）放到\WebRoot\WEB-INF\lib目录下。下载地址：http://freemarker.sourceforge.net/freemarkerdownload.html （注：官方网站.org... ]]></description>
			<content:encoded><![CDATA[<p>下面演示一个简单的使用项目过程：    <br />1. 使用myeclipse创建一个web项目testFM     <br />2. 把下载到的jar包（freemarker-2.3.9.jar）放到\WebRoot\WEB-INF\lib目录下。下载地址：<a href="http://freemarker.sourceforge.net/freemarkerdownload.html">http://freemarker.sourceforge.net/freemarkerdownload.html</a> （注：官方网站.org的经常打不开）     <br />3. 在WebRoot下面新建templates文件包，然后在里面新建扩展名为ftl的模板。     <br />a) 创建hello.ftl内容如下： </p>
<pre class="html">&lt;html&gt;

&lt;head&gt;

&lt;title&gt;hello!&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;h1&gt;hello ${user}!&lt;/h1&gt;

&lt;/body&gt;

&lt;/html&gt;

</pre>
<p>4. 在src目录下创建example包 和Hello.java文件，代码如下： </p>
<pre class="java">package example;

import java.io.*;

import java.util.*;


import javax.servlet.ServletException;
  import javax.servlet.http.*;

import freemarker.template.*;

public class Hello extends HttpServlet{
  private Configuration cfg;

public void init()

{

&#160;&#160; //初始化FreeMarker配置

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //创建一个Configuration实例

&#160;&#160;&#160;&#160;&#160;&#160;&#160; cfg = new Configuration();

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //设置FreeMarker的模版文件位置

&#160;&#160; cfg.setServletContextForTemplateLoading(getServletContext(),&quot;templates&quot;);

}

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
  {

&#160;&#160; //建立数据模型

&#160;&#160; Map root = new HashMap();

&#160;&#160; //放入对应数据key value

&#160;&#160; root.put(&quot;user&quot;,&quot;zdz&quot;);

&#160;&#160; //取得模版文件

&#160;&#160; Template t =cfg.getTemplate(&quot;hello.ftl&quot;);

&#160;&#160; //开始准备生成输出

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //使用模版文件的charset作为本页面的charset

&#160;&#160;&#160;&#160;&#160;&#160;&#160; //使用text/html MIME-type

&#160;&#160;&#160;&#160;&#160;&#160;&#160; response.setContentType(&quot;text/html; charset=&quot; + t.getEncoding());

&#160;&#160; PrintWriter out = response.getWriter();

&#160;&#160; //合并数据模型和模版，并将结果输出到out中

&#160;&#160; try

&#160;&#160; {

&#160;&#160;&#160; t.process(root,out);// 用模板来开发servlet可以只在代码里面加入动态的数据

&#160;&#160; }

&#160;&#160; catch(TemplateException e)

&#160;&#160; {

&#160;&#160;&#160; throw new ServletException(&quot;处理Template模版中出现错误&quot;, e);

&#160;&#160; }

}

}
</pre>
<p>5.配置web.xml 代码如下：</p>
<pre class="xml">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
  &lt;web-app version=&quot;2.4&quot; 

xmlns=&quot;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&quot; 

xmlns:xsi=&quot;<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>&quot; 

xsi:schemaLocation=&quot;<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>

<a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>&quot;&gt;

&lt;servlet&gt;

&#160;&#160;&#160; &lt;servlet-name&gt;Hello&lt;/servlet-name&gt;

&#160;&#160;&#160; &lt;servlet-class&gt;example.Hello&lt;/servlet-class&gt;

&lt;/servlet&gt;

&lt;servlet-mapping&gt;

&#160;&#160;&#160; &lt;servlet-name&gt;Hello&lt;/servlet-name&gt;

&#160;&#160;&#160; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;

&lt;/servlet-mapping&gt;

&lt;welcome-file-list&gt;

&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;

&lt;/welcome-file-list&gt;

&lt;/web-app&gt;
</pre>
<p>6.在WebRoot下面新建引导页面index.html，代码如下：</p>
<pre class="html">

&lt;html&gt;
  &lt;head&gt;

&lt;title&gt;Hello FreeMarker Example&lt;/title&gt;

&lt;meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;

&lt;/head&gt;

&lt;body&gt;

点击下面链接看看效果：

&lt;hr&gt;

&lt;a href=&quot;hello.do&quot;&gt;调用Hello模板&lt;/a&gt; 

&lt;/body&gt;

&lt;/html&gt;
</pre>
<p>7.把testFM项目部署到tomcate并启动服务。<br />
  <br />8.打开浏览器，输入地址：<a href="http://localhost:8080/testFM/">http://localhost:8080/testFM/</a> </p>
<p>9.点击调用Hello模板 链接，如果出现hello zdz!则说明模板调用成功了！</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-how-to-use-135/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Freemarker几个比较实用的例子</title>
		<link>http://javadou.com/freemarker-demos-134/</link>
		<comments>http://javadou.com/freemarker-demos-134/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 00:44:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-demos-134/</guid>
		<description><![CDATA[Freemarker - 几个比较实用的例子

1. String内置的JavaScript转换： js_string 
用途：用于JavaScript转义，转换',",换行等特殊字符 
模板: 
alert("${errorMessage?js_string}");
 
输出: 
alert("Readonly\'s pet name is \"Cross Bone\"... ]]></description>
			<content:encoded><![CDATA[<p>Freemarker &#8211; 几个比较实用的例子</p>
<p>1. String内置的JavaScript转换： js_string    <br />用途：用于JavaScript转义，转换&#8217;,&quot;,换行等特殊字符     <br />模板: &lt;script&gt;    <br />alert(&quot;${errorMessage?js_string}&quot;);    <br />&lt;/script&gt;     <br />输出: &lt;script&gt;    <br />alert(&quot;Readonly\&#8217;s pet name is \&quot;Cross Bone\&quot;&quot;);    <br />&lt;/script&gt;</p>
<p>2.内置的默认值处理：default    <br />用途: 用于处理默认值     <br />模本: User: $&#8230;{userLogin.name?default(&quot;Anonymous&quot;)}</p>
<p>&lt;td&gt;$&#8230;{(employee.department.manager.name)?default(&quot;&amp;nbsp;&quot;)}&lt;/td&gt;   <br />输出: User: Anonymous    <br />&lt;td&gt;&amp;nbsp;&lt;/td&gt;     <br />注，可以对整个对象树加上()，再用内置处理器这种方便的做法.</p>
<p>3. Sequence内置的计数器: xxx_index    <br />用途：显示序号     <br />模板:     <br />&lt;#list employees as e&gt;    <br />$&#8230;{e_index}. $&#8230;{e.name}    <br />&lt;/#list&gt;     <br />输出:</p>
<p>1. Readonly    <br />2. Robbin</p>
<p>4. Sequence内置的分段器: chunk    <br />用途：某些比较BT的排版需求     <br />模板:     <br />&lt;#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']&gt;    <br />&lt;#list seq?chunk(4) as row&gt;    <br />&lt;ul&gt;    <br />&lt;li&gt;&lt;#list row as cell&gt;$&#8230;{cell} &lt;/#list&gt;&lt;/li&gt;    <br />&lt;/ul&gt;    <br />&lt;/#list&gt;</p>
<p>&lt;#list seq?chunk(4, &#8216;-&#8217;) as row&gt;   <br />&lt;tr&gt;    <br />&lt;td&gt;&lt;#list row as cell&gt;$&#8230;{cell} &lt;/#list&gt;&lt;/td&gt;    <br />&lt;/tr&gt;    <br />&lt;/#list&gt;     <br />输出:     <br />&lt;ul&gt;    <br />&lt;li&gt;a&lt;/li&gt;    <br />&lt;li&gt;b&lt;/li&gt;    <br />&lt;li&gt;c&lt;/li&gt;    <br />&lt;li&gt;d&lt;/li&gt;    <br />&lt;/ul&gt;    <br />&lt;ul&gt;    <br />&lt;li&gt;e&lt;/li&gt;    <br />&lt;li&gt;f&lt;/li&gt;    <br />&lt;li&gt;g&lt;/li&gt;    <br />&lt;li&gt;h&lt;/li&gt;    <br />&lt;/ul&gt;    <br />&lt;ul&gt;    <br />&lt;li&gt;i&lt;/li&gt;    <br />&lt;li&gt;j&lt;/li&gt;    <br />&lt;/ul&gt;</p>
<p>&lt;tr&gt;   <br />&lt;td&gt;a&lt;/td&gt;    <br />&lt;td&gt;b&lt;/td&gt;    <br />&lt;td&gt;c&lt;/td&gt;    <br />&lt;td&gt;d&lt;/td&gt;    <br />&lt;/tr&gt;    <br />&lt;tr&gt;    <br />&lt;td&gt;e&lt;/td&gt;    <br />&lt;td&gt;f&lt;/td&gt;    <br />&lt;td&gt;g&lt;/td&gt;    <br />&lt;td&gt;h&lt;/td&gt;    <br />&lt;/tr&gt;    <br />&lt;tr&gt;    <br />&lt;td&gt;i&lt;/td&gt;    <br />&lt;td&gt;j&lt;/td&gt;    <br />&lt;td&gt;-&lt;/td&gt;    <br />&lt;td&gt;-&lt;/td&gt;    <br />&lt;/tr&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-demos-134/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker中的list排序功能</title>
		<link>http://javadou.com/freemarker-list-sort-152/</link>
		<comments>http://javadou.com/freemarker-list-sort-152/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 16:28:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[List]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-list-sort-152/</guid>
		<description><![CDATA[直接发一段freemarker官方文档的说明上来给大家瞧瞧：

sort

Returns the sequence sorted in ascending order. This will work only if all subvariables are strings, or if all subvariables are numbers, or, since FreeMarker 2.3.1, if all subvariables are date values (date... ]]></description>
			<content:encoded><![CDATA[<p>直接发一段freemarker官方文档的说明上来给大家瞧瞧：</p>
<p>sort</p>
<p>Returns the sequence sorted in ascending order. This will work only if all subvariables are strings, or if all subvariables are numbers, or, since FreeMarker 2.3.1, if all subvariables are date values (date, time, or date+time). If the subvariables are strings, it uses locale (language) specific lexical sorting (which is usually not case sensitive). For example:</p>
<pre class="xml">&lt;#assign ls = [&quot;whale&quot;, &quot;Barbara&quot;, &quot;zeppelin&quot;, &quot;aardvark&quot;, &quot;beetroot&quot;]?sort&gt;
&lt;#list ls as i&gt;${i} &lt;/#LIST&gt;</pre>
<p>will print (with US locale at least): </p>
<pre class="xml">aardvark Barbara beetroot whale zeppelin</pre>
<p>sort_by Returns the sequence of hashes sorted by the given hash subvariable in ascending order. The rules are the same as with the sort built-in, except that the subvariables of the sequence must be hashes, and you have to give the name of a hash subvariable that will decide the order. For example: </p>
<pre class="xml">&lt;#assign ls = [
  {&quot;name&quot;:&quot;whale&quot;, &quot;weight&quot;:2000},
  {&quot;name&quot;:&quot;Barbara&quot;, &quot;weight&quot;:53},
  {&quot;name&quot;:&quot;zeppelin&quot;, &quot;weight&quot;:-200},
  {&quot;name&quot;:&quot;aardvark&quot;, &quot;weight&quot;:30},
  {&quot;name&quot;:&quot;beetroot&quot;, &quot;weight&quot;:0.3}
]&gt;
Order by name:
&lt;#list ls?sort_by(&quot;name&quot;) as i&gt;
- ${i.name}: ${i.weight}
&lt;/#LIST&gt;

Order by weight:
&lt;#list ls?sort_by(&quot;weight&quot;) as i&gt;
- ${i.name}: ${i.weight}
&lt;/#LIST&gt;  </pre>
<p>will print (with US locale at least) Order by name: &#8211; aardvark: 30 &#8211; Barbara: 53 &#8211; beetroot: 0.3 &#8211; whale: 2000 &#8211; zeppelin: -200 Order by weight: &#8211; zeppelin: -200 &#8211; beetroot: 0.3 &#8211; aardvark: 30 &#8211; Barbara: 53 &#8211; whale: 2000 Since FreeMarker 2.3.1, if the subvariable that you want to use for the sorting is on a deeper level (that is, if it is a subvariable of a subvariable and so on), then you can use a sequence as parameter, that specifies the names of the subvariables that lead down to the desired subvariable. For example: </p>
<pre class="xml">&lt;#assign members = [
    {&quot;name&quot;: {&quot;first&quot;: &quot;Joe&quot;, &quot;last&quot;: &quot;Smith&quot;}, &quot;age&quot;: 40},
    {&quot;name&quot;: {&quot;first&quot;: &quot;Fred&quot;, &quot;last&quot;: &quot;Crooger&quot;}, &quot;age&quot;: 35},
    {&quot;name&quot;: {&quot;first&quot;: &quot;Amanda&quot;, &quot;last&quot;: &quot;Fox&quot;}, &quot;age&quot;: 25}]&gt;
Sorted by name.last:
&lt;#list members?sort_by(['name', 'last']) as m&gt;
- ${m.name.last}, ${m.name.first}: ${m.age} years old
&lt;/#LIST&gt;  </pre>
<p>will print (with US locale at least): Sorted by name.last: &#8211; Crooger, Fred: 35 years old &#8211; Fox, Amanda: 25 years old &#8211; Smith, Joe: 40 years old </p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-list-sort-152/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse下安装freemarker插件</title>
		<link>http://javadou.com/eclipse-freemarker-plugins-100/</link>
		<comments>http://javadou.com/eclipse-freemarker-plugins-100/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 04:06:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://javadou.com/eclipse-freemarker-plugins-100/</guid>
		<description><![CDATA[FreeMarker(http://freemarker.sourceforge.net/) 是一个非常优秀的模板引擎，一个用来根据模板生成文本输出的通用工具，我们可以用它来生成例如HTML这样的文本，FreeMarker本身提供了一个Eclipse的插件用于编写FreeMarker模板文件... ]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160;&#160; FreeMarker(<a href="http://freemarker.sourceforge.net/">http://freemarker.sourceforge.net/</a>) 是一个非常优秀的模板引擎，一个用来根据模板生成文本输出的通用工具，我们可以用它来生成例如HTML这样的文本，FreeMarker本身提供了一个Eclipse的插件用于编写FreeMarker模板文件，这个插件主要是提供了语法高亮、语法错误提示以及模板文件的概要信息</p>
<p>接下来把安装过程大略的介绍一下：</p>
<p>打开菜单项 Help -&gt; Software updates -&gt; Find and install….</p>
<p>选择单选项 &quot;Search for new features to install&quot;.    <br />点击 new Remote Site…, 输入 &quot;FreeMarker&quot;&#160; 作为名字以及 &quot;<a href="http://www.freemarker.org/eclipse/update">http://www.freemarker.org/eclipse/update</a>&quot; 作为更新的地址     <br />选中复选框 &quot;FreeMarker&quot;     <br />点击下一步或完成按钮根据提示完成插件的安装     <br />安装完毕后该插件自动关联*.ftl文件，你也可以在下面对话框中进行自行设置.</p>
<p>网址：</p>
<p>FreeMarker的官方主页： <a href="http://freemarker.sourceforge.net">http://freemarker.sourceforge.net</a>    <br />下载地址：<a href="http://sourceforge.net/projects/freemarker">http://sourceforge.net/projects/freemarker</a>    <br />FreeMarker与Velocity的对比：<a href="http://www.javayou.com/showlog.jspe?log_id=657">http://www.javayou.com/showlog.jspe?log_id=657</a></p>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/eclipse-freemarker-plugins-100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>freemarker 循环list的一点用法</title>
		<link>http://javadou.com/freemarker-list-some-to-usefull-39/</link>
		<comments>http://javadou.com/freemarker-list-some-to-usefull-39/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 04:33:00 +0000</pubDate>
		<dc:creator>阿超</dc:creator>
				<category><![CDATA[Freemarker]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[格式]]></category>

		<guid isPermaLink="false">http://javadou.com/freemarker-list-some-to-usefull-39/</guid>
		<description><![CDATA[在freemarker中list是经常用到的

比如在页面中需要有个单纯的遍历(以年度为例),无需调用任何数据，很方便

当数据超过3位的时候,freemarker会自动用逗号截取 格式如:2,008

如何解决呢... ]]></description>
			<content:encoded><![CDATA[<p>在freemarker中list是经常用到的</p>
<p>比如在页面中需要有个单纯的遍历(以年度为例),无需调用任何数据，很方便</p>
<p>当数据超过3位的时候,freemarker会自动用逗号截取 格式如:2,008</p>
<p>如何解决呢？</p>
<p>加.toString(),如：${(userId).toString()}加?c,如：${(userId)?c} freemarker配置文件freemarker.properties加上number_format=#</p>
<p> 判断是否为空:
<pre class="java">&lt;#if xxList[0]?exists&gt;</pre>
<p>不然当xxList没有数据的时候 ，很大很大一个黄页就等着你了 </p>
<p>截取字符串长度： </p>
<p>有的时候我们在页面中不需要显示那么长的字符串，比如新闻标题，这样用下面的列子就可以自定义显示的长度 </p>
<p>&lt; lt. &lt;= lte. &gt; gt. &gt;= gte</p>
<pre class="java">&lt;#if jstbqkVO.gzdd?length lt 8&gt;
           &lt;a&gt;${jstbqkVO.gzdd?default(&quot;&quot;)}&lt;/a&gt;
      &lt;#else&gt;
           &lt;a title=&quot;${jstbqkVO.gzdd}&quot;&gt;${jstbqkVO.gzdd[0..3]?default(&quot;&quot;)}...&lt;/a&gt;
&lt;/#IF&gt;</pre>
<p>意思就是如果这个字符串的长度小于8，那么就正常显示，反之则取4位 </p>
<p>嵌套list: </p>
<p>很多时候，数据库里存储的都是编号，而页面上需要显示的汉字，而且不在一张表里，看列子</p>
<pre class="java">&lt;#list kcList as kcVO&gt;
           &lt;#if kcVO.kch=jsskVO.kch&gt; （kcVO里有编号和名称，而jsskVO里只有编号）
                  ${kcVO.kcm}
           &lt;/#IF&gt;
&lt;/#LIST&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://javadou.com/freemarker-list-some-to-usefull-39/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
