SSM系列5 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中的自定義屬性來實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章