一. freemarker 概述
模板引擎
只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)
- 数据模型:数据模型在java中可以是基本类型也可以List、Map、Pojo等复杂类型
- 模板
- 输出
常见的模板引擎
常用的java模板引擎哪些?
模板名称 |
描述 |
扩展名 |
jsp |
JavaEE规范中一个技术,在html代码中可以嵌入Java代码。开发中老项目还使用,新项目使用比较少。 |
*.jsp |
Freemarker |
模板技术 |
*.ftl |
Thymeleaf |
模板技术 |
*.th |
Velocity |
模板技术 |
*.vm |
二.环境搭建
此篇环境搭建父项目同MongoDB篇刚开始搭建的父类项目是同样流程,
可直接参考我前面博客
FreeMarker:
步骤一:父项目搭建好后, 创建子模块
步骤二: 然后直接点下一步
步骤三:最后输入项目名即可
步骤四: 添加Pom.xml坐标
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- 测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- IO--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> </dependency> <!-- mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.67</version> </dependency> </dependencies>
步骤五: 创建yml文件,编写端口号
煌sir已经一次添加了所有需要用到的配置(一次到位,安排)
spring:
freemarker:
settings:
classic_compatible: true #兼容模式
data:
mongodb:
uri: mongodb://localhost:27017/demo
server:
port: 8088 #服务端口
步骤六: 编写启动类
@SpringBootApplication
public class TestFreeMarkerApplication {
public static void main(String[] args) {
SpringApplication.run(TestFreeMarkerApplication.class,args);
}
}
三. 入门案例
-
步骤一:编写controller
@Controller //注意:不能使用@RestController,需要返回一个视图(找页面) public class FreemarkerController { @GetMapping("/test") public String test() { return "test"; } }
-
步骤二:编写ftl文件(注意:ftl写在templates文件下)
-
步骤三:测试,启动程序并访问
四. FreeMarker基础
1.基本语法
1、注释,即<#--和-->,介于其之间的内容会被freemarker忽略
2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}
3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。
<#-- 注释 -->
${user.age}
<#if 条件>
</#if>
2.数据模型
方式1:使用ModelAndView
/**
* 方式1:使用ModelAndView
*
* @return
*/
@GetMapping("/model_a")
public ModelAndView model_a() {
// 1.创建模型视图对象
ModelAndView modelAndView = new ModelAndView();
// 1.1设置模型数据
HashMap<String, String> map = new HashMap<>();
map.put("name", "jack");
map.put("age", "18");
modelAndView.addObject("user", map);
// 1.2设置页面
modelAndView.setViewName("model_a");
// 2.返回
return modelAndView;
}
-
创建 model_a.ftl 文件
-
用户名: ${user.name} <br/> 密码: ${user.age}
-
方式2:使用Model
- controller:
-
/** * 方式2; 使用Model * * @param model * @return */ @GetMapping("/model_b") public String model_b(Model model) { // 1.设置模型数据 Map<String, String> map = new HashMap<>(); map.put("name", "jack"); map.put("age", "99"); model.addAttribute("user", map); // 2.返回视图(页面) return "/model_b"; }
创建 model_b.ftl 文件
用户名: ${user.name} <br/> 密码: ${user.age}
-
方式3:使用自定义数据
- Controller:
-
/** * 方式3:使用自定义数据 */ @GetMapping("/model_c") public String model_c(Map map) { //设置数据 Map<String, String> userMap = new HashMap<>(); userMap.put("name", "jack"); userMap.put("age", "20"); map.put("user", userMap); //设置页面 return "/model_c"; }
创建 model_c.ftl 文件
用户名: ${user.name} <br/> 密码: ${user.age}
3. List指令:遍历List
-
语法
<#list 集合 as 变量>
循环体
</#list>
_index:得到循环的下标,值是从0开始。使用方法"变量_index"
步骤一: 编写JavaBean,User对象(username,password,age)及其构造
@Data @NoArgsConstructor //无参 @AllArgsConstructor // 有参 public class User { private String username; private String password; private Integer age; }
步骤二: 编写controller,List集合存放一组数据
Controller:
/** * list遍历 * * @param model * @return */ @GetMapping("/list") public String list(Model model) { //设置模型(数据) List<User> list = new ArrayList(); list.add(new User("jack", "1234", 18)); list.add(new User("rose", "5678", 21)); model.addAttribute("allUser", list); //返回页面 return "list"; }
步骤三: 编写模板,list.ftl
list遍历 <#list allUser as user> ${user_index +1} -- ${user.username} --${user.password}--${user.age}<br/> </#list>
- 测试
问: 查询所有用户,如何使用 <table>
标签进行布局
ftl:
<table border="1"> <tr> <td>用户名</td> <td>密码</td> <td>年龄</td> </tr> <#list allUser as user> <tr> <td>${user.username}</td> <td>${user.password}</td> <td>${user.age}</td> </tr> </#list> </table>
4. List指令:遍历Map
- 数据获取方式:
//通过 . 依次获得
语法:${集合变量.key值.属性名}
例如:${allUser.user1.username}
//通过 [] 获得,允许[]中使用变量,如果是字符串需要使用引号
语法:${集合变量['key值'].属性名}
例如:${allUser['user1'].username}
- 获得map的所有key
语法:集合变量?keys
步骤一:编写controller,Model + Map<String,User>
/** * 遍历Map */ @GetMapping("/map") public String map(Model model) { //设置模型(数据) Map<String, User> map = new HashMap<>(); map.put("user1", new User("jack", "1234", 18)); map.put("user2", new User("rose", "5678", 21)); model.addAttribute("allUser", map); //设置视图(页面) return "map"; }
步骤二:编写模板map.ftl,通过遍历map的key,遍历map数据
<#--指定key --> ${allUser.user1.username}<br/> ${allUser['user1'].username}<br/> <#--遍历一组--> <#list allUser?keys as k> ${k} --${allUser[k].username} --${allUser[k].password} --${allUser[k].age} <br/> </#list>
测试:
5.if指令
-
语法
-
<#if 条件> </#if>
-
实例
<#if token = 1234 >
</#if>
//注意:条件中的值类型,必须与变量的类型匹配
步骤一:编写controller
/** * if指令 * * @param model * @return */ @GetMapping("/if") public String _if(Model model) { //设置数据 model.addAttribute("token", 1234); model.addAttribute("token2", "5678"); return "if"; }
步骤二:编写模板 if.ftl
<#--if判断--> <#if token==1234> token 是1234<br/> </#if> <#if token2!="1234"> token2不是5678 <br/> </#if> <#--不要使用> 用gt 替换--> <#if token gt 100> 大于 <br/> </#if> <#--空值处理--> <#--不为空处理--> <#if token??> token不为空 <br/> </#if> <#--为空处理--> <#if !token3??> token3为空 <br/> </#if> <#--默认值--> ${token3!'3的默认值'}<br/>
测试:
6.兼容
- 情况1:使用${}显示不存在的数据,将抛异常
- 情况2:使用if比较值相同,但类型不相同的数据时,将抛异常
具体详情可查看我上篇博客:
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
来源:oschina
链接:https://my.oschina.net/ithuang/blog/4324855