41、springboot 整合 FreeMarker 模版技术

41、springboot 整合 FreeMarker 模版技术

目录

springboot 整合 FreeMarker 模版技术

整合FreeMarker的自动配置:

FreeMarkerAutoConfiguration:负责整合Spring容器和获取FreeMarkerProperties加载的配置信息。

FreeMarkerServletWebConfiguration/FreeMarkerReactiveWebConfiguration:整合FreeMarker的自动配置类。

FreeMarkerProperties类则对应application.properties文件中关于FreeMarker的配置属性,它负责读取该文件并设置FreeMarker。

添加整合FreeMarker的starter:

在pom.xml文件中导入spring-boot-starter-freemarker

如要使用Bootstrap,则添加org.webjars:boostrap

如要使用版本无关的WebJar,则添加org.webjars:webjars-locator-core依赖

配置文件配置 Freemarker 的属性

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术

页面变化

FreeMarker需要在页面模板中添加自己的指令,而且表达式还要写在HTML元素中,例如下面代码

<div class=“alert alert-danger”>${error}</div> 

${error}就写在了HTML的<div…/>元素内,这就对原有HTML页面形成了污染;

Thymeleaf则只需为HTML标签中添加th:xxx属性,在模板被解析之前,这些属性会被浏览器直接忽略,因此它不会对原有HTML页面形成污染。

代码演示:

拷贝上一份  的代码,修改成 freemarker

pom.xml 和 compiler.xml 文件里面需要把名字换成新的项目名,my_freemarker.iml 文件只需要修改文件名

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术
1、修改依赖–>添加整合FreeMarker的starter
www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术
2、修改配置文件,整合freemarker 的一些配置属性
www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术
3、前端页面名字的后缀都改成 .ftlh

引入js文件的写法改变

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术


index页面

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术

main页面

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术


books页面

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术

效果也一样能出来:

www.zeeklog.com - 41、springboot 整合 FreeMarker 模版技术

具体前端代码:

index
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> <!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 --> <!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 --> <link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css"> <!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery --> <!-- 引入 jQuery 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script> <!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- 引入 popper 的 Web Jar 中的 Js 脚本 --> <script type="text/javascript" src="/webjars/popper.js/umd/popper.min.js"></script> </head> <body> <div class="container"> <img src="/logo.jpg" width="100px" height="100px" class="rounded mx-auto d-block"> <h4>用户登录</h4> <#if error?exists> <div class="alert alert-danger"}>${error}</div> </#if> <form method="post" action="/login"> <div class="form-group row"> <label for="username" class="col-sm-3 col-form-label">用户名:</label> <div class="col-sm-9"> <input type="text" id="username" name="username" class="form-control" placeholder="输入用户名"> </div> </div> <div class="form-group row"> <label for="password" class="col-sm-3 col-form-label">密码:</label> <div class="col-sm-9"> <input type="password" id="password" name="password" class="form-control" placeholder="输入密码"> </div> </div> <div class="form-group row"> <div class="col-sm-6 text-right"> <button type="submit" class="btn btn-primary">登录</button> </div> <div class="col-sm-6"> <button type="reset" class="btn btn-danger">重设</button> </div> </div> </form> </div> </body> </html> 
main
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>首页</title> <!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 --> <!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 --> <link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css"> <!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery --> <!-- 引入 jQuery 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script> <!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- 引入 popper 的 Web Jar 中的 Js 脚本 --> <script type="text/javascript" src="/webjars/popper.js/umd/popper.min.js"></script> </head> <body> <div class="container"> <img src="/logo.jpg" width="100px" height="100px" class="rounded mx-auto d-block"> <div class="text-info">您好,<span>${Session.username}</span></div> <br> 职位: <div> <#-- springboot规定获取Session对象首字母要大写 --> <#switch Session['role']> <#case 'admin'> <span>管理员</span> <#break> <#case 'manager'> <span>项目经理</span> <#break> <#default> <span>普通员工</span> </#switch> </div> <br> <br> <a href="/viewBooks" class="btn btn-info">查看图书列表</a> </div> </body> </html> 
books
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>testBranch</title> <!-- 引入css样式,用 link 元素 , stylesheet 样式单 , .gz表示是打包的,但是springboot会自动解包 --> <!-- 引入 Bootstrap 的 Web Jar 中的 CSS 样式 --> <link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css"> <!-- jquery 放在 bootstrap 前面,因为 bootstrap 需要依赖到 jquery --> <!-- 引入 jQuery 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script> <!-- 引入 Bootstrap 的 Web Jar 中的 js 脚本 --> <script type="text/javascript" src="/webjars/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- 引入 popper 的 Web Jar 中的 Js 脚本 --> <script type="text/javascript" src="/webjars/popper.js/umd/popper.min.js"></script> </head> <body> <div class="container"> <img src="/logo.jpg" width="100px" height="100px" class="rounded mx-auto d-block"> <table class="table table-hover"> <tr> <th>序号</th> <th>Id</th> <th>书名</th> <th>价格</th> </tr> <#list books as book> <tr> <td>${book_index}</td> <td>${book.id}</td> <td>${book.name}</td> <td>${book.price}</td> </tr> </#list> </table> </div> </body> </html> 

Read more

【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 目录 027  寻找数组的中心下标  1.1  算法思路:前缀和 1.2  算法实现 1.2.1  C++实现 1.2.2  Java实现 1.3  博主手记 028  除自身以外数组的乘积 2.1  算法思路 2.2  算法实现

By Ne0inhk
【数据结构与算法】指针美学与链表思维:单链表核心操作全实现与深度精讲

【数据结构与算法】指针美学与链表思维:单链表核心操作全实现与深度精讲

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、查找 * 二、指定位置之前或之后插入元素 * 2.1 在指定位置之前 * 2.2 在指定位置之后 * 三、指定位置删除或指定位置之后删除 * 3.1 在指定位置 * 3.2 指定位置之后 * 四、代码展现 * 4.1 SList.h * 4.2 SList.c * 4.3 test.c * 五、顺序表和链表的区别 * 总结与每日励志 前言

By Ne0inhk
【大数据存储与管理】分布式文件系统HDFS:07 HDFS编程实践

【大数据存储与管理】分布式文件系统HDFS:07 HDFS编程实践

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、HDFS常用命令 * 二、HDFS的Web页面 * 三、HDFS常用Java API及应用实例 * (一)常用Java API介绍 * (二)应用实例 * 总结

By Ne0inhk
详解数据结构之跳表

详解数据结构之跳表

目录 跳表的定义 跳表的演化过程 跳表的优化思路 跳表如何保证效率 跳表的时间复杂度 跳表的空间复杂度 跳表的查找 跳表的插入 跳表的删除 跳表的模拟实现 跳表与平衡搜索树及哈希表的对比 跳表的定义 跳表是由William Pugh(音译为威廉·普)发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》,跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。 跳表的演化过程 对于单链表来说,即使数据是已经排好序的,想要查询其中的一个数据,只能从头开始遍历链表,这样效率很低,时间复杂度很高,是 O(n),如下图所示。 那我们有没有什么办法来提高查询的效率呢?我们可以为链表建立一个“索引”,这样查找起来就会更快,如下图所示,我们在原始链表的基础上,每两个结点提取一个结点建立索引,我们把抽取出来的结点叫作索引层或者索引,down

By Ne0inhk