FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML页面,电子邮件,配置文件,源代码等)的通用工具,他不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件
特点:
FreeMarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为Html,也可以生成其它格式的文本文件)
freeMarker作为Springmvc一种视图格式,默认情况下SpirngMvc支持freeMarker试图格式。需要创建Spring Booot-Freemarker工程用于测试模板
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.4.5</version>
</dependency>
server:
port: 8888
mybatis:
type-aliases-package: com.zuxia.entity
mapper-locations: classpath:mapper/*.xml
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/userdb?useUnicode=true&characterEncoding=utf-8
username: root
# 1.配置生成的password
password: 123456
# Druid数据源配置
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
#配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
testOnBorrow: false
#配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
testOnReturn: false
#打开PsCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
#合并多个DruidDatasource的监控数据
useGlobalDataSourceStat: true
#通过connectProperties属性来打开mergesql功能罗慢sQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500;
#配置DruidStatFilter
web-view-servlet:
enabled: true
url-pattern: "/*"
exclusions: ".js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置 DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP 白名单,没有配置或者为空,则允许所有访问
allow: 127.0.0.1
# IP 黑名单,若白名单也存在,则优先使用
deny: 192.168.31.253
# 禁用 HTML 中 Reset All 按钮
reset-enable: false
# 登录用户名/密码
login-username: root
login-password: 123
#设置springmvc模板的位置
mvc:
view:
suffix: /templates/
prefix: .ftlh
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
${name}欢迎登陆
</body>
</html>
package com.zuxia.controller;
import com.zuxia.entity.User;
import com.zuxia.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/User")
public class UserController {
@RequestMapping("/tofreemker")
public String FreemkerPage(Map<String,Object> map){
System.out.println("===========");
map.put("name","zhangsan"); //页面可以用${key}来获取值
return "index";
}
}
一:遍历List集合
a)注释:即<#- - 注释的内容- ->,介于其之间的内容会被FreeMarker忽略
b)取值:即${…},freeMarker会用真实的值代替${…}
c)FTL指令:和HTML标记类似,名字前面加#予以区分,FreeMarker会解析标签中的表达式或逻辑,如:<#list key值 as 别名> </#list>和<c:forEach>标签相似
d)文本,仅文本信息,这些不是FreeMarker的注释、插值、FTL指令的内容会被FreeMarker忽略解析,直接输出内容
如遍历所有的用户信息
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息展示</title>
</head>
<body>
<table cellpadding="0px" cellspacing="0px" border="1px">
<th>
<td>索引</td>
<td>编号</td>
<td>登录名</td>
<td>登录密码</td>
<td>真实名字</td>
<td>电话</td>
</th>
<#list userList as user>
<tr>
<td></td>
<#--注意:_index:得到循环的下标,使用方法是在user之后加“_index”,它的值是从0开始的-->
<td>${user_index}</td>
<td>${user.uid}</td>
<td>${user.loginname}</td>
<td>${user.loginpwd}</td>
<td>${user.uname}</td>
<td>${user.uphone}</td>
</tr>
</#list>
</table>
</body>
</html>
注意:_index:得到循环的下标,使用方法是在user之后加“_index”,它的值是从0开始的
Controller类中
package com.zuxia.controller;
import com.zuxia.entity.User;
import com.zuxia.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/User")
public class UserController {
@Autowired
private IUserService iUserService;
@RequestMapping("/Allfind")
//查询所有的用户信息
public ModelAndView Allfind(){
ModelAndView mv=new ModelAndView();
List<User> userList= iUserService.selectALl();
mv.addObject("userList",userList);
mv.setViewName("showUser");
return mv;
}
}
二:遍历Map集合
a)查看Map集合中单独一个元素:${集合名[key].属性名}
b)遍历所有的key :<#list userMap ? keys as k> </#list> keys为固定的,k可以随便起
前端页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息展示</title>
</head>
<body>
<#--查看Map集合中单独一个元素:${集合名[key].属性名}-->
查看1号用户的信息<br>
登录名:${userMap['2'].uname}
<hr>
<table cellpadding="0px" cellspacing="0px" border="1px">
<th>
<td>索引</td>
<td>编号</td>
<td>登录名</td>
<td>登录密码</td>
<td>真实名字</td>
<td>电话</td>
</th>
<#list userMap ? keys as k><#--相当于遍历所有的key-->
<tr>
<td></td>
<#--注意:_index:得到循环的下标,使用方法是在user之后加“_index”,它的值是从0开始的-->
<td>${k_index}</td>
<td>${userMap[k].uid}</td><#-- 也可以写<td>${k}</td>,因为k就是用户编号-->
<td>${userMap[k].loginname}</td>
<td>${userMap[k].loginpwd}</td>
<td>${userMap[k].uname}</td>
<td>${userMap[k].uphone}</td>
</tr>
</#list>
</table>
</body>
</html>
controller类
package com.zuxia.controller;
import com.zuxia.entity.User;
import com.zuxia.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/User")
public class UserController {
@Autowired
private IUserService iUserService;
//以Map形式遍历用户信息
@RequestMapping("/AllfindMap")
public ModelAndView AllfindMap(){
ModelAndView mv=new ModelAndView();
List<User> userList= iUserService.selectALl();
Map<String,User> userMap=new HashMap<>();
//将List集合转换为Map
for(User user:userList){
userMap.put(user.getUid().toString(),user);
}
mv.addObject("userMap",userMap);
mv.setViewName("showUserMap");
return mv;
}
}
注:FreeMarker在遍历map集合时,key必须是String
三:if指令
if指令即为判断指令,是常用的FTL指令,FreeMarker在解析时遇到if会判断,条件为真则执行if中间的内容,否则跳过内容不输出
a)判断某变量是否存在使用“??”,用法为:<#if 变量名??></#if> ,如果该变量存在,返回true,否则返回false
如:判断传递过来的userList是否为空,则用
<#if userList??> <#--如果userList为空,则为false,则不执行里面的内容-->
<#list userList as user>
<tr>
<td></td>
<#--注意:_index:得到循环的下标,使用方法是在user之后加“_index”,它的值是从0开始的-->
............
</tr>
</#list>
</#if>
b)缺失变量默认值使用"!",使用!要指定一个默认值,当变量为空时显示默认值。
如判断身份证号是否为空
<#if userList??> <#--如果userList为空,则为false,则不执行里面的内容-->
<#list userList as user>
<tr>
<td></td>
<#--注意:_index:得到循环的下标,使用方法是在user之后加“_index”,它的值是从0开始的-->
<td>${user_index}</td>
。。。。。。。。。
<td>${user.rid ! '无'}</td><#--如果为空,则显示无-->
。。。。。。。。。。
</tr>
</#list>
</#if>
if中支持的运算符
a) 算数运算符FreeMarker表达式完全支持算术运算,FreeMarker支持的算术运算包括+,-,*,/,%
b) 逻辑运算符有符合如下几个:逻辑与:&& 逻辑非:! 逻辑或:|| 逻辑运算符只能作用与布尔值,否则将产生错误
c) 比较运算符有如下几个:=或==、!=、>或gt、>=或gte、<或lt、<=或lte
注:=和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,否则会产生错误,最好使用英文的
如:如果用户名为张三,则改变字体颜色
<td<#if user.uname=='李四'> style="color: aqua"</#if>>${user.uname}</td>
四:内置函数
内置函数语法格式:变量+?+函数名称
<td>${user.hiredate?date}</td>
<td>${user.hiredate?string("yyyy年MM月dd日")}</td><#--string()可以指定输入格式-->
<#assign text="{'name':'zhangsan','address':'兰州'}"/>
<#assign data=text?eval/>
用户名:${data.name} 地址:${data.address}
<#--
相当于JS中的 var=text="{'name':'zhangsan','address':'兰州'}"
eval(text)//进行解析text
-->
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- vipyiyao.com 版权所有 湘ICP备2023022495号-8
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务