FreeMarker學習筆記

       FreeMarker是一個用Java語言編寫的模板引擎,它基於模板來生成文本輸出。FreeMarker與Web容器無關,即在Web運行時,它並不知道Servlet或HTTP。它不僅可以用作表現層的實現技術,而且還可以用於生成XML,JSP或Java 等。


FreeMarker模板文件主要由如下4個部分組成:

1,文本:直接輸出的部分
2,註釋:<#-- ... -->格式部分,不會輸出
3,插值:即${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出
4,FTL指令:FreeMarker指定,和HTML標記類似,名字前加#予以區分,不會輸出


下面是一個FreeMarker模板的例子,包含了以上所說的4個部分

<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 註釋部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
   <li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>


FTL指令規則

在FreeMarker中,使用FTL標籤來使用指令,FreeMarker有3種FTL標籤,這和HTML標籤是完全類似的.
1,開始標籤:<#directivename parameter>
2,結束標籤:</#directivename>
3,空標籤:<#directivename parameter/>

實際上,使用標籤時前面的符號#也可能變成@,如果該指令是一個用戶指令而不是系統內建指令時,應將#符號改成@符號.
使用FTL標籤時, 應該有正確的嵌套,而不是交叉使用,這和XML標籤的用法完全一樣.如果全用不存在的指令,FreeMarker不會使用模板輸出,而是產生一個錯誤消息.FreeMarker會忽略FTL標籤中的空白字符.值得注意的是< , /> 和指令之間不允許有空白字符.


插值規則
FreeMarker的插值有如下兩種類型:1,通用插值${expr};2,數字格式化插值:#{expr}或#{expr;format}




Demo:

hello.ftl

<html>
    <head>
        <title>FreeMarker For JavaWeb</title>
    </head>
    <body>
        <h1 style = "color:blue">${name}</h1>
        <h1 style = "color:red">${message}</h1>
    </body>
</html>Servleet:



FreeMarkerServlet.java

   
public class FreeMarkerServlet extends HttpServlet {
    private Configuration cfg = null;
              
    public void init() {
        cfg = new Configuration();
        cfg.setServletContextForTemplateLoading(getServletContext(), "/template");
    }
              
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
                  
        Map<String, String> rootMap = new HashMap<String, String>();
        rootMap.put("name", "name");
        rootMap.put("message", "message");
                  
        try {
            Template template = cfg.getTemplate("hello.ftl");
            template.process(rootMap, resp.getWriter());
        } catch (Exception e) {
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章