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中的自定义属性来实现