日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Freemarker自定义标签

發布時間:2024/4/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中。
???? 例如:在applicationContext.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

轉載于:https://www.cnblogs.com/pengw/p/3944429.html

總結

以上是生活随笔為你收集整理的Freemarker自定义标签的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。