﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-JAVA流通桥-文章分类-freemarker文章</title><link>http://www.blogjava.net/zhuyan/category/21728.html</link><description>JAVA启发者</description><language>zh-cn</language><lastBuildDate>Wed, 18 Apr 2007 21:04:38 GMT</lastBuildDate><pubDate>Wed, 18 Apr 2007 21:04:38 GMT</pubDate><ttl>60</ttl><item><title>用freemarker、webwork发布静态页面的方法</title><link>http://www.blogjava.net/zhuyan/articles/111565.html</link><dc:creator>朱岩</dc:creator><author>朱岩</author><pubDate>Wed, 18 Apr 2007 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/zhuyan/articles/111565.html</guid><wfw:comment>http://www.blogjava.net/zhuyan/comments/111565.html</wfw:comment><comments>http://www.blogjava.net/zhuyan/articles/111565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhuyan/comments/commentRss/111565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhuyan/services/trackbacks/111565.html</trackback:ping><description><![CDATA[<p>方法一：（这个方法借鉴freemarker的docs文档Programmer's Guide 的quick start部分，详细请看相关的文档。</p>
<div class=code_title>java 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<p class=alt><span>&nbsp;</span></p>
<ol class=dp-j>
    <li class=""><span></span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>class</span><span>&nbsp;HtmlTemplateGenerator&nbsp;{ &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;cfg&nbsp;=&nbsp;</span><span class=keyword>null</span><span>; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>public</span><span>&nbsp;HtmlTemplateGenerator(String&nbsp;templatePath)&nbsp;</span><span class=keyword>throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg&nbsp;=&nbsp;</span><span class=keyword>new</span><span>&nbsp;Configuration(); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.setDefaultEncoding(</span><span class=string>"UTF-8"</span><span>); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.setDirectoryForTemplateLoading(</span><span class=keyword>new</span><span>&nbsp;File(templatePath)); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.setObjectWrapper(</span><span class=keyword>new</span><span>&nbsp;DefaultObjectWrapper()); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>/** </span>&nbsp;
    <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;生成静态文件 </span>&nbsp;</span>
    <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ftlTemplate&nbsp;ftl模版文件 </span>&nbsp;</span>
    <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;contents&nbsp;&nbsp;&nbsp;&nbsp;ftl要用到的动态内容 </span>&nbsp;</span>
    <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;savePath&nbsp;&nbsp;&nbsp;&nbsp;文件保存路径 </span>&nbsp;</span>
    <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;saveFilename&nbsp;保存文件名 </span>&nbsp;</span>
    <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException </span>&nbsp;</span>
    <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;TemplateException </span>&nbsp;</span>
    <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>void</span><span>&nbsp;create(String&nbsp;ftlTemplate,&nbsp;Map&nbsp;contents,&nbsp;String&nbsp;savePath,&nbsp;String&nbsp;saveFilename)&nbsp;</span><span class=keyword>throws</span><span>&nbsp;IOException,&nbsp;TemplateException&nbsp;{ &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Template&nbsp;temp&nbsp;=&nbsp;cfg.getTemplate(ftlTemplate); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>/*&nbsp;Merge&nbsp;data&nbsp;model&nbsp;with&nbsp;template&nbsp;*/</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;realPath&nbsp;=&nbsp;ServletActionContext.getServletContext().getRealPath(savePath); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;saveFilename&nbsp;+&nbsp;</span><span class=string>":"</span><span>&nbsp;+&nbsp;realPath); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;</span><span class=keyword>new</span><span>&nbsp;File(realPath); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>if</span><span>(!file.exists()) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.mkdirs(); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Writer&nbsp;out&nbsp;=&nbsp;</span><span class=keyword>new</span><span>&nbsp;OutputStreamWriter(</span><span class=keyword>new</span><span>&nbsp;FileOutputStream(realPath&nbsp;+&nbsp;</span><span class=string>"/"</span><span>&nbsp;+&nbsp;saveFilename),</span><span class=string>"UTF-8"</span><span>); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp.process(contents,&nbsp;out); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush(); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果用spring，可以将它配置成bean，然后在其他地方使用。第五行的 templatePath 是模版文件的路径，比如/WEB-INF/template。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action中的使用：<font face=Arial>HtmlTemplateGenerator.create("html/magazine/search.ftl", null, "/magazine", "search.html"); 其中&#8220;html/magazine/search.ftl&#8221;是在&#8220;/WEB-INF/template&#8221;目录下。这里还需要注意的是。模版文件（search.ftl）中如果还要引用其他文件，它的路径也是不需要添加总路径&#8220;/WEB-INF/template&#8221;。</font></p>
<p>方法二：继承webwork的<font face=Arial>FreemarkerResult，改写<font face=Arial>getWriter方法：<br></font></font>不知有无好的法子。</p>
<div class=code_title>java 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span class=keyword>protected</span><span>&nbsp;Writer&nbsp;getWriter()&nbsp;</span><span class=keyword>throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;savePath&nbsp;=&nbsp;(String)&nbsp;ActionContext.getContext().getSession().get(</span><span class=string>"SAVE_PATH"</span><span>); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;saveFilename&nbsp;=&nbsp;(String)&nbsp;ActionContext.getContext().getSession().get(</span><span class=string>"SAVE_FILENAME"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;realPath&nbsp;=&nbsp;ServletActionContext.getServletContext().getRealPath(savePath); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;saveFilename&nbsp;+&nbsp;</span><span class=string>":"</span><span>&nbsp;+&nbsp;realPath); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;</span><span class=keyword>new</span><span>&nbsp;File(realPath); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>if</span><span>(!file.exists()) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.mkdirs(); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>return</span><span>&nbsp;templateOut&nbsp;=&nbsp;</span><span class=keyword>new</span><span>&nbsp;OutputStreamWriter(</span><span class=keyword>new</span><span>&nbsp;FileOutputStream(realPath&nbsp;+&nbsp;</span><span class=string>"/"</span><span>&nbsp;+&nbsp;saveFilename),</span><span class=string>"UTF-8"</span><span>); &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的路径和文件名通过webwork的session传入，不知有无其他好方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果生成文件的同时还需要看到生成的页面，则要改写&#8220;<font face=Arial>doExecute&#8221;：<br></font></p>
<div class=code_title>java 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span>template.process(model,&nbsp;getWriter()); &nbsp;&nbsp;</span></span>
    <li class=""><span>template.process(model,&nbsp;</span><span class=keyword>super</span><span>.getWriter());&nbsp;</span><span class=comment>//添加这句 </span><span>&nbsp;&nbsp;</span>
    <li class=alt><span>templateOut.flush();&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成的文件格式不限于html，可以是其他文件格式，如js，text等。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较这两种方法：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法一：在需要生成分页文件时，比较合适。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法二：可以象往常一样使用，一次需要生成多文件则不适合。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不知各位在做这些项目时，使用甚么好方法。</p>
<img src ="http://www.blogjava.net/zhuyan/aggbug/111565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhuyan/" target="_blank">朱岩</a> 2007-04-18 11:56 <a href="http://www.blogjava.net/zhuyan/articles/111565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>