SpringMVC整合Freemarker模板引擎
1. 基本步驟
- Maven依賴spring-context-support與freemarker
- applicationContext配置freemarkerConfig與ViewResolver
- WEB-INF/ftl目錄下開發freemarker腳本,沒有就自己創建webapp/WEB-INF/ftl
2. pom.xml引入相關依賴
<!--Freemarker-->
<!--Rreemarker核心jar包-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!--SpringFreemarker整合第三方組件的支持包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
3. applicationContext.xml中Freemarker相關配置
<!--freemarker配置
FreemarkerViewResolver是Spring-Context-Support提供的整合類,
在IOC容器初始化時通知SpringMVC默認使用Freemarker進行數據展現-->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.
FreeMarkerViewResolver">
<!--設置響應輸出並解決中文亂碼問題-->
<property name="contentType" value="text/html;charset=utf-8"></property>
<!--指定Freemarker文件擴展名-->
<property name="suffix" value=".ftl"></property>
</bean>
<!--Freemarker設置類-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.
FreeMarkerConfigurer">
<!--設置模板保存目錄,後端跳轉時不用再寫這個目錄,沒有手工創建這個目錄-->
<property name="templateLoaderPath" value="/WEB-INF/ftl"></property>
<!--模板引擎其他設置-->
<property name="freemarkerSettings">
<props>
<!--設置Freemarker腳本與數據渲染時使用的字符集-->
<prop key="defaultEncoding">UTF-8</prop>
</props>
</property>
</bean>
3.1後端寫法
@GetMapping("/testFtl")
public ModelAndView testFtl(){
/*
* WEB-INF/ftl目錄下有test.ftl
* applicationContext.xml應用上下文中配置了ftl的保存目錄以及擴展名
* 這裏就不用再寫目錄與路徑了,例如原來需要這樣寫:/ftl/test.ftl
* */
ModelAndView mv = new ModelAndView("/test");
mv.addObject("testString","Freemarker測試");
return mv;
}
4. Freemarker相關語法
4.1 取值-支持EL表達式
- ${屬性名} - 取值,可對屬性值進行四則運算
- ${屬性名!默認值} - 取值爲空時使用默認值
- ${屬性名?string} - 格式化輸出 - 日期,錢等
4.1.1 例
getter setter 略
public class User {
private String username;
private String password;
private Integer age;
private Float salary;
private Date birthday;
}
@GetMapping("/info")
public ModelAndView user(){
ModelAndView mv= new ModelAndView("/user");
User user = new User();
user.setUsername("zhangsan");
user.setBirthday(new Date());
user.setAge(18);
user.setSalary(1000F);
mv.addObject("user",user);
mv.addObject("title","個人信息頁面");
return mv;
}
<#--${屬性名}-->
<h1>${title}</h1>
<#--${屬性名.子屬性名}-->
<h1>${user.username}</h1>
<#--${xxx!'默認值'} 設置當xxx爲空或不存在時顯示的默認值-->
<h2>${user.address!'未註冊地址'}</h2>
<#--利用?string()內置函數進行格式化輸出-->
<h2>${user.birthday?string('yyyy年MM月dd日')}</h2>
<h2>${user.salary?string('¥0.00')}</h2>
<h2>${user.age}</h2>
4.2 判斷與循環
4.2.1 判斷
分支判斷
<#if 條件1>
條件1成立執行代碼或顯示內容
<#elseif 條件2>
條件2成立執行代碼或顯示內容
<#elseif (條件1 && 條件2)>
條件條件12都成立執行的代碼或顯示的內容
<#else>
以上條件都不成立執行代碼或顯示內容
</#if>
<#if user.age < 16>
少年
<#elseif (user.age > 16 && user.age < 44)>
青年
<#elseif user.age > 44>
中年
</#if>
<#--freemarker中的三目運算符-->
${(user.age < 16)?string('少年','青年')}
${(user.age < 16)?string('少年',(user.age<44)?string('青年','中年'))}
4.2.2 循環
@GetMapping("/list")
public ModelAndView list(){
ModelAndView mv = new ModelAndView("/user");
List<User> list = new ArrayList<User>();
for (int i = 0; i < 50; i++) {
User user = new User();
user.setSalary(i * 100F);
user.setAge(i+16);
user.setBirthday(new Date());
user.setUsername("用戶" + i);
list.add(user);
}
mv.addObject("users",list);
return mv;
}
<#list users as u>
<#--屬性_index:固定寫法,循環下標-->
<b>${u_index + 1} - ${u.username} - ${u.age}</b><br>
</#list>
5. 子頁面引入
<#include “/路徑/頁面.ftl”/>
例:<#include “/include/header.ftl”/>
6. 內置函數
內置函數還有很多,更多大家可以查看官方中文文檔,更多功能大家自行發掘
鏈接: https://pan.baidu.com/s/1Lx1STndgIW1u8U9cww3EFQ
提取碼:yv5d
主流模板引擎介紹
- Java Server Page(jsp) - 執行效率最高,近幾年更新緩慢,語法老化,許多新功能沒有跟近,所以用戶在下降
- Freemarker-提供了非常多的函數,對數據加工非常方便,速度比jsp稍慢,毫秒上的差距,不是京東淘寶這種體量的,嘿嘿嘿
jsp只可以做網頁,Freemarker是一個通用模板引擎,網頁,遊戲腳本,規則引擎等等,但我還沒有用過這種功能,哈哈 - Beetl-後起之秀,可與Freemarker分庭抗禮,相對Freemarker來說還是小屁孩,但是比Freemarker速度快,官方說快多少多少倍(吹牛逼誰不會?),有Freemarker的優點,國外用的多
- Thymeleaf-SpringBoot推薦,國外用的多,沒有自定義標籤,所有的循環,判斷都只能通過html中的自定義屬性來實現