2023-09-22 21:57:28 +08:00
<!DOCTYPE html> < html lang = "zh-CN" data-theme = "light" > < head > < meta charset = "UTF-8" > < meta http-equiv = "X-UA-Compatible" content = "IE=edge" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0,viewport-fit=cover" > < title > FreeMarker模板引擎 | The Blog< / title > < meta name = "author" content = "Jason" > < meta name = "copyright" content = "Jason" > < meta name = "format-detection" content = "telephone=no" > < meta name = "theme-color" content = "#ffffff" > < meta name = "description" content = "一.FreeMarker介绍 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页, 电子邮件, 配置文件, 源代码等)的通用工具。 它不是面向最终用户的, 而是一个Java类库, 是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP" >
< meta property = "og:type" content = "article" >
< meta property = "og:title" content = "FreeMarker模板引擎" >
2024-05-10 10:21:35 +08:00
< meta property = "og:url" content = "https://qingling.icu/posts/29367.html" >
2023-09-22 21:57:28 +08:00
< meta property = "og:site_name" content = "The Blog" >
< meta property = "og:description" content = "一.FreeMarker介绍 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页, 电子邮件, 配置文件, 源代码等)的通用工具。 它不是面向最终用户的, 而是一个Java类库, 是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP" >
< meta property = "og:locale" content = "zh_CN" >
2024-06-14 22:00:25 +08:00
< meta property = "og:image" content = "https://qingling.icu/img/6.png" >
2023-09-22 21:57:28 +08:00
< meta property = "article:published_time" content = "2023-08-16T06:38:53.000Z" >
2024-05-10 13:32:25 +08:00
< meta property = "article:modified_time" content = "2024-05-10T05:31:11.655Z" >
2023-09-22 21:57:28 +08:00
< meta property = "article:author" content = "Jason" >
< meta property = "article:tag" content = "FreeMarker" >
< meta name = "twitter:card" content = "summary" >
2024-06-14 22:00:25 +08:00
< meta name = "twitter:image" content = "https://qingling.icu/img/6.png" > < link rel = "shortcut icon" href = "/img/%E5%9B%BE%E6%A0%87.png" > < link rel = "canonical" href = "https://qingling.icu/posts/29367.html" > < link rel = "preconnect" href = "//fastly.jsdelivr.net" / > < link rel = "preconnect" href = "//busuanzi.ibruce.info" / > < link rel = "stylesheet" href = "/css/index.css" > < link rel = "stylesheet" href = "/cdn/icon/fontawesome-free/css/all.min.css" media = "print" onload = "this.media='all'" > < link rel = "stylesheet" href = "/cdn/css/snackbar.min.css" media = "print" onload = "this.media='all'" > < link rel = "stylesheet" href = "/cdn/css/fancybox.min.css" media = "print" onload = "this.media='all'" > < script > c o n s t G L O B A L _ C O N F I G = {
2023-09-22 21:57:28 +08:00
root: '/',
algolia: undefined,
localSearch: {"path":"/search.xml","preload":true,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容:${query}","hits_stats":"共找到 ${hits} 篇文章"}},
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":400},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: true,
post: true
},
runtime: '天',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'mediumZoom',
2023-12-09 14:21:01 +08:00
Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#006650","bgDark":"#006650","position":"top-center"},
2023-09-22 21:57:28 +08:00
source: {
justifiedGallery: {
2023-09-30 18:36:25 +08:00
js: 'https://fastly.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
css: 'https://fastly.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
2023-09-22 21:57:28 +08:00
}
},
isPhotoFigcaption: false,
islazyload: false,
2023-12-10 21:57:00 +08:00
isAnchor: true,
2023-09-22 21:57:28 +08:00
percent: {
toc: true,
rightside: false,
},
2023-12-09 19:59:36 +08:00
autoDarkmode: true
2023-09-22 21:57:28 +08:00
}< / script > < script id = "config-diff" > v a r G L O B A L _ C O N F I G _ S I T E = {
title: 'FreeMarker模板引擎',
isPost: true,
isHome: false,
isHighlightShrink: false,
isToc: true,
2024-05-10 13:32:25 +08:00
postUpdate: '2024-05-10 13:31:11'
2023-09-22 21:57:28 +08:00
}< / script > < noscript > < style type = "text/css" >
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
< / style > < / noscript > < script > ( w i n = > {
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState & & loadState !== 'loaded' & & loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.getCSS = (url,id = false) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onerror = reject
link.onload = link.onreadystatechange = function() {
const loadState = this.readyState
if (loadState & & loadState !== 'loaded' & & loadState !== 'complete') return
link.onload = link.onreadystatechange = null
resolve()
}
document.head.appendChild(link)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
2023-12-09 19:59:36 +08:00
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
const hasNoSupport = !isDarkMode & & !isLightMode & & !isNotSpecified
if (t === undefined) {
if (isLightMode) activateLightMode()
else if (isDarkMode) activateDarkMode()
else if (isNotSpecified || hasNoSupport) {
const now = new Date()
const hour = now.getHours()
const isNight = hour < = 8 || hour >= 22
isNight ? activateDarkMode() : activateLightMode()
}
window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
if (saveToLocal.get('theme') === undefined) {
e.matches ? activateDarkMode() : activateLightMode()
}
})
} else if (t === 'light') activateLightMode()
else activateDarkMode()
2023-09-22 21:57:28 +08:00
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
2024-06-14 22:00:25 +08:00
})(window)< / script > < script src = "https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" > < / script > < script type = "text/javascript" src = "/js/welcome.js" > < / script > < script src = "/js/sweetalert.js" > < / script > < link rel = "stylesheet" href = "/css/sweetalert.css" > <!-- hexo injector head_end start --> < link rel = "stylesheet" href = "https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.css" media = "print" onload = "this.media='all'" > < link rel = "stylesheet" href = "https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiperstyle.css" media = "print" onload = "this.media='all'" > <!-- hexo injector head_end end --> < meta name = "generator" content = "Hexo 6.3.0" > < / head > < body > < div id = "sidebar" > < div id = "menu-mask" > < / div > < div id = "sidebar-menus" > < div class = "avatar-img is-center" > < img src = "/img/avatar.jpg" onerror = "onerror=null;src='/img/loading.gif'" alt = "avatar" / > < / div > < div class = "sidebar-site-data site-data is-center" > < a href = "/archives/" > < div class = "headline" > 文章< / div > < div class = "length-num" > 60< / div > < / a > < a href = "/tags/" > < div class = "headline" > 标签< / div > < div class = "length-num" > 39< / div > < / a > < a href = "/categories/" > < div class = "headline" > 分类< / div > < div class = "length-num" > 10< / div > < / a > < / div > < br / > < div class = "menus_items" > < div class = "menus_item" > < a class = "site-page" target = "_blank" rel = "noopener" href = "https://www.tutorialspoint.com/compile_java8_online.php" > < i class = "fa-fw fas fa-code" > < / i > < span > 代码< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/notice/" > < i class = "fa-fw fas fa-stream" > < / i > < span > 公告< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/website/" > < i class = "fa-fw fas fa-list" > < / i > < span > 网址< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/" > < i class = "fa-fw fas fa-home" > < / i > < span > 主页< / span > < / a > < / div > < / div > < / div > < / div > < div class = "post" id = "body-wrap" > < header class = "not-top-img" id = "page-header" > < nav id = "nav" > < span id = "blog-info" > < a href = "/" title = "The Blog" > < img class = "site-icon" src = "/img/logo.png" / > < span class = "site-name" > The Blog< / span > < / a > < / span > < div id = "menus" > < div id = "search-button" > < a class = "site-page social-icon search" href = "javascript:void(0);" > < i class = "fas fa-search fa-fw" > < / i > < span > 搜索< / span > < / a > < / div > < div class = "menus_items" > < div class = "menus_item" > < a class = "site-page" target = "_blank" rel = "noopener" href = "https://www.tutorialspoint.com/compile_java8_online.php" > < i class = "fa-fw fas fa-code" > < / i > < span > 代码< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/notice/" > < i class = "fa-fw fas fa-stream" > < / i > < span > 公告< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/website/" > < i class = "fa-fw fas fa-list" > < / i > < span > 网址< / span > < / a > < / div > < div class = "menus_item" > < a class = "site-page" href = "/" > < i class = "fa-fw fas fa-home" > < / i > < span > 主页< / span > < / a > < / div > < / div > < div id = "toggle-menu" > < a class = "site-page" href = "javascript:void(0);" > < i class = "fas fa-bars fa-fw" > < / i > < / a > < / div > < / div > < / nav > < / header > < main class = "layout" id = "content-inner" > < div id = "post" > < div id = "post-info" > < h1 class = "post-title" > FreeMarker模板引擎< / h1 > < div id = "post-meta" > < div class = "meta-firstline" > < span class = "post-meta-date" > < i class = "far fa-calendar-alt fa-fw post-meta-icon" > < / i > < span class = "post-meta-label" > 发表于< / span > < time class = "post-meta-date-created" datetime = "2023-08-16T06:38:53.000Z" title = "发表于 2023-08-16 14:38:53" > 2023-08-16< / time > < span class = "post-meta-separator" > |< / span > < i class = "fas fa-history fa-fw post-meta-icon" > < / i > < span class = "post-meta-label" > 更新于< / span > < time class = "post-meta-date-updated" datetime = "2024-05-10T05:31:11.655Z" title = "更新于 2024-05-10 13:31:11" > 2024-05-10< / time > < / span > < span class = "post-meta-categories" > < span class = "post-meta-separator" > |< / span > < i class = "fas fa-inbox fa-fw post-meta-icon" > < / i > < a class = "post-meta-categories" href = "/categories/%E5%89%8D%E7%AB%AF/" > 前端< / a > < / span > < / div > < div class = "meta-secondline" > < span class = "post-meta-separator" > |< / span > < span class = "post-meta-wordcount" > < i class = "far fa-file-word fa-fw post-meta-icon" > < / i > < span class = "post-meta-label" > 字数总计:< / span > < span class = "word-co
2023-09-22 21:57:28 +08:00
< p > 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, < em > 不是< / em > 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。< / p >
< p > < img src = "/pictures/image-20230816145012534.png" alt = "image-20230816145012534" > < / p >
< p > < strong > 技术选型对比< / strong > < / p >
< table >
< thead >
< tr >
< th > < strong > 技术< / strong > < / th >
< th > < strong > 说明< / strong > < / th >
< / tr >
< / thead >
< tbody > < tr >
< td > Jsp< / td >
< td > Jsp 为 Servlet 专用,不能单独进行使用< / td >
< / tr >
< tr >
< td > Velocity< / td >
< td > Velocity从2010年更新完 2.0 版本后, 7年没有更新。Spring Boot 官方在 1.4 版本后对此也不在支持< / td >
< / tr >
< tr >
< td > thmeleaf< / td >
< td > 新技术,功能较为强大,但是执行的效率比较低< / td >
< / tr >
< tr >
< td > freemarker< / td >
< td > 性能好,强大的模板语言、轻量< / td >
< / tr >
< / tbody > < / table >
< h1 id = "二-快速入门" > < a href = "#二-快速入门" class = "headerlink" title = "二.快速入门" > < / a > 二.快速入门< / h1 > < h2 id = "1-环境搭建" > < a href = "#1-环境搭建" class = "headerlink" title = "1.环境搭建" > < / a > 1.环境搭建< / h2 > < h3 id = "1-1-创建一个demo工程" > < a href = "#1-1-创建一个demo工程" class = "headerlink" title = "1.1 创建一个demo工程" > < / a > 1.1 创建一个demo工程< / h3 > < p > 此处为了方便建的是子模块,测试使用可以创建一个单独的工程< / p >
< p > < img src = "/pictures/image-20230816145923876.png" alt = "image-20230816145923876" > < / p >
< h3 id = "1-2-引入依赖" > < a href = "#1-2-引入依赖" class = "headerlink" title = "1.2 引入依赖" > < / a > 1.2 引入依赖< / h3 > < figure class = "highlight xml" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "tag" > < < span class = "name" > dependencies< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > groupId< / span > > < / span > org.springframework.boot< span class = "tag" > < /< span class = "name" > groupId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > artifactId< / span > > < / span > spring-boot-starter-web< span class = "tag" > < /< span class = "name" > artifactId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > groupId< / span > > < / span > org.springframework.boot< span class = "tag" > < /< span class = "name" > groupId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > artifactId< / span > > < / span > spring-boot-starter-freemarker< span class = "tag" > < /< span class = "name" > artifactId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > groupId< / span > > < / span > org.springframework.boot< span class = "tag" > < /< span class = "name" > groupId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > artifactId< / span > > < / span > spring-boot-starter-test< span class = "tag" > < /< span class = "name" > artifactId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "comment" > < !-- lombok --> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > groupId< / span > > < / span > org.projectlombok< span class = "tag" > < /< span class = "name" > groupId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > artifactId< / span > > < / span > lombok< span class = "tag" > < /< span class = "name" > artifactId< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > < !-- apache 对 java io 的封装工具库 --> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dependency< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > groupId< / span > > < / span > org.apache.commons< span class = "tag" > < /< span class = "name" > groupId< /sp
< h3 id = "1-3-添加配置" > < a href = "#1-3-添加配置" class = "headerlink" title = "1.3 添加配置" > < / a > 1.3 添加配置< / h3 > < figure class = "highlight yaml" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "attr" > server:< / span > < / span > < br > < span class = "line" > < span class = "attr" > port:< / span > < span class = "number" > 8881< / span > < span class = "comment" > #服务端口< / span > < / span > < br > < span class = "line" > < span class = "attr" > spring:< / span > < / span > < br > < span class = "line" > < span class = "attr" > application:< / span > < / span > < br > < span class = "line" > < span class = "attr" > name:< / span > < span class = "string" > freemarker-demo< / span > < span class = "comment" > #指定服务名< / span > < / span > < br > < span class = "line" > < span class = "attr" > freemarker:< / span > < / span > < br > < span class = "line" > < span class = "attr" > cache:< / span > < span class = "literal" > false< / span > < span class = "comment" > #关闭模板缓存,方便测试< / span > < / span > < br > < span class = "line" > < span class = "attr" > settings:< / span > < / span > < br > < span class = "line" > < span class = "attr" > template_update_delay:< / span > < span class = "number" > 0< / span > < span class = "comment" > #检查模板更新延迟时间, 设置为0表示立即检查, 如果时间大于0会有缓存不方便进行模板测试< / span > < / span > < br > < span class = "line" > < span class = "attr" > suffix:< / span > < span class = "string" > .ftl< / span > < span class = "comment" > #指定Freemarker模板文件的后缀名,通常都是以ftl作为扩展名,也可以为html、xml、jsp等!< / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h3 id = "1-4-创建模板" > < a href = "#1-4-创建模板" class = "headerlink" title = "1.4 创建模板" > < / a > 1.4 创建模板< / h3 > < p > 在resources下创建< strong > templates< / strong > , 此目录为freemarker的默认模板存放目录< / p >
< p > < img src = "/pictures/image-20230816150936881.png" alt = "image-20230816150936881" > < / p >
< p > 在templates下创建模板文件 01-basic.ftl ,模板中的< strong > 插值表达式< / strong > 最终会被freemarker替换成具体的数据< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > < !DOCTYPE < span class = "keyword" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > meta< / span > < span class = "attr" > charset< / span > =< span class = "string" > " utf-8" < / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > title< / span > > < / span > Hello World!< span class = "tag" > < /< span class = "name" > title< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 普通文本 String 展示:< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > Hello ${ name} < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 对象Student中的数据展示: < span class = "tag" > < /< span class = "name" > b< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 姓名:${ stu.name} < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 年龄:${ stu.age} < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > html< / span > > < / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2024-05-10 13:32:25 +08:00
< h3 id = "1-5-创建启动类和模型类" > < a href = "#1-5-创建启动类和模型类" class = "headerlink" title = "1.5 创建启动类和模型类" > < / a > 1.5 创建启动类和模型类< / h3 > < figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > package< / span > com.heima.freemarker;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.boot.SpringApplication;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.boot.autoconfigure.SpringBootApplication;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > /**< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @author< / span > Jason Gong< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @version< / span > 1.0< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @website< / span > https://qingling.icu< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Date< / span > 2023/8/16< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Description< / span > < / span > < / span > < br > < span class = "line" > < span class = "comment" > */< / span > < / span > < br > < span class = "line" > < span class = "meta" > @SpringBootApplication< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > < span class = "keyword" > class< / span > < span class = "title class_" > FreeMarkerDemoApplication< / span > { < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > < span class = "keyword" > static< / span > < span class = "keyword" > void< / span > < span class = "title function_" > main< / span > < span class = "params" > (String[] args)< / span > { < / span > < br > < span class = "line" > SpringApplication.run(FreeMarkerDemoApplication.class,args);< / span > < br > < span class = "line" > } < / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2023-09-22 21:57:28 +08:00
2024-05-10 13:32:25 +08:00
< figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > package< / span > com.heima.freemarker.entity;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > lombok.Data;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > java.util.Date;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > /**< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @author< / span > Jason Gong< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @version< / span > 1.0< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @website< / span > https://qingling.icu< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Date< / span > 2023/8/16< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Description< / span > < / span > < / span > < br > < span class = "line" > < span class = "comment" > */< / span > < / span > < br > < span class = "line" > < span class = "meta" > @Data< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > < span class = "keyword" > class< / span > < span class = "title class_" > Student< / span > { < / span > < br > < span class = "line" > < span class = "keyword" > private< / span > String name;< span class = "comment" > //姓名< / span > < / span > < br > < span class = "line" > < span class = "keyword" > private< / span > < span class = "type" > int< / span > age;< span class = "comment" > //年龄< / span > < / span > < br > < span class = "line" > < span class = "keyword" > private< / span > Date birthday;< span class = "comment" > //生日< / span > < / span > < br > < span class = "line" > < span class = "keyword" > private< / span > Float money;< span class = "comment" > //钱包< / span > < / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
2023-09-22 21:57:28 +08:00
2024-05-10 13:32:25 +08:00
< h3 id = "1-6-创建Controller" > < a href = "#1-6-创建Controller" class = "headerlink" title = "1.6 创建Controller" > < / a > 1.6 创建Controller< / h3 > < figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > package< / span > com.heima.freemarker.controller;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > com.heima.freemarker.entity.Student;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.stereotype.Controller;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.ui.Model;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.web.bind.annotation.GetMapping;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > /**< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @author< / span > Jason Gong< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @version< / span > 1.0< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @website< / span > https://qingling.icu< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Date< / span > 2023/8/16< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Description< / span > < / span > < / span > < br > < span class = "line" > < span class = "comment" > */< / span > < / span > < br > < span class = "line" > < span class = "meta" > @Controller< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > < span class = "keyword" > class< / span > < span class = "title class_" > HelloController< / span > { < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "meta" > @GetMapping(" /basic" )< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > String < span class = "title function_" > test< / span > < span class = "params" > (Model model)< / span > { < / span > < br > < span class = "line" > < span class = "comment" > //1.纯文本形式的参数< / span > < / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " name" < / span > , < span class = "string" > " freemarker" < / span > );< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //2.实体类相关的参数< / span > < / span > < br > < span class = "line" > < span class = "type" > Student< / span > < span class = "variable" > student< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Student< / span > ();< / span > < br > < span class = "line" > student.setName(< span class = "string" > " 小明" < / span > );< / span > < br > < span class = "line" > student.setAge(< span class = "number" > 18< / span > );< / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " stu" < / span > , student);< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > return< / span > < span class = "string" > " 01-basic" < / span > ;< / span > < br > < span class = "line" > } < / span > < br > < span class = "line" > } < / span > < br > <
2023-09-22 21:57:28 +08:00
< h3 id = "1-7-测试访问" > < a href = "#1-7-测试访问" class = "headerlink" title = "1.7 测试访问" > < / a > 1.7 测试访问< / h3 > < p > 访问 < a target = "_blank" rel = "noopener" href = "http://localhost:8881/basic" > http://localhost:8881/basic< / a > < / p >
< p > < img src = "/pictures/image-20230816152750639.png" alt = "image-20230816152750639" > < / p >
< h1 id = "三-FreeMarker语法基础" > < a href = "#三-FreeMarker语法基础" class = "headerlink" title = "三.FreeMarker语法基础" > < / a > 三.FreeMarker语法基础< / h1 > < h2 id = "1-基础语法种类" > < a href = "#1-基础语法种类" class = "headerlink" title = "1.基础语法种类" > < / a > 1.基础语法种类< / h2 > < p > 1、注释, 即< #– – > , 介于其之间的内容会被freemarker忽略< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < #--我是一个freemarker注释--> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 2、插值( Interpolation) : 即 < strong > < code > ${ ..} < / code > < / strong > 部分,freemarker会用真实的值代替**< code > ${ ..} < / code > **< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > Hello ${ name} < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 3、FTL指令: 和HTML标记类似, 名字前加#予以区分, Freemarker会解析标签中的表达式或逻辑。< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < # > FTL指令< /#> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 4、文本, 仅文本信息, 这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析, 直接输出内容。< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < #--freemarker中的普通文本--> < / span > < br > < span class = "line" > 我是一个普通的文本< / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "2-集合指令" > < a href = "#2-集合指令" class = "headerlink" title = "2.集合指令" > < / a > 2.集合指令< / h2 > < p > < img src = "/pictures/image-20230816170028648.png" alt = "image-20230816170028648" > < / p >
< p > < img src = "/pictures/image-20230816170704421.png" alt = "image-20230816170704421" > < / p >
< p > 1、数据模型: < / p >
< p > 在HelloController中新增如下方法: < / p >
< figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > @GetMapping(" /list" )< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > String < span class = "title function_" > list< / span > < span class = "params" > (Model model)< / span > { < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //------------------------------------< / span > < / span > < br > < span class = "line" > < span class = "type" > Student< / span > < span class = "variable" > stu1< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Student< / span > ();< / span > < br > < span class = "line" > stu1.setName(< span class = "string" > " 小强" < / span > );< / span > < br > < span class = "line" > stu1.setAge(< span class = "number" > 18< / span > );< / span > < br > < span class = "line" > stu1.setMoney(< span class = "number" > 1000.86f< / span > );< / span > < br > < span class = "line" > stu1.setBirthday(< span class = "keyword" > new< / span > < span class = "title class_" > Date< / span > ());< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //小红对象模型数据< / span > < / span > < br > < span class = "line" > < span class = "type" > Student< / span > < span class = "variable" > stu2< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Student< / span > ();< / span > < br > < span class = "line" > stu2.setName(< span class = "string" > " 小红" < / span > );< / span > < br > < span class = "line" > stu2.setMoney(< span class = "number" > 200.1f< / span > );< / span > < br > < span class = "line" > stu2.setAge(< span class = "number" > 19< / span > );< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //将两个对象模型数据存放到List集合中< / span > < / span > < br > < span class = "line" > List< Student> stus = < span class = "keyword" > new< / span > < span class = "title class_" > ArrayList< / span > < > ();< / span > < br > < span class = "line" > stus.add(stu1);< / span > < br > < span class = "line" > stus.add(stu2);< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //向model中存放List集合数据< / span > < / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " stus" < / span > ,stus);< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //------------------------------------< / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > //创建Map数据< / span > < / span > < br > < span class = "line" > HashMap< String,Student> stuMap = < span class = "keyword" > new< / span > < span class = "title class_" > HashMap< / span > < > ();< / span > < br > < span class = "line" > stuMap.put(< span class = "string" > " stu1" < / span > ,stu1);< / span > < br > < span class = "line" > stuMap.put(< span class = "string" > " stu2" < / span > ,stu2);< / span > < br > < span class = "line" > < span class = "comment" > // 3.1 向model中存放Map数据< / span > < / span > < br > < span class = "
< p > 2、模板: < / p >
< p > 在templates中新增< code > 02-list.ftl< / code > 文件< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < span class = "line" > 40< / span > < br > < span class = "line" > 41< / span > < br > < span class = "line" > 42< / span > < br > < span class = "line" > 43< / span > < br > < span class = "line" > 44< / span > < br > < span class = "line" > 45< / span > < br > < span class = "line" > 46< / span > < br > < span class = "line" > 47< / span > < br > < span class = "line" > 48< / span > < br > < span class = "line" > 49< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > < !DOCTYPE < span class = "keyword" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > meta< / span > < span class = "attr" > charset< / span > =< span class = "string" > " utf-8" < / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > title< / span > > < / span > Hello World!< span class = "tag" > < /< span class = "name" > title< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < #-- list 数据的展示 --> < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 展示list中的stu数据:< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > table< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > tr< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 序号< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 姓名< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 年龄< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 钱包< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > tr< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > table< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < span cla
< p > 实例代码:< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < span class = "line" > 40< / span > < br > < span class = "line" > 41< / span > < br > < span class = "line" > 42< / span > < br > < span class = "line" > 43< / span > < br > < span class = "line" > 44< / span > < br > < span class = "line" > 45< / span > < br > < span class = "line" > 46< / span > < br > < span class = "line" > 47< / span > < br > < span class = "line" > 48< / span > < br > < span class = "line" > 49< / span > < br > < span class = "line" > 50< / span > < br > < span class = "line" > 51< / span > < br > < span class = "line" > 52< / span > < br > < span class = "line" > 53< / span > < br > < span class = "line" > 54< / span > < br > < span class = "line" > 55< / span > < br > < span class = "line" > 56< / span > < br > < span class = "line" > 57< / span > < br > < span class = "line" > 58< / span > < br > < span class = "line" > 59< / span > < br > < span class = "line" > 60< / span > < br > < span class = "line" > 61< / span > < br > < span class = "line" > 62< / span > < br > < span class = "line" > 63< / span > < br > < span class = "line" > 64< / span > < br > < span class = "line" > 65< / span > < br > < span class = "line" > 66< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > < !DOCTYPE < span class = "keyword" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > meta< / span > < span class = "attr" > charset< / span > =< span class = "string" > " utf-8" < / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > title< / span > > < / span > Hello World!< span class = "tag" > < /< span class = "name" > title< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < #-- list 数据的展示 --> < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 展示list中的stu数据:< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > table< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > tr< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 序号< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > > < / span > 姓名< span class = "tag" > < /< span class = "name" > td< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > td< / span > >
< p > 上面代码解释:< / p >
< p > ${k_index}: index: 得到循环的下标, 使用方法是在stu后边加”_index”, 它的值是从0开始, ${stu_index+1}下标从1开始< / p >
< p > 展示效果:< / p >
< p > < img src = "/pictures/image-20230816170550343.png" alt = "image-20230816170550343" > < / p >
< h2 id = "3-if指令" > < a href = "#3-if指令" class = "headerlink" title = "3.if指令" > < / a > 3.if指令< / h2 > < p > < img src = "/pictures/image-20230816170909497.png" alt = "image-20230816170909497" > < / p >
< p > if 指令即判断指令, 是常用的FTL指令, freemarker在解析时遇到if会进行判断, 条件为真则输出if中间的内容, 否则跳过内容不再输出。< / p >
< ul >
< li > 指令格式< / li >
< / ul >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < #if > < span class = "tag" > < /< span class = "name" > if< / span > > < / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 1、数据模型: < / p >
< p > 使用list指令中测试数据模型, 判断名称为小红的数据字体显示为红色。< / p >
< p > 2、模板: < / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < table> < / span > < br > < span class = "line" > < tr> < / span > < br > < span class = "line" > < td> 姓名< /td> < / span > < br > < span class = "line" > < td> 年龄< /td> < / span > < br > < span class = "line" > < td> 钱包< /td> < / span > < br > < span class = "line" > < /tr> < / span > < br > < span class = "line" > < #list stus as stu> < / span > < br > < span class = "line" > < tr> < / span > < br > < span class = "line" > < td > ${ stu.name} < /td> < / span > < br > < span class = "line" > < td> ${ stu.age} < /td> < / span > < br > < span class = "line" > < td > ${ stu.mondy} < /td> < / span > < br > < span class = "line" > < /tr> < / span > < br > < span class = "line" > < /#list> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < /table> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 实例代码:< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < table> < / span > < br > < span class = "line" > < tr> < / span > < br > < span class = "line" > < td> 姓名< /td> < / span > < br > < span class = "line" > < td> 年龄< /td> < / span > < br > < span class = "line" > < td> 钱包< /td> < / span > < br > < span class = "line" > < /tr> < / span > < br > < span class = "line" > < #list stus as stu > < / span > < br > < span class = "line" > < #if stu.name=' 小红' > < / span > < br > < span class = "line" > < tr style=" color: red" > < / span > < br > < span class = "line" > < td> ${ stu_index} < /td> < / span > < br > < span class = "line" > < td> ${ stu.name} < /td> < / span > < br > < span class = "line" > < td> ${ stu.age} < /td> < / span > < br > < span class = "line" > < td> ${ stu.money} < /td> < / span > < br > < span class = "line" > < /tr> < / span > < br > < span class = "line" > < #else > < / span > < br > < span class = "line" > < tr> < / span > < br > < span class = "line" > < td> ${ stu_index} < /td> < / span > < br > < span class = "line" > < td> ${ stu.name} < /td> < / span > < br > < span class = "line" > < td> ${ stu.age} < /td> < / span > < br > < span class = "line" > < td> ${ stu.money} < /td> < / span > < br > < span class = "line" > < /tr> < / span > < br > < span class = "line" > < /#if> < / span > < br > < span class = "line" > < /#list> < / span > < br > < span class = "line" > < /table> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 3、输出: < / p >
< p > < img src = "/pictures/image-20230816171119081.png" alt = "image-20230816171119081" > < / p >
< h2 id = "4-运算符" > < a href = "#4-运算符" class = "headerlink" title = "4.运算符" > < / a > 4.运算符< / h2 > < p > < strong > 1、算数运算符< / strong > < / p >
< p > FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:< / p >
< ul >
< li > 加法: < code > +< / code > < / li >
< li > 减法: < code > -< / code > < / li >
< li > 乘法: < code > *< / code > < / li >
< li > 除法: < code > /< / code > < / li >
< li > 求模 (求余): < code > %< / code > < / li >
< / ul >
< p > 模板代码< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 算数运算符< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 100+5 运算: ${ 100 + 5 } < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 100 - 5 * 5运算: ${ 100 - 5 * 5} < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 5 / 2运算: ${ 5 / 2} < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > 12 % 10运算: ${ 12 % 10} < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 除了 + 运算以外,其他的运算只能和 number 数字类型的计算。< / p >
< p > < strong > 2、比较运算符< / strong > < / p >
< ul >
< li > < strong > < code > =< / code > < strong > 或者< / strong > < code > ==< / code > < / strong > :判断两个值是否相等. < / li >
< li > < strong > < code > !=< / code > < / strong > :判断两个值是否不等. < / li >
< li > < strong > < code > > < / code > < strong > 或者< / strong > < code > gt< / code > < / strong > :判断左边值是否大于右边值 < / li >
< li > < strong > < code > > =< / code > < strong > 或者< / strong > < code > gte< / code > < / strong > :判断左边值是否大于等于右边值 < / li >
< li > < strong > < code > < < / code > < strong > 或者< / strong > < code > lt< / code > < / strong > :判断左边值是否小于右边值 < / li >
< li > < strong > < code > < =< / code > < strong > 或者< / strong > < code > lte< / code > < / strong > :判断左边值是否小于等于右边值< / li >
< / ul >
< p > = 和 = = 模板代码< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < span class = "line" > 40< / span > < br > < span class = "line" > 41< / span > < br > < span class = "line" > 42< / span > < br > < span class = "line" > 43< / span > < br > < span class = "line" > 44< / span > < br > < span class = "line" > 45< / span > < br > < span class = "line" > 46< / span > < br > < span class = "line" > 47< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > < !DOCTYPE < span class = "keyword" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > meta< / span > < span class = "attr" > charset< / span > =< span class = "string" > " utf-8" < / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > title< / span > > < / span > Hello World!< span class = "tag" > < /< span class = "name" > title< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 比较运算符< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dl< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dt< / span > > < / span > =/== 和 != 比较:< span class = "tag" > < /< span class = "name" > dt< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dd< / span > > < / span > < / span > < br > < span class = "line" > < #if " xiaoming" == " xiaoming" > < / span > < br > < span class = "line" > 字符串的比较 " xiaoming" == " xiaoming" < / span > < br > < span class = "line" > < /#if> < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dd< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > dd< / span > > < / span > < / span > < br > < span class = "line" > < #if 10 != 100> < / span > < br > < span class = "line" > 数值的比较 10 != 100< / span > < br > < span class = "line" > < /#if> < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dd< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > dl< / span > > < / span > < / span > < br > < span class = "line" > < / span > <
< p > Controller 的 数据模型代码< / p >
< figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > @GetMapping(" operation" )< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > String < span class = "title function_" > testOperation< / span > < span class = "params" > (Model model)< / span > { < / span > < br > < span class = "line" > < span class = "comment" > //构建 Date 数据< / span > < / span > < br > < span class = "line" > < span class = "type" > Date< / span > < span class = "variable" > now< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Date< / span > ();< / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " date1" < / span > , now);< / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " date2" < / span > , now);< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > return< / span > < span class = "string" > " 03-operation" < / span > ;< / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > < strong > 比较运算符注意< / strong > < / p >
< ul >
< li > < code > =< / code > 和< code > !=< / code > 可以用于字符串、数值和日期来比较是否相等< / li >
< li > < code > =< / code > 和< code > !=< / code > 两边必须是相同类型的值,否则会产生错误< / li >
< li > 字符串 < code > " x" < / code > 、< code > " x " < / code > 、< code > " X" < / code > 比较是不等的.因为FreeMarker是精确比较< / li >
< li > 其它的运行符可以作用于数字和日期,但不能作用于字符串< / li >
< li > 使用< code > gt< / code > 等字母运算符代替< code > > < / code > 会有更好的效果,因为 FreeMarker会把< code > > < / code > 解释成FTL标签的结束字符< / li >
< li > 可以使用括号来避免这种情况,如:< code > < #if (x> y)> < / code > < / li >
< / ul >
< p > < strong > 3、逻辑运算符< / strong > < / p >
< ul >
< li > 逻辑与:& & < / li >
< li > 逻辑或:|| < / li >
< li > 逻辑非:!< / li >
< / ul >
< p > 逻辑运算符只能作用于布尔值,否则将产生错误 。< / p >
< p > 模板代码< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 逻辑运算符< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < #if (10 lt 12 )& & ( 10 gt 5 ) > < / span > < br > < span class = "line" > (10 lt 12 )& & ( 10 gt 5 ) 显示为 true< / span > < br > < span class = "line" > < /#if> < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > br< / span > /> < / span > < / span > < br > < span class = "line" > < #if !false> < / span > < br > < span class = "line" > false 取反为true< / span > < br > < span class = "line" > < /#if> < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h2 id = "5-空值处理" > < a href = "#5-空值处理" class = "headerlink" title = "5.空值处理" > < / a > 5.空值处理< / h2 > < p > < strong > 1、判断某变量是否存在使用 “??”< / strong > < / p >
< p > 用法为:variable??,如果该变量存在,返回true,否则返回false < / p >
< p > 例: 为防止stus为空报错可以加上判断如下: < / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < #if stus??> < / span > < br > < span class = "line" > < #list stus as stu> < / span > < br > < span class = "line" > ......< / span > < br > < span class = "line" > < /#list> < / span > < br > < span class = "line" > < /#if> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > < strong > 2、缺失变量默认值使用 “!”< / strong > < / p >
< ul >
< li > < p > 使用!要以指定一个默认值,当变量为空时显示默认值< / p >
< p > 例: ${name!’ ’ }表示如果name为空显示空字符串。< / p >
< / li >
< li > < p > 如果是嵌套对象则建议使用()括起来< / p >
< p > 例: ${(stu.bestFriend.name)!’ ’ }表示, 如果stu或bestFriend或name为空默认显示空字符串。< / p >
< / li >
< / ul >
< h2 id = "6-内建函数" > < a href = "#6-内建函数" class = "headerlink" title = "6.内建函数" > < / a > 6.内建函数< / h2 > < p > 内建函数语法格式: < strong > < code > 变量+?+函数名称< / code > < / strong > < / p >
< p > < strong > 1、某个集合的大小< / strong > < / p >
< p > < strong > < code > ${ 集合名?size} < / code > < / strong > < / p >
< p > < strong > 2、日期格式化< / strong > < / p >
< p > 显示年月日: < code > ${ today?date} < / code > < / p >
< p > 显示时分秒:< code > ${ today?time} < / code > < / p >
< p > 显示日期+时间:< code > ${ today?datetime} < / code > < / p >
< p > 自定义格式化: < code > ${ today?string(" yyyy年MM月" )} < / code > < / p >
< p > < strong > 3、内建函数< code > c< / code > < / strong > < / p >
< p > model.addAttribute(“point”, 102920122);< / p >
< p > point是数字型, 使用${point}会显示这个数字的值,每三位使用逗号分隔。< / p >
< p > 如果不想显示为每三位分隔的数字, 可以使用c函数将数字型转成字符串输出< / p >
< p > < strong > < code > ${ point?c} < / code > < / strong > < / p >
< p > < strong > 4、将json字符串转成对象< / strong > < / p >
< p > 一个例子:< / p >
< p > 其中用到了 assign标签, assign的作用是定义一个变量。< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < #assign text=" { ' bank' :' 工商银行' ,' account' :' 10101920201920212' } " /> < / span > < br > < span class = "line" > < #assign data=text?eval /> < / span > < br > < span class = "line" > 开户行:${ data.bank} 账号:${ data.account} < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 模板代码:< / p >
< figure class = "highlight html" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > < !DOCTYPE < span class = "keyword" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > html< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > meta< / span > < span class = "attr" > charset< / span > =< span class = "string" > " utf-8" < / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > title< / span > > < / span > inner Function< span class = "tag" > < /< span class = "name" > title< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < /< span class = "name" > head< / span > > < / span > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > body< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 获得集合大小< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 集合大小:< / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 获得日期< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示年月日: < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示时分秒:< span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示日期+时间:< span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 自定义格式化: < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > hr< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "tag" > < < span class = "name" > b< / span > > < / span > 内建函数C< span class = "tag" > < /< span class = "name" > b< / span > > < / span > < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > 没有C函数显示的数值: < span class = "tag" > < < span class = "name" > br< / span > > < / span > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 有C函数显示的数值: < / span > < br > < span clas
< p > 内建函数模板页面:< / p >
< figure class = "highlight plaintext" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < span class = "line" > 40< / span > < br > < span class = "line" > 41< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < !DOCTYPE html> < / span > < br > < span class = "line" > < html> < / span > < br > < span class = "line" > < head> < / span > < br > < span class = "line" > < meta charset=" utf-8" > < / span > < br > < span class = "line" > < title> inner Function< /title> < / span > < br > < span class = "line" > < /head> < / span > < br > < span class = "line" > < body> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < b> 获得集合大小< /b> < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 集合大小:${ stus?size} < / span > < br > < span class = "line" > < hr> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < b> 获得日期< /b> < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示年月日: ${ today?date} < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示时分秒:${ today?time} < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 显示日期+时间:${ today?datetime} < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 自定义格式化: ${ today?string(" yyyy年MM月" )} < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < hr> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < b> 内建函数C< /b> < br> < / span > < br > < span class = "line" > 没有C函数显示的数值: ${ point} < br> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > 有C函数显示的数值: ${ point?c} < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < hr> < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < b> 声明变量assign< /b> < br> < / span > < br > < span class = "line" > < #assign text=" { ' bank' :' 工商银行' ,' account' :' 10101920201920212' } " /> < / span > < br > < span class = "line" > < #assign data=text?eval /> < / span > < br > < span class = "line" > 开户行:${ data.bank} 账号:${ data.account} < / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < hr> < / span > < br > < span class = "line" > < /body> < / span > < br > < span class = "line" > < /html> < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > 内建函数Controller数据模型: < / p >
< figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "meta" > @GetMapping(" innerFunc" )< / span > < / span > < br > < span class = "line" > < span class = "keyword" > public< / span > String < span class = "title function_" > testInnerFunc< / span > < span class = "params" > (Model model)< / span > { < / span > < br > < span class = "line" > < span class = "comment" > //1.1 小强对象模型数据< / span > < / span > < br > < span class = "line" > < span class = "type" > Student< / span > < span class = "variable" > stu1< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Student< / span > ();< / span > < br > < span class = "line" > stu1.setName(< span class = "string" > " 小强" < / span > );< / span > < br > < span class = "line" > stu1.setAge(< span class = "number" > 18< / span > );< / span > < br > < span class = "line" > stu1.setMoney(< span class = "number" > 1000.86f< / span > );< / span > < br > < span class = "line" > stu1.setBirthday(< span class = "keyword" > new< / span > < span class = "title class_" > Date< / span > ());< / span > < br > < span class = "line" > < span class = "comment" > //1.2 小红对象模型数据< / span > < / span > < br > < span class = "line" > < span class = "type" > Student< / span > < span class = "variable" > stu2< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Student< / span > ();< / span > < br > < span class = "line" > stu2.setName(< span class = "string" > " 小红" < / span > );< / span > < br > < span class = "line" > stu2.setMoney(< span class = "number" > 200.1f< / span > );< / span > < br > < span class = "line" > stu2.setAge(< span class = "number" > 19< / span > );< / span > < br > < span class = "line" > < span class = "comment" > //1.3 将两个对象模型数据存放到List集合中< / span > < / span > < br > < span class = "line" > List< Student> stus = < span class = "keyword" > new< / span > < span class = "title class_" > ArrayList< / span > < > ();< / span > < br > < span class = "line" > stus.add(stu1);< / span > < br > < span class = "line" > stus.add(stu2);< / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " stus" < / span > , stus);< / span > < br > < span class = "line" > < span class = "comment" > // 2.1 添加日期< / span > < / span > < br > < span class = "line" > < span class = "type" > Date< / span > < span class = "variable" > date< / span > < span class = "operator" > =< / span > < span class = "keyword" > new< / span > < span class = "title class_" > Date< / span > ();< / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " today" < / span > , date);< / span > < br > < span class = "line" > < span class = "comment" > // 3.1 添加数值< / span > < / span > < br > < span class = "line" > model.addAttribute(< span class = "string" > " point" < / span > , < span class = "number" > 102920122< / span > );< / span > < br > < span class = "line" > < span class = "keyword" > return< / span > < span class = "string" > " 04-innerFunc" < / span > ;< / span > < br > < span class = "line" > } < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< h1 id = "四-静态化测试" > < a href = "#四-静态化测试" class = "headerlink" title = "四.静态化测试" > < / a > 四.静态化测试< / h1 > < h2 id = "1-思路分析" > < a href = "#1-思路分析" class = "headerlink" title = "1.思路分析" > < / a > 1.思路分析< / h2 > < p > < img src = "/pictures/image-20230816172633599.png" alt = "image-20230816172633599" > < / p >
< h2 id = "2-实现步骤" > < a href = "#2-实现步骤" class = "headerlink" title = "2.实现步骤" > < / a > 2.实现步骤< / h2 > < p > < strong > 根据模板文件生成html文件< / strong > < / p >
< p > ①: 修改application.yml文件, 添加以下模板存放位置的配置信息, 完整配置如下: < / p >
< figure class = "highlight yaml" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "attr" > server:< / span > < / span > < br > < span class = "line" > < span class = "attr" > port:< / span > < span class = "number" > 8881< / span > < span class = "comment" > #服务端口< / span > < / span > < br > < span class = "line" > < span class = "attr" > spring:< / span > < / span > < br > < span class = "line" > < span class = "attr" > application:< / span > < / span > < br > < span class = "line" > < span class = "attr" > name:< / span > < span class = "string" > freemarker-demo< / span > < span class = "comment" > #指定服务名< / span > < / span > < br > < span class = "line" > < span class = "attr" > freemarker:< / span > < / span > < br > < span class = "line" > < span class = "attr" > cache:< / span > < span class = "literal" > false< / span > < span class = "comment" > #关闭模板缓存,方便测试< / span > < / span > < br > < span class = "line" > < span class = "attr" > settings:< / span > < / span > < br > < span class = "line" > < span class = "attr" > template_update_delay:< / span > < span class = "number" > 0< / span > < span class = "comment" > #检查模板更新延迟时间, 设置为0表示立即检查, 如果时间大于0会有缓存不方便进行模板测试< / span > < / span > < br > < span class = "line" > < span class = "attr" > suffix:< / span > < span class = "string" > .ftl< / span > < span class = "comment" > #指定Freemarker模板文件的后缀名< / span > < / span > < br > < span class = "line" > < span class = "attr" > template-loader-path:< / span > < span class = "string" > classpath:/templates< / span > < span class = "comment" > #模板存放位置< / span > < / span > < br > < / pre > < / td > < / tr > < / table > < / figure >
< p > ②: 在test下创建测试类< / p >
2024-05-10 13:32:25 +08:00
< figure class = "highlight java" > < table > < tr > < td class = "gutter" > < pre > < span class = "line" > 1< / span > < br > < span class = "line" > 2< / span > < br > < span class = "line" > 3< / span > < br > < span class = "line" > 4< / span > < br > < span class = "line" > 5< / span > < br > < span class = "line" > 6< / span > < br > < span class = "line" > 7< / span > < br > < span class = "line" > 8< / span > < br > < span class = "line" > 9< / span > < br > < span class = "line" > 10< / span > < br > < span class = "line" > 11< / span > < br > < span class = "line" > 12< / span > < br > < span class = "line" > 13< / span > < br > < span class = "line" > 14< / span > < br > < span class = "line" > 15< / span > < br > < span class = "line" > 16< / span > < br > < span class = "line" > 17< / span > < br > < span class = "line" > 18< / span > < br > < span class = "line" > 19< / span > < br > < span class = "line" > 20< / span > < br > < span class = "line" > 21< / span > < br > < span class = "line" > 22< / span > < br > < span class = "line" > 23< / span > < br > < span class = "line" > 24< / span > < br > < span class = "line" > 25< / span > < br > < span class = "line" > 26< / span > < br > < span class = "line" > 27< / span > < br > < span class = "line" > 28< / span > < br > < span class = "line" > 29< / span > < br > < span class = "line" > 30< / span > < br > < span class = "line" > 31< / span > < br > < span class = "line" > 32< / span > < br > < span class = "line" > 33< / span > < br > < span class = "line" > 34< / span > < br > < span class = "line" > 35< / span > < br > < span class = "line" > 36< / span > < br > < span class = "line" > 37< / span > < br > < span class = "line" > 38< / span > < br > < span class = "line" > 39< / span > < br > < span class = "line" > 40< / span > < br > < span class = "line" > 41< / span > < br > < span class = "line" > 42< / span > < br > < span class = "line" > 43< / span > < br > < span class = "line" > 44< / span > < br > < span class = "line" > 45< / span > < br > < span class = "line" > 46< / span > < br > < span class = "line" > 47< / span > < br > < span class = "line" > 48< / span > < br > < span class = "line" > 49< / span > < br > < span class = "line" > 50< / span > < br > < span class = "line" > 51< / span > < br > < span class = "line" > 52< / span > < br > < span class = "line" > 53< / span > < br > < span class = "line" > 54< / span > < br > < span class = "line" > 55< / span > < br > < span class = "line" > 56< / span > < br > < span class = "line" > 57< / span > < br > < span class = "line" > 58< / span > < br > < / pre > < / td > < td class = "code" > < pre > < span class = "line" > < span class = "keyword" > package< / span > com.heima.freemarker.test;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > com.heima.freemarker.FreeMarkerDemoApplication;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > com.heima.freemarker.entity.Student;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > freemarker.template.Configuration;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > freemarker.template.Template;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > freemarker.template.TemplateException;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.junit.Test;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.junit.runner.RunWith;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.beans.factory.annotation.Autowired;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.boot.test.context.SpringBootTest;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > org.springframework.test.context.junit4.SpringRunner;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "keyword" > import< / span > java.io.FileWriter;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > java.io.IOException;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > java.util.HashMap;< / span > < br > < span class = "line" > < span class = "keyword" > import< / span > java.util.Map;< / span > < br > < span class = "line" > < / span > < br > < span class = "line" > < span class = "comment" > /**< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @author< / span > Jason Gong< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @version< / span > 1.0< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @website< / span > https://qingling.icu< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Date< / span > 2023/8/16< / span > < / span > < br > < span class = "line" > < span class = "comment" > * < span class = "doctag" > @Description< / span > < /span
2023-09-22 21:57:28 +08:00
< p > ③ :运行结果< / p >
< p > < img src = "/pictures/image-20230816174550953.png" alt = "image-20230816174550953" > < / p >
2024-06-14 22:00:25 +08:00
< / article > < div class = "tag_share" > < div class = "post-meta__tag-list" > < a class = "post-meta__tags" href = "/tags/FreeMarker/" > FreeMarker< / a > < / div > < div class = "post_share" > < div class = "social-share" data-image = "/img/6.png" data-sites = "wechat,weibo,qq" > < / div > < link rel = "stylesheet" href = "/cdn/css/share.min.css" media = "print" onload = "this.media='all'" > < script src = "/cdn/js/social-share.min.js" defer > < / script > < / div > < / div > < div class = "post-reward" > < div class = "reward-button" > < i class = "fas fa-qrcode" > < / i > 打赏< / div > < div class = "reward-main" > < ul class = "reward-all" > < li class = "reward-item" > < a href = "/img/wechat.jpg" target = "_blank" > < img class = "post-qr-code-img" src = "/img/wechat.jpg" alt = "微信" / > < / a > < div class = "post-qr-code-desc" > 微信< / div > < / li > < li class = "reward-item" > < a href = "/img/alipay.jpg" target = "_blank" > < img class = "post-qr-code-img" src = "/img/alipay.jpg" alt = "支付宝" / > < / a > < div class = "post-qr-code-desc" > 支付宝< / div > < / li > < / ul > < / div > < / div > < br / > < div id = "post-comment" > < div class = "comment-head" > < div class = "comment-headline" > < i class = "far fa-comment-alt fa-fw" > < / i > < span > 评论< / span > < / div > < / div > < div class = "comment-wrap" > < div > < div id = "gitalk-container" > < / div > < / div > < / div > < / div > < / div > < div class = "aside-content" id = "aside-content" > < div class = "card-widget card-info" > < div class = "is-center" > < div class = "avatar-img" > < img src = "/img/avatar.jpg" onerror = "this.onerror=null;this.src='/img/loading.gif'" alt = "avatar" / > < / div > < div class = "author-info__name" > Jason< / div > < div class = "author-info__description" > Debug the World! < / div > < / div > < div class = "card-info-data site-data is-center" > < a href = "/archives/" > < div class = "headline" > 文章< / div > < div class = "length-num" > 60< / div > < / a > < a href = "/tags/" > < div class = "headline" > 标签< / div > < div class = "length-num" > 39< / div > < / a > < a href = "/categories/" > < div class = "headline" > 分类< / div > < div class = "length-num" > 10< / div > < / a > < / div > < a id = "card-info-btn" > < i class = "fab fa-microsoft" > < / i > < span > Ctrl + D 收藏< / span > < / a > < div class = "card-info-social-icons is-center" > < a class = "social-icon" href = "https://github.com/JasonsGong" target = "_blank" title = "Github" > < i class = "fab fa-github" > < / i > < / a > < a class = "social-icon" href = "tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=2602183349&website=www.oicqzone.com" target = "_blank" title = "QQ" > < i class = "fab fa-qq" > < / i > < / a > < a class = "social-icon" href = "mailto:2602183349@qq.com" target = "_blank" title = "Email" > < i class = "fas fa-envelope-open-text" > < / i > < / a > < a class = "social-icon" href = "https://github.com/JasonsGong?tab=repositories" target = "_blank" title = "代码仓库" > < i class = "fas fa-database" > < / i > < / a > < / div > < / div > < div class = "card-widget card-announcement" > < div class = "item-headline" > < i class = "fas fa-bullhorn fa-shake" > < / i > < span > 公告< / span > < / div > < div class = "announcement_content" > 本网站是静态网站,更新页面资源请使用Ctrl+F5;若网站内文章对你有帮助,请使用Ctrl+D收藏该网站! < / div > < / div > < div class = "sticky_layout" > < div class = "card-widget" id = "card-toc" > < div class = "item-headline" > < i class = "fas fa-stream" > < / i > < span > 目录< / span > < span class = "toc-percentage" > < / span > < / div > < div class = "toc-content is-expand" > < ol class = "toc" > < li class = "toc-item toc-level-1" > < a class = "toc-link" href = "#%E4%B8%80-FreeMarker%E4%BB%8B%E7%BB%8D" > < span class = "toc-text" > 一.FreeMarker介绍< / span > < / a > < / li > < li class = "toc-item toc-level-1" > < a class = "toc-link" href = "#%E4%BA%8C-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8" > < span class = "toc-text" > 二.快速入门< / span > < / a > < ol class = "toc-child" > < li class = "toc-item toc-level-2" > < a class = "toc-link" href = "#1-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA" > < span class = "toc-text" > 1.环境搭建< / span > < / a > < ol class = "toc-child" > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#1-1-%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAdemo%E5%B7%A5%E7%A8%8B" > < span class = "toc-text" > 1.1 创建一个demo工程< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#1-2-%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96" > < span class = "toc-text" > 1.2 引入依赖< / span > < / a > < / li > < li class = "toc-item toc-level-3" > < a class = "toc-link" href = "#1-3-%E6%B7%BB%E5%8A%A0%E9%85%8D%E7%BD%AE" >
2024-01-13 16:32:52 +08:00
function initGitalk () {
var gitalk = new Gitalk(Object.assign({
clientID: '00fb27b1e484536359c2',
clientSecret: 'be41a12281c68b6e228d1a27e8d08aeb91541145',
repo: 'BlogComment',
owner: 'JasonsGong',
admin: ['JasonsGong'],
id: 'b3a099a51a66fdd9b8bb75feb82b465c',
updateCountCallback: commentCount
},null))
gitalk.render('gitalk-container')
}
if (typeof Gitalk === 'function') initGitalk()
else {
2024-01-13 17:50:17 +08:00
getCSS('/cdn/css/gitalk.min.css')
getScript('/cdn/js/gitalk.min.js').then(initGitalk)
2024-01-13 16:32:52 +08:00
}
}
function commentCount(n){
let isCommentCount = document.querySelector('#post-meta .gitalk-comment-count')
if (isCommentCount) {
isCommentCount.textContent= n
}
}
if ('Gitalk' === 'Gitalk' || !true) {
if (true) btf.loadComment(document.getElementById('gitalk-container'), loadGitalk)
else loadGitalk()
} else {
function loadOtherComment () {
loadGitalk()
}
}< / script > < / div > < script async data-pjax src = "//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" > < / script > < div id = "local-search" > < div class = "search-dialog" > < nav class = "search-nav" > < span class = "search-dialog-title" > 搜索< / span > < span id = "loading-status" > < / span > < button class = "search-close-button" > < i class = "fas fa-times" > < / i > < / button > < / nav > < div class = "is-center" id = "loading-database" > < i class = "fas fa-spinner fa-pulse" > < / i > < span > 数据库加载中< / span > < / div > < div class = "search-wrap" > < div id = "local-search-input" > < div class = "local-search-box" > < input class = "local-search-box--input" placeholder = "搜索文章" type = "text" / > < / div > < / div > < br / > < div class = "no-result" id = "local-search-results" > < / div > < div id = "local-search-stats-wrap" > < / div > < / div > < / div > < div id = "search-mask" > < / div > < script src = "/js/search/local-search.js" > < / script > < / div > < / div > <!-- hexo injector body_end start --> < script data-pjax >
2023-09-22 21:57:28 +08:00
function butterfly_swiper_injector_config(){
2024-01-13 22:42:28 +08:00
var parent_div_git = document.getElementById('recent-posts');
2024-06-14 22:00:25 +08:00
var item_html = '< div class = "recent-post-item" style = "height: auto;width: 100%" > < div class = "blog-slider swiper-container-fade swiper-container-horizontal" id = "swiper_container" > < div class = "blog-slider__wrp swiper-wrapper" style = "transition-duration: 0ms;" > < div class = "blog-slider__item swiper-slide" style = "width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;" > < a class = "blog-slider__img" href = "posts/19306.html" alt = "" > < img width = "48" height = "48" src = "/img/1.png" alt = "" onerror = "this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;" / > < / a > < div class = "blog-slider__content" > < span class = "blog-slider__code" > 2023-04-21< / span > < a class = "blog-slider__title" href = "posts/19306.html" alt = "" > Docker容器化技术< / a > < div class = "blog-slider__text" > Docker< / div > < a class = "blog-slider__button" href = "posts/19306.html" alt = "" > 详情 < / a > < / div > < / div > < div class = "blog-slider__item swiper-slide" style = "width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;" > < a class = "blog-slider__img" href = "posts/47003.html" alt = "" > < img width = "48" height = "48" src = "/img/5.png" alt = "" onerror = "this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;" / > < / a > < div class = "blog-slider__content" > < span class = "blog-slider__code" > 2023-03-10< / span > < a class = "blog-slider__title" href = "posts/47003.html" alt = "" > 常用正则表达式大全< / a > < div class = "blog-slider__text" > 正则表达式< / div > < a class = "blog-slider__button" href = "posts/47003.html" alt = "" > 详情 < / a > < / div > < / div > < div class = "blog-slider__item swiper-slide" style = "width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;" > < a class = "blog-slider__img" href = "posts/20683.html" alt = "" > < img width = "48" height = "48" src = "/img/8.png" alt = "" onerror = "this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;" / > < / a > < div class = "blog-slider__content" > < span class = "blog-slider__code" > 2023-06-05< / span > < a class = "blog-slider__title" href = "posts/20683.html" alt = "" > Linux中开发环境的搭建< / a > < div class = "blog-slider__text" > 环境搭建< / div > < a class = "blog-slider__button" href = "posts/20683.html" alt = "" > 详情 < / a > < / div > < / div > < div class = "blog-slider__item swiper-slide" style = "width: 750px; opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;" > < a class = "blog-slider__img" href = "posts/63333.html" alt = "" > < img width = "48" height = "48" src = "/img/10.png" alt = "" onerror = "this.src=https://unpkg.zhimg.com/akilar-candyassets/image/loading.gif; this.onerror = null;" / > < / a > < div class = "blog-slider__content" > < span class = "blog-slider__code" > 2023-06-03< / span > < a class = "blog-slider__title" href = "posts/63333.html" alt = "" > 开发环境的搭建< / a > < div class = "blog-slider__text" > 环境搭建< / div > < a class = "blog-slider__button" href = "posts/63333.html" alt = "" > 详情 < / a > < / div > < / div > < / div > < div class = "blog-slider__pagination swiper-pagination-clickable swiper-pagination-bullets" > < / div > < / div > < / div > ';
2024-01-13 22:42:28 +08:00
if (parent_div_git !== null & & typeof parent_div_git !== 'undefined') {
parent_div_git.insertAdjacentHTML("afterbegin",item_html)
}
2023-09-22 21:57:28 +08:00
}
var elist = 'undefined'.split(',');
var cpage = location.pathname;
2023-10-28 10:47:20 +08:00
var epage = 'all';
2023-09-22 21:57:28 +08:00
var flag = 0;
for (var i=0;i< elist.length ; i + + ) {
if (cpage.includes(elist[i])){
flag++;
}
}
if ((epage ==='all')& & (flag == 0)){
butterfly_swiper_injector_config();
}
else if (epage === cpage){
butterfly_swiper_injector_config();
}
2024-01-13 22:10:58 +08:00
< / script > < script defer src = "https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.js" > < / script > < script defer data-pjax src = "https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper_init.js" > < / script > <!-- hexo injector body_end end --> < / body > < / html >