springboot 使用freemarker自定義標簽
阿新 • • 發佈:2019-02-17
content htm 前端 star cnblogs core type 頁面 spa
1、pom依賴引入
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2、application配置
#服務啟動端口 server.port=8080 ## Freemarker 配置 spring.freemarker.cache=false spring.freemarker.charset=UTF-8 spring.freemarker.check-template-location=true spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=true spring.freemarker.expose-session-attributes=true spring.freemarker.request-context-attribute=request spring.freemarker.suffix=.ftl
3、實現TemplateDirectiveModel
package com.example.springbootfreemarker.tags.directive; import freemarker.core.Environment; import freemarker.template.*; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Component public class MyTagDirective implements TemplateDirectiveModel{ @Override public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException { Integer tagId = -1; String tagName = ""; //自己的邏輯 todo Map<String, Object> result = new HashMap<String, Object>(2); if (map.containsKey("tagId")){ tagId = Integer.parseInt(map.get("tagId").toString()); } if (map.containsKey("tagName")){ tagName = (String)map.get("tagName").toString(); } result.put("tagId", tagId); result.put("tagName", tagName); DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25);
//此處的myTag就是返回給前端的數據 environment.setVariable("myTag", builder.build().wrap(result)); templateDirectiveBody.render(environment.getOut()); } }
前端文件:
<!DOCTYPE html> <html lang="en"> <body> hello, ${name}, let‘s go! <@myTag tagId = 1 tagName = "mytag"> <#if myTag??> <p>${myTag.tagId},${myTag.tagName}</p> </#if> </@myTag> </body> </html>
用法:跟自定義macro用法一樣,直接使用 <@xx></@xx> 來使用即可,值就直接在myTag 標簽裏傳就可以了
流程:當訪問前端頁面時,會將自定義的標簽及其值傳到後臺MyTagDirective攔截處理並返回結果給前端渲染使用,<#if myTag??>為freemarker語法,可參照freemarker語法
springboot 使用freemarker自定義標簽