從2016年開始工做到如今, 歷來沒有整理彙總過本身所學。 因此趁着如今在作新項目,打算把本身所接觸到的技術點經過文檔的形式記錄下來。 一方面是鞏固下以前所學,加深印象。另外一方面也是爲了造成本身的知識庫, 方便之後查看。html
那麼就先從Freemarker開始java
Freemarker是一款模板生成引擎, 是一種基於模板生成靜態文件的通用技術。好比生成靜態html文件, 代碼生成器中生成通用Java文件等等。如今也用來替代jsp進行數據展現web
Freemarker是採用Java語言編寫的spring
環境: maven生成的java項目apache
<!--依賴-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
複製代碼
public class FreemarkerUtil {
/**
* 獲取Freemarker的Template
*
* @param fileName 模板名稱
* @return
* @throws IOException
*/
public Template getTemplate(String fileName) throws IOException {
Configuration cfg = new Configuration();
// 定義模版的位置
//從指定文件夾中獲取
//cfg.setDirectoryForTemplateLoading(new File(""));
//從類路徑中
cfg.setClassForTemplateLoading(getClass(), "/templates");
// 設置對象包裝器
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 設置異常處理器
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
return cfg.getTemplate(fileName);
}
/**
* 輸出文件
* @param fileName 模板名稱
* @param map 數據
* @param path 生成後的文件路徑
*/
public void out(String fileName, Map<String, Object> map, String path) {
PrintWriter printWriter = null;
try {
Template template = getTemplate(fileName);
printWriter = new PrintWriter(new FileWriter(path));
//生成文件
template.process(map, printWriter);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
if (printWriter != null) {
printWriter.close();
}
}
}
}
複製代碼
<#-- 我是freemarker中的註釋 -->
<#-- 生成文件 -->
public class App {
public static void main(String[] args) {
System.out.println("${name}");
}
}
複製代碼
很簡單的java輸出文件spring-mvc
public class App {
FreemarkerUtil mFreemarkerUtil;
@Before
public void before() {
mFreemarkerUtil = new FreemarkerUtil(); //初始化
}
@Test
public void outFile() {
//傳遞數據
Map<String, Object> map = new HashMap<String, Object>() {{
put("name", "hello world");
}};
//在D盤下生成App.java文件
mFreemarkerUtil.out("App.ftl", map, "D:\\tmp\\App.java");
}
}
複製代碼
Freemarker是經過鍵值對的方式傳遞數據, 因此在ftl中間中要展現後臺傳遞的數據 只須要${key}
的形式便可 相似於jsp的EL表達式緩存
對傳遞過來的集合數據進行迭代bash
語法mvc
//普通數據
<#list lists as item> //lists:集合數據 item:循環變量 item_index: 循環索引
${item}
</#list>
//循環map
<#list maps?keys as key>
${maps[key]}
</#list>
//循環集合中的對象
<#list lists as item>
${item.字段}
</#list>
//其餘屬性
${lists?size} //獲取集合的長度
複製代碼
主要是作if判斷用的,要注意的是條件等式必須用括號括起來。app
語法
<#if 條件>
//一個判斷
<#elseif 條件>
//另一種判斷
<#else>
//除以上以外的其餘判斷
</#if>
複製代碼
注意點:
- elseif 和 else 必須包含在 if 中
- if 中不是必須出現elseif 和else 也能夠單獨if 判斷,而後結束
小實例:結合list指令和if else指令 展現列表 並隔行換色
template1.ftl文件 (節省篇幅 只貼出有用代碼)
<head>
<style>
li { background: #FFF; color: #000; }
li.active { background: #F00; color: antiquewhite; }
li.primary { background: #FF0; color: aqua; }
</style>
</head>
<body>
<ul>
<#-- 我是freemarker中的註釋 -->
<#--循環-->
<#list list as l>
<#if (l_index + 1) % 2 == 0> <#--判斷 循環索引於2的餘數是否爲0-->
<li class="active">
<#elseif (l_index + 1) % 3 == 0> <#--判斷 循環索引於3的餘數是否爲0-->
<li class="primary">
<#else>
<li>
</#if>
${l}- ${l_index + 1}
</li>
</#list>
</ul>
</body>
</html>
複製代碼
java代碼
@Test
public void template1() {
List<String> list = new ArrayList<String>();
for (int i = 'A'; i <= 'z'; i++) {
list.add((char) i + "");
}
mRoot.put("list", list);
//對應上的例子的FreemarkerUtil
mFreemarkerUtil.out("template1.ftl", mRoot, "D:\\tmp\\template1.html");
}
複製代碼
展現效果
能夠看到在html生成成功, 打開按照if 判斷的形式循環展現 (-_- 完美)
該指令表示導入其餘的文件或者freemarker文件, 通常用於導入公共文件, 如網站的頭部, 公共資源文件,版權信息等
語法
//這裏的path表明文件的路徑
<#include path>
複製代碼
該指令相似於include, 不一樣的是import導入進來後, 能夠在該文件中使用被導入文件的宏組件
語法
// path 文件路徑 p 別名
<#import path as p>
複製代碼
小實例: include 和 import 展現其區別
該指令用於動態設置freeMarker的運行環境。
語法
<#setting name=value>
複製代碼
name的取值範圍包括:
插值就是${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出
字符串插值
${name} //直接輸出
數字值
經過setting配置數字顯示格式
<#setting number_format="0.##">
${150} -->>> 150.00
${150.568} -->>> 150.57 //四捨五入的形式
複製代碼
經過string指令
${150?string("0.##")} -->>> 150.00 //一樣的展現效果
複製代碼
日期展現, 一樣可使用兩種形式來配置, 這裏只展現經過string指令來展現的效果
${.now?string("yyyy-MM-dd HH:mm:ss")} ->> 2019-07-16 15:57:40 //展現當前時間
複製代碼
字符串爲空或者爲null判斷
${prices!"111"} //若是prices沒有定義或者爲null 那麼就顯示111 不然就顯示prices的值
關於更多的的指令的描述和學習, 能夠 點擊這裏查看中文在線手冊
前面說到Freemarker不僅是模板引擎, 還能夠替代jsp當作界面展現效果, 那麼咱們來看下和SpringMVC的整合
maven 配置 Freemarker的jar包
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<!-- ui.freemarker -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
複製代碼
spring-mvc.xml
<!--視圖解析器-->
<!--配置試圖解析器 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="order" value="1"></property>
<property name="suffix" value=".ftl"></property>
<property name="contentType" value="text/html;charset=utf-8"></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
</property>
<property name="requestContextAttribute" value="request"></property>
</bean>
<!--加載freemarker屬性 -->
<bean id="propertySetting" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:freemarker.properties</value>
</list>
</property>
</bean>
<!--freemarker配置 -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/WEB-INF/ftl/</value>
</property>
<property name="freemarkerSettings" ref="propertySetting"></property>
</bean>
複製代碼
freemarker.properties
#設置標籤類型:square_bracket:[] auto_detect:[]<>
tag_syntax=auto_detect
#模版緩存時間,單位:秒
template_update_delay=0
default_encoding=UTF-8
output_encoding=UTF-8
locale=zh_CN
#設置數字格式 ,防止出現 000.00
number_format=\#
#變量爲空時,不會報錯
classic_compatible=true
date_format=yyyy-MM-dd
time_format=HH\:mm\:ss
datetime_format=yyyy-MM-dd HH\:mm\:ss
複製代碼
controller中使用
@RequestMapping("/center")
public String center(HttpServletRequest request, ModelMap map) {
map.put("name", "Hello World");
//完整路徑: /WEB-INF/ftl/index.ftl
return "/index";
}
複製代碼
到此 關於SpringMVC + Freemarker整合就已經完成。
該內容只是講解關於Freemarker簡單的內容, 更多相關內容參考
經過本章節Freemarker算是簡單入門, 那麼下一節經過實戰來加深對Freemarker的印象
實戰演練, Freemarker + MyBatis 配合開發咱們的代碼生成器