版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/cms18374672699/article/details/87637855
史上最简单Spring Boot教程:第四篇SpringBoot之freemarker模板(四)
转载请标明出处:https://blog.csdn.net/cms18374672699/article/details/87637855
一、FreeMaker介绍
FreeMarker是一款免费的Java模板引擎,是一种基于模板和数据生成文本(HMLT、电子邮件、配置文件、源代码等)的工具,它不是面向最终用户的,而是一款程序员使用的组件。
FreeMarker最初设计是用来在MVC模式的Web开发中生成HTML页面的,所以没有绑定Servlet或任意Web相关的东西上,所以它可以运行在非Web应用环境中。
二、工作原理
FreeMarker模板存储在服务器上,当有用户访问的时候,FreeMarker会查询出相应的数据,替换模板中的标签,生成最终的HTML返回给用户,如下图:
三、FreeMarker的常用指令
- assign 代码片段声明
- attempt, recover 异常指令
- compress 压缩代码移除空白行
- escape, noescape 转义,不转义
- function, return 方法声明
- global 全局代码声明
- if, else, elseif 条件判断
- import 引入模板
- include 包含 嵌入模板
- list, else, items, sep, break 循环
- switch, case, default, break 多条件判断
FreeMarker的学习网站:http://freemarker.foofun.cn/
四、导入pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
五、application.yml文件的默认配置
spring: thymeleaf: cache: false freemarker: # 设置模板后缀名 suffix: .ftl # 设置文档类型 content-type: text/html # 设置页面编码格式 charset: UTF-8 # 设置页面缓存 cache: false # 设置ftl文件路径,默认是/templates,为演示效果添加role template-loader-path: classpath:/templates/role mvc: static-path-pattern: /static/**
添加模板页 Settings--->Editor---->File and Code Templates,然后添加模板页就按照以下图片标红的操作,完成后点击OK即可
六、常用指令演示
编写controller后台代码
@Controller
public class IndexController {
@RequestMapping("/user/list")
public ModelAndView list(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("user/list");
modelAndView.addObject("title","用户列表");
List list = new ArrayList<>();
list.add(new User(1,"欧巴","沉默是金"));
list.add(new User(2,"激动","你看见啥了"));
modelAndView.addObject("users",list);
return modelAndView;
}
@RequestMapping("/role/list")
public ModelAndView roleList(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("list");
modelAndView.addObject("name","张三");
modelAndView.addObject("sex","李四");
List list = new ArrayList<>();
list.add(new Role(1,"老师","传授知识"));
list.add(new Role(1,"学生","祖国的花朵"));
modelAndView.addObject("roles",list);
return modelAndView;
}
@RequestMapping("/login")
public String login(){
return "/login";
}
}
注:取值时:如果说是“”不会报错,是null就会报错。
解决:在后面添加!号,!后面添加内容就是设置默认值
例如:
welcome【${name!‘未知’}】to page
演示结果:
list.ftl模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>角色列表</title>
<#include 'common.ftl'>
</head>
<body>
角色列表
<h2>取值</h2>
welcome【${name!}】to page
<h2>非空判断</h2>
<#if name?exists>
xxxx
</#if>
<h2>条件表达式</h2>
<#if sex='boy'>
男
<#elseif sex=='girl'>
女
<#else >
保密
</#if>
<h2>循环</h2>
<table border="1px" width="600px">
<thead>
<tr>
<td>角色编号</td>
<td>角色姓名</td>
<td>角色描述</td>
</tr>
</thead>
<tbody>
<#list roles as role>
<tr>
<td>${role.rid}</td>
<td>${role.roleName}</td>
<td>${role.desc}</td>
</tr>
</#list>
</tbody>
</table>
<h2>获取项目名(设置局部变量及全局变量)</h2>
<#--c:set-->
<#--jsp ${pageContext.request.contextPath}-->
<#--局部变量:将项目名赋值给ctxl这个变量,这个作用域在当前页面-->
<#assign ctx1>
${springMacroRequestContext.contextPath}
</#assign>
<#--全局变量:将项目名赋值给ctxl这个变量,这个作用域在整个页面-->
<#global ctx2>
${springMacroRequestContext.contextPath}
</#global>
${ctx1},${ctx2}
<h2>include标签</h2>
<#include 'foot.ftl'>
</body>
</html>
浏览器输入:http://localhost:8080/springboot/role/list
注意点:
1、application.yml中可以配置模板存放位置的根路径、以及静态资源文件存放位置的根路径
2、${springMacroRequestContext.contextPath}:SpringBoot中获取项目名
3、不推荐使用全局变量。即便它们属于不同的命名空间, 全局变量也被所有模板共享,因为它们是被 import进来的。
4、freemarker模板也可以像jsp那样设置根路径
<#include 'common.ftl'> <script src="js/xxx.js" type="text/javascript"></script>
项目结构
common.ftl模板存放js文件
<#--获取项目路径-->
<#assign ctx>
${springMacroRequestContext.contextPath}
</#assign>
<base href="${ctx}"/>
<script type="text/javascript" src="static/js/layuixx.js"></script>
common.ftl相当于头部,然后在list.ftl模板中引用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>角色列表</title> <#include 'common.ftl'> </head> <body>
foot.ftl模板
底部内容
<a href="login.ftl">登录1</a>
<a href="${ctx1}/login">登录2</a>
login.ftl模板,当点击登录2,就跳转到login.ftl页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎来到登录页面
</body>
</html>