1. 程式人生 > >Freemarker自定義標籤的簡單分析

Freemarker自定義標籤的簡單分析

一、 用macro實現自定義指令,例如:

自定義指令可以使用macro指令來定義。
     <#macro greet person>
            <font size="+2">Hello ${person}!</font>
     </#macro>
     macro指令自身不列印任何內容,它只是用來建立巨集變數,所以就會有一個名為greet的變數。
使用這個巨集:
    <@greet person="Fred"/>
會打印出:
    <font size="+2">Hello Fred!</font>

二、用java程式碼標籤實現自定義指令:

可以使用TemplateDirectiveModel介面在Java程式碼中實現自定義指令。
簡單示例如下:
1、實現TemplateDirectiveModel介面。
            public class UpperDirective implements TemplateDirectiveModel {
                  public void execute(Environment env,
                           Map params, TemplateModel[] loopVars,
                           TemplateDirectiveBody body)
                           throws TemplateException, IOException {
                            if (!params.isEmpty()) {
                             throw new TemplateModelException(
                               "parameters 此處沒有值!");
                            }
                           if (loopVars.length != 0) {
                           throw new TemplateModelException(
                          " variables 此處沒有值!");
                          }
                         if (body != null) {
                         //執行nested body  與FTL中 <#nested> 類似。
                     body.render(new UpperCaseFilterWriter(env.getOut()));
                         } else {
                        throw new RuntimeException("missing body");
                         }
                    }
           private static class UpperCaseFilterWriter extends Writer {
           private final Writer out;
           UpperCaseFilterWriter (Writer out) {
            this.out = out;
        }        
        public void write(char[] cbuf, int off, int len)
            throws IOException {
            char[] transformedCbuf = new char[len];
                for (int i = 0; i < len; i++) {
                               transformedCbuf[i] = Character.toUpperCase(cbuf[i + off]);
                }
                    out.write(transformedCbuf);
            }
        public void flush() throws IOException {
                out.flush();
            }
                public void close() throws IOException {
                out.close();
                }
           }
       }

     說明:<#nested>指令執行位於開始和結束標記指令之間的模板程式碼段。
2、注入FreeMarkerConfigurer的freemarkerVariables中。
     例如:在jeecms-servlet-front.xml
    <entry key="upper" value-ref="upper"/>
    <bean id="upper" class="com.example.UpperDirective" />

   說明: 
   FreeMarkerConfigurer. 、setFreemarkerVariables(Map<String,Object> variables)
   底層呼叫了FreeMarker的Configuration.setAllSharedVariables()方法。
   因為更好的實踐是將常用的指令作為共享變數放到Configuration中。

3、呼叫自定義指令:

     [@upper]
             bar
             [#list ["red", "green", "blue"] as color]
                  ${color}
            [/#list]
            baaz
     [/@upper]
4、顯示輸出結果:
      BAR RED GREEN BLUE BAAZ

相關推薦

Freemarker定義標籤簡單分析

一、 用macro實現自定義指令,例如: 自定義指令可以使用macro指令來定義。 <#macro greet person> <font size="+2">Hello ${person}!</font>

freemarker定義標籤報錯(四)

 freemarker自定義標籤 1、錯誤描述 六月 05, 2014 11:31:35 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 嚴重: Template processing error: "Err

freemarker定義標籤報錯(五)

freemarker自定義標籤 1、錯誤描述 六月 05, 2014 11:40:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 嚴重: Template processing error: "Expr

spring中freemarker定義標籤詳解

最近因工作需要,從網上搜了一個jeecms網站,準備進行借鑑使用,發現裡面對模板用的不錯,前面雖說也對freemarker有用,但是還沒有這麼深入,所以就查了一些資料,下面進行總結下。 一、jar包準備 首先是Spring、SpringMVC的依賴jar包…… 然後是Fr

Struts2與freemarker定義標籤

包目錄檢視 領域模型層User.java package com.xuzengqiang.project.domain; public class User { private String

Java Web學習筆記(一)FreeMarker定義標籤實現生成前端指令碼驗證

最近在學習Java Web因為.net已經寫的想吐了。通過網易雲課堂瞭解了當前常用的SSM框架的使用方法,前期一切都很順利,包括資料庫的訪問、事務提交、物件注入、面向切片等等,但是當我對頁面檢視進行實現時發現相對於.net有一點不方便。Java Web的檢視層的實現方式非常

Freemarker定義標籤+spring國際化所碰到的坑

最近在弄springmvc國際化,碰到一個問題,昨天下午兩三個小時加上今天上午,最後終於在大佬同事的提示下知道了原因所在。 首先注意spring.ftl的這句話 這是freemarker的巨集變數,由此可以看出springMacroRequestContext是一個物件

freemarker定義標籤報錯(六)

freemarker自定義標籤 1、錯誤描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\"" at line 18, column 25 in myself.ftl. Was ex

Spring遇見問題(三)-----FreeMarker定義標籤

web.xml檔案 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http:

freemarker定義標籤(二)

freemarker自定義標籤 1、自定義標籤       通過自定義標籤,寫一個重複指定字串 2、實現原始碼 <html> <head> <meta

UWP 使用新版畫中畫 FontIcon —— 如何使用定義字型 —— 簡單分析Windows Calculator原始碼

微軟在新版UWP計算器中加入了一個“置頂”功能,它相當於我們之前看視訊的“畫中畫”一樣。 點選後窗體置頂,同時可以進行其他任務。     有的小夥伴說,不就是一個圖示嗎,去 Segoe MDL2 圖示 把圖示找

freemarker 定義freeMarker標籤

Java程式碼   import java.io.IOException;   import java.io.Writer;   import java.util.Iterator;   import java.util.List;   import java.util.Map;   import 

struts2專案中用freemarker定義模板,s:component標籤來引用

1 在WEB-INF下建立template/simple資料夾,在裡面新建模板檔案prop1.ftl模板檔案內容為<div> <span>${parameters.p_title?html}:</span> <#if paramet

Javaweb----簡單定義標籤的編寫

使用標籤一定要注意加上jar包,為jstl.jar 和standard.jar就是了 在WEB-INF下建立一個myTag.tld 用xml檔案格式建立 myTag.tld HelloSimple

freemarker編寫定義標籤

freemarker提供了TemplateDirectiveModel介面,我們可以利用它來實現自定義標籤的編寫。 例子來源於freemarker中文參考手冊 如有:repeatDirective.rj <#assign x = 1> <@repeat

IIS ajax CORS 訪問發送定義Header時分析

nbsp post true cal 後臺 config -a coo function 場景: a站:http://127.0.0.1/a b站:http://localhost/b (IIS7.5) a站用ajax訪問b的資源,代碼如下: $.ajaxSetu

Android零基礎入門第24節:定義View簡單使用

子類 protect jin 討論 我們 @+ amp 進階 運行程序 當我們開發中遇到Android原生的組件無法滿足需求時,這時候就應該自定義View來滿足這些特殊的組件需求。 一、概述 很多初入Android開發的程序員,對於Android自定義View可能比較

定義標籤庫,匯入異常,報500錯誤

HTTP Status 500 - The absolute uri: http://java.zcb.common cannot be resolved in either web.xml or the jar files deployed with this application

springboot 定義一個簡單的 starter

1.新建專案 。 啟動器只用來做依賴匯入; 專門來寫一個自動配置模組; idea 下建立空專案 hello-spring-boot-starter 新增兩個子模組 spring-boot-starter-autoconfigurer, spring-boot-starter-hell

spring 定義標籤的實現

在我們進行Spring 框架開發中,估計用到最多的就是bean 標籤吧,其實在Spring中像<mvc/><context/>這類標籤以及在dubbo配置的標籤都是屬於自定義的標籤,標籤的解析,已經由作者就行了解析,我們用就好了,那麼我們今天就進行開發一個自己的標籤,模擬 &