首先,曾經天真的覺得freemarker跟jstl和el同樣,只是顯示數據用的標籤。可是實際上freemarker數據jsp級別的,能夠用來生成靜態頁面。html
先來看看freemarker在頁面上是如何被調用的。java
public class FreeMarkHander { private Configuration cfg; // 模版配置對象 public void init(String templatePath) throws Exception { // 初始化FreeMarker配置 // 建立一個Configuration實例 cfg = new Configuration(Configuration.VERSION_2_3_21); // 設置FreeMarker的模版文件夾位置 //String templatePath = request.getSession().getServletContext().getRealPath("/template"); cfg.setDirectoryForTemplateLoading(new File(templatePath)); // 設置異常處理器 cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); cfg.setDefaultEncoding("utf-8"); } public String process(Map<String, Object> map, String ftl) throws Exception { String rtn = ""; Template tpl = cfg.getTemplate(ftl); ByteOutputStream stream = new ByteOutputStream(); Writer out = new OutputStreamWriter(stream); tpl.process(map, out); out.flush(); rtn = stream.toString(); return rtn; } /**** * 數據渲染html片斷 * @param map 填充數據 * @param templatePath 模板路徑 * @param ftlName 模板名稱 * @return html片斷字符串 * @throws Exception */ public static String createPage(Map<String, Object> map,String templatePath,String ftlName)throws Exception { String html = ""; FreeMarkHander fh = new FreeMarkHander(); fh.init(templatePath); html = fh.process(map,ftlName); return html; }
第一個方法,初始化模板的配置,包括模板所在文件夾的位置,規定編碼方式等等。jsp
最下面createPage方法是在jsp上調用的,傳入的map即爲傳入的數據集合,templatePath是模板文件夾在項目的絕對路徑,ftlName則是具體模板的名稱。中間調用的process本身體會了(沒有異常抓取等等,湊合用)編碼
模板的所在的文件夾能夠本身設立,本項目中在WebRoot下的template中。spa
模板的具體長相:code
<#if newList?size gt 0> <div class="list"> <ul> <#list newList as news> <li id="${news.news_id}" name="news_list"><a href="${news.news_id?default('')}" target="_blank" title="${news.title?default('')}"><i class="icon icon-arrow"></i><span>${news.title?default('')}</span></a></li> </#list> </ul> </div> <div class="more"><a id="the_more_news">更多 <i class="icon icon-arrow-double"> </i></a></div> <#else > <div class="list empty"> <div class="page-message-empty"> <div class="mascot cry"><i class="icon icon-none-cry"></i> <div class="message">沒有相關資訊</div> </div> </div> </div> </#if>
在jsp中的寫法:htm
NewsService newService = new NewsServiceImpl(); List<News> newList = newService.newsList(org_id, dataSource);//獲取須要渲染的數據 map.put("newList",newList);//裝進map String str = FreeMarkHander.createPage(map, templatePath, "news.ftl");//將數據扔進模板渲染
最後,在頁面上須要的位置對象
<%=str%>
就OK了。utf-8
ps:freemarker上沒法寫java代碼,能夠實現真正的v_c層的分離。字符串