springboot_3.2_freemark_基础环境配置

springboot_3.2_freemark_基础环境配置

    • 一、前言
    • 二、环境
    • 三、相关资料
    • 四、目标
    • 五、默认配置项
    • 六、构建springboot 3.2项目
      • 6.1 pom.xml 内容:
      • 6.2 启动类
      • 6.3 添加ftlh模板
      • 6.4 controller内容
      • 6.5 bootstrap.yml配置
    • 七、总结

一、前言

FreeMarker 是一款模板引擎:即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
模板编写为FreeMarker Template Language (FTL)。它是简单的标签语言。需要在服务器端组织数据,之后通过编写FTL模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据。

注:从freemarker 2.x 开始模板的默认后缀由 ftl 改为 ftlh(配置类FreeMarkerProperties.DEFAULT_SUFFIX)。

二、环境

  • java 21
  • springboot 3.2

三、相关资料

  • freemark中文管网

四、目标

  • sprinboot 3.2 整合freemarker基础配置;
  • 加入freemarker模板;
  • 编写controller将绑定数据输出到模板中;
  • 运行测试页面;

五、默认配置项

  • jar包:spring-boot-autoconfigure-3.2.0.jar
    • 对象:org.springframework.boot.autoconfigure.freemarker.FreeMarkerProperties

六、构建springboot 3.2项目

项目是通过idea脚手架创建,由于2.x不在维护,建项目时通过服务(https://start.spring.io)只能创建springboot3.x项目,如果想要创建低版本可以使用阿里的脚手架(start.aliyun.com)。springboot3.x只支持java 17 及以上版本。所以建项目前先配置好本地的jdk。

idea脚手架服务更改位置:file/New/New Project/Sping Initializr : Server URL start.string.io ,点击后面的齿轮标记修改!

6.1 pom.xml 内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.test</groupId><artifactId>test2312</artifactId><version>0.0.1-SNAPSHOT</version><name>test2312</name><description>test2312</description><properties><java.version>21</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

6.2 启动类

其中在@SpringBootApplication注解中屏蔽了DataSourceAutoConfiguration.class的加载,目的是避免出现“
Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.”
错误提示。

因为我们目的只是验证freemarker,不需要数据库相关的依赖,所以不需要配置数据源相关配置。而springboot基础依赖中默认加载了MySQL、Oracle、Mybatis等和数据库相关的依赖包,结果我们的配置文件中却没有添加数据库相关的配置。

package com.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class
})
public class StartApplication {public static void main(String[] args) {SpringApplication.run(StartApplication.class, args);}}

6.3 添加ftlh模板

freemarker2.x开始默认的后缀由ftl改为ftlh了,使用ftl在freemarker3.x中是找不到的。
模板中对spring、list、map等常用的类型,做了绑定和遍历示例。加了个test目录是需要与后面的controller的地址一致。

模板位置:resources\templates\test\index.ftlh

<html>
<head><title>Welcome!</title>
</head>
</body><br><h1>Welcome ${user} !</h1><br><b>展示list中的数据:</b><p><ul><#list lst as item><li>${item}</li></#list></ul><ul></ul></p>
<p><b>map遍历:key值遍历</b><ul><#assign  keys=map?keys/><#list keys as key><li>key=${key}; value=${map["${key}"]};</li></#list></ul><b>map遍历:直接遍历</b><ul><#list map?keys as key><li>key=${key}; value=${map["${key}"]};</li></#list></ul><b>map遍历:直接遍历值</b><ul><#list map?values as value><li>value=${value};</li></#list></ul>
</p>
</body>
</html>

6.4 controller内容

controller中有两个方法,分别是返回text内容 和 绑定ftlh模板内容。

package com.test.controller;import lombok.extern.log4j.Log4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.View;import java.util.Arrays;
import java.util.HashMap;@Controller
@RequestMapping("/test")
public class TestController {private Logger logger = LoggerFactory.getLogger(this.getClass());@GetMapping("/hello")@ResponseBodypublic String hello(){logger.info("hello word~~~");return "hello word!";}@GetMapping("/index.html")public String index(Model model){model.addAttribute("user","joy");var lst = Arrays.asList("11","22","33");var lst4empty = new HashMap<>();var map = new HashMap<String,Object>(){{put("k1",11);}{put("k2",22);}{put("k3",33);}};model.addAttribute("lst",lst);model.addAttribute("lst4empty",lst4empty);model.addAttribute("map",map);logger.info("test index ~~~");return "/test/index";}}

6.5 bootstrap.yml配置

使用这个配置可以方便做环境切换,启动项目时传入dev这个forfile参数可以读到dev环境配置。

spring:profiles.active: ${profile:dev}application:name: test2312http:multipart:max-file-size: 2MBmax-request-size: 2MB
---
spring.profiles: dev
spring:freemarker:templateLoaderPath: classpath:/templates/preferFileSystemAccess: true  #支持热加载,默认为true(生产时false)

七、总结

以上就是一个比较基础的整合过程,需要注意的是通过idea构建时依赖尽量选择少的依赖,否则容易出现各种错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/213075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——缓冲区与实现C库的fopen,fwrite,fclose

目录 一.缓冲区 1缓冲区的概念 2.缓冲区存在的意义 3.缓冲区刷新策略 4.什么是刷新&#xff1f; C语言的缓冲区在哪里&#xff1f; ​编辑 仿写C库里的fopen&#xff0c;fclose&#xff0c;fwrite。 mystdio.h mystdio.c main.c(向文件中写入20次msg) 一.缓冲区 1…

b站pwn的学习总结

写的很乱 1.c语言的运行过程 了解了c语言需要经过以上2个过程&#xff08;编译和汇编&#xff09;&#xff0c;才能让机器按指令运行。机器只能听得懂机器码&#xff0c;所以要“汇编”。 那问题就来了&#xff0c;“编译”这个动作有啥用&#xff0c;c语言这种高级语言&…

玩转大数据10:深度学习与神经网络在大数据中的应用

目录 1. 引言&#xff1a;深度学习和神经网络在大数据中的重要性和应用场景 2. 深度学习的基本概念和架构 3. Java中的深度学习框架 3.1. Deeplearning4j框架介绍及Java编程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大数据与深度学习的结合 4.1. 大数据与深度学…

电脑端同时登录多个微信

1、建立一个txt文件 2、右击微信查看应用的属性&#xff0c;记录文件的位置 3、将步骤二得到的路径按照下方的格式输入到步骤一的文本中 4、保存之后将文本后缀名的.txt改成.bat 5、在未登录微信的情况下&#xff0c;双击即可得到两个微信登录窗口

Python高级算法——回溯法(Backtracking)

Python中的回溯法&#xff08;Backtracking&#xff09;&#xff1a;高级算法解析 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常应用于组合问题、排列问题、子集问题等。在本文中&#xff0c;我们将深入讲解Python中的回溯法&#xff0c;包括基本概念…

解决oracle.sql.TIMESTAMP序列化转换失败问题 及 J2EE13Compliant原理

目录 报错现象报错内容处理方法Oracle驱动源码总结 报错现象 oracle表中存在TIMESTAMP类型的列时&#xff0c;jdbc查出来做序列化时报错 报错内容 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframewo…

x86和ARM中配置无线网SSID和PASSWORD

提供一个可行的方法 1.准备文件 hostapd.conf &#xff1a;是用户控件的守护进程用于无线接入点&#xff08;AP&#xff09;和授权服务器&#xff08;authentication servers)&#xff0c;存放路径&#xff1a;/etc/hostapd/hostapd.conf interfacewlp5s0 drivernl80211 chan…

Java中多线程中 synchronized 锁升级的原理是什么?

Java中多线程中 synchronized 锁升级的原理是什么&#xff1f; 在 Java 中&#xff0c;synchronized 锁的升级是指在不同的场景下&#xff0c;锁的性能优化。Java 的锁有多个状态&#xff0c;主要包括偏向锁、轻量级锁和重量级锁。 偏向锁&#xff1a;当只有一个线程访问同步块…

acwing算法提高之动态规划--背包模型(三)

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1&#xff1a;潜水员。 解题思路&#xff1a;DP。 状态定义f[i][j][k]&#xff1a;从前i个物品中选&#xff0c;氧气至少为j&#xff0c;氮气至少为k的最小方案数。 状态转移&…

解决idea 通过build project 手动触发热部署失败

在debug运行项目的过程中&#xff0c;并且保证&#xff08;不添加方法&#xff0c;不修改方法名&#xff09;一定的规则的情况下&#xff0c;可以通过build project 来手动热部署项目&#xff0c;也就是会交换class文件与resouces文件。 设置项 Edit Configurations Modify Op…

计算机图形学理论(1):建模基础

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 场景的组成部分 场景相当于一个或多个模型的集合。模型包含以下内容&#xff1a; 结构描述&#xff1a;几何形状&#xff0c;如顶点、纹理坐标等表面描述&#xff1a…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 &#xff08;1&#xff09;在vite.config.js中开启 &#xff08;2&#xff09;子组件 &#xff08;3&#xff09;父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢&#xff1f;这里有这样一种场景&…

“快速排序:一种美丽的算法混沌”(1.hoare)

欢迎来到我的博客&#xff01;在今天的文章中&#xff0c;我将采用一种独特且直观的方式来探讨我们的主题&#xff1a;我会使用一幅图像来贯穿整篇文章的讲解。这幅精心设计的图表不仅是我们讨论的核心&#xff0c;也是一个视觉辅助工具&#xff0c;帮助你更深入地理解和掌握本…

学习深度强化学习---第2部分----RL动态规划相关算法

文章目录 2.1节 动态规划简介2.2节 值函数与贝尔曼方程2.3节 策略评估2.4节 策略改进2.5节 最优值函数与最优策略2.6节 值迭代与策略迭代2.7节 动态规划求解最优策略 本部分视频所在地址&#xff1a;深度强化学习的理论与实践 2.1节 动态规划简介 态规划有两种思路&#xff1…

前端 Web Workers 简介

简介 以前我们总说&#xff0c;JS 是单线程没有多线程&#xff0c;当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验&#xff0c;从而需要设置把任务放在任务队列中&#xff1b;执行任务队列中的任务也并非多线程进行的&#xff0c;然而现在 HTML5 提供了…

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值 Bundle ID这个就不说了&#xff0c;都知道是啥&#xff0c;主要说公钥信息和SHA-1值的获取 打开钥匙串访问&#xff0c;找到当前需要备案App的dis证书&#xff0c;如下&#xff1a; #####右键点击显示简介 #####可以看…

03.仿简道云公式函数实战-QLExpress初探

1. 前言 在上一篇文章中&#xff0c;我们简单介绍了一下表达式引擎&#xff0c;并引出我们的主角QLExpress.在这篇文章中&#xff0c;我们先来一个QLExpress的热身。 2. 初探QLExpress 源码地址&#xff1a;https://github.com/alibaba/qlExpress 笔者下载源码的版本是3.3.…

STL源码剖析笔记——适配器(adapters)

系列文章目录 STL源码剖析笔记——迭代器 STL源码剖析笔记——vector STL源码剖析笔记——list STL源码剖析笔记——deque、stack&#xff0c;queue STL源码剖析笔记——Binary Heap、priority_queue STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…

【Spring 基础】00 入门指南

【Spring 基础】00 入门指南 文章目录 【Spring 基础】00 入门指南1.简介2.概念1&#xff09;控制反转&#xff08;IoC&#xff09;2&#xff09;依赖注入&#xff08;DI&#xff09; 3.核心模块1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&…

php实现截取姓名中的第一个字作为头像的实战记录

php 截取中文字符串第一个字 substr 函数 在 PHP 中&#xff0c;使用 substr 函数来截取中文字符串的第一个字。由于 PHP 默认的字符编码是 UTF-8&#xff0c;它可以正确处理中文字符。 $chineseString "你好世界"; $firstChar substr($chineseString, 0, 1); e…