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中的自定义属性来实现
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章