程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> FreeMarker 學習,freemarker學習

FreeMarker 學習,freemarker學習

編輯:JAVA綜合教程

FreeMarker 學習,freemarker學習


一、FreeMarker

     FreeMarker是一款模板引擎: 即一種基於模板和要改變的數據, 並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具。 它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。(百度百科)

   FreeMarker不是一個Web應用框架,而適合作為Web應用框架一個組件。

     FreeMarker與容器無關,因為它並不知道HTTP或Servlet;FreeMarker同樣可以應用於非Web應用程序環境。

優點:

 1. FreeMarker的優點一,可以徹底的分離表現層和業務邏輯。
  使用JSP 開發過程中發現在頁面中大量的存在業務邏輯的代碼,使得頁面內容凌亂,在後期大量的修改維護過程中就變得非常困難。
  FreeMarker根本不支持Java腳本代碼。
  FreeMarker的原理就是:模板+數據模型=輸出,模板只負責數據在頁面中的表現,不涉及任何的邏輯代碼,而所有的邏輯都是由數據模型來處理的。用戶最終看到的輸出是模板和數據模型合並後創建的。
      
2. FreeMarker的優點二,可以提高開發效率。
  使用JSP 頁面來展示數據的,即所謂的表現層。大家都知道,JSP在第一次執行的時候需要轉換成Servlet類,開發階段進行功能調適時,需要頻繁的修改JSP,每次修改都要編譯和轉換,那麼試想一天中我們浪費在程序編譯的時間有多少。相對於JSP來說,FreeMarker模板技術不存在編譯和轉換的問題,所以就不會存在上述問題。而且開發過程中,大家在不必在等待界面設計開發人員完成頁面原形後,大家再來開發程序。

缺點:

 1.FreeMarker的缺點一,應用FreeMarker模板技術,在修改模板後,可能會看到已經過期的數據。如:生成靜態的HTML頁面後,如果一旦模板改變,而沒有及時更新模板生成的HTML頁面的話,用戶看到的就是過期的數據。
 2.FreeMarker的缺點二,FreeMarker不支持集群應用。為了編成的方便性,把序列化的東西都放到了Session中,如Session,request等,在開發的過程中確實方便,但如果將應用放到集群中,就會出現錯誤。

二、數據格式

   freeMark 的數據格式是樹狀結構 ,使用Map封裝數據 key必須是string,其他數據類型無法操作。

三、使用

 

public static void main(String[] args) throws IOException, TemplateException{
        //創建Freemarker配置實例
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File("templates")); 
        
        //創建數據模型
        Map<String,Object> root = new HashMap<String,Object>();
        root.put("name", "張三");//字符串類型
        root.put("random", new Random().nextInt(100));
        
        List<Map<String,Object>> listMap=new ArrayList<Map<String,Object>>();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("name", "A1");
        map.put("name", "A2");
        listMap.add(map);
        root.put("listMap", listMap);
        
        //加載模板文件
        Template template=cfg.getTemplate("a.ftl");
        //顯示生成的數據
         Writer writer=new OutputStreamWriter(System.out);
        // Writer writer  = new OutputStreamWriter(new FileOutputStream("html/index.html"),"UTF-8");  
         template.process(root, writer);  
         writer.flush();
    }

 

a.ftl

你好 ${name} 歡迎學習FreeMarker <#--if 語句 --> #if 語句 <#if name=="張三">張三</#if> <#-- if else--> # gt 大於 gte 大於等於 <#if random gt 60 > ${random}: 及格 <#else> ${random}: 不及格 </#if> <#-- if else if else語句測試: --> <#if random gte 90> ${random}:優秀! <#elseif random gte 80> ${random}:良好! <#else> ${random}: 一般! </#if> <#-- 遍歷List --> <#list listMap as map > <b>${map.name}</b> <br/> </#list> <#-- include --> <#include "index.ftl" /> <#-- 自定義指令 macro指令--> <#macro m1> <#--定義指令m1 --> <b>aaabbbccc</b> <b>dddeeefff</b> </#macro> <@m1 /> <#--調用上面的宏指令 --> <#-- 定義帶參的宏指令: --> <#macro m2 a b c > ${a}--${b}--${c} </#macro> <@m2 a="老高" b="老張" c="老馬" /> <#-- nested指令: --> <#macro border> <table border=4 cellspacing=0 cellpadding=4> <tr> <td> <#nested> </td> </tr> </table> </#macro> <@border >表格中的內容! 方式二</@border> <#-- 命名空間 --> <#import "b.ftl" as bb /> <@bb.copyright date="2010-2011" /> ${bb.mail} <#assign mail="[email protected]" /> ${mail} <#-- 引用的是 --> <#assign mail="[email protected]" in bb /> ${bb.mail} <#-- 引用的是 --> View Code

b.ftl

<#macro copyright date> <p>Copyright (C) ${date} 北京尚學堂.</p> </#macro> <#assign mail = "[email protected]"> View Code

index.ftl

 

<#macro copyright date> <p>Copyright (C) ${date}</p> </#macro> <#assign mail = "[email protected]"> View Code

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved