IntelliJ+SpringBoot项目实战(29)--如何将Beetl的模板文件放在独立的文件目录

news2025/1/4 20:02:06

        在实际的项目开发中,为了方便前端人员调试页面,所以有必要将Beetl的模板文件放在独立的目录下,方便前端人员维护,而不是打包到项目的jar包中,如果打包到项目的jar包中还有另外的问题,就是一改动页面就要重新打包部署,这样对于运维而言比较麻烦,增加运维的工作量。

      在Beetl官网有个BeetlConf的例子,我们复制过来稍加修改:

package org.openjweb.core.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.beetl.core.resource.ClasspathResourceLoader;
import org.beetl.core.resource.FileResourceLoader;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.beetl.ext.spring.BeetlSpringViewResolver;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class BeetlConf {

    //@Value("${beetl.templatesPath}") String templatesPath;//模板根目录 ,比如 "templates"
    String templatesPath = "templates";//这个给类定义使用的
    @Value("${beetl.fileTemplatesPath:}") String fileTemplatesPath;//模板根目录 ,比如 "templates",,加:确保没配置此参数时启动不会报异常
    String templateFilePath = "";
    @Bean(name = "beetlConfig")
    public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {
        BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
        //获取Spring Boot 的ClassLoader
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        if(loader==null){
            loader = BeetlConf.class.getClassLoader();
        }
        log.info("当前指定的Beetl模板文件路径:"+String.valueOf(fileTemplatesPath));
        //beetlGroupUtilConfiguration.setConfigProperties(extProperties);//额外的配置,可以覆盖默认配置,一般不需要

        if(StringUtils.isNotEmpty(fileTemplatesPath)){
            log.info("使用文件模版路径...........");
            FileResourceLoader floader = new FileResourceLoader(fileTemplatesPath);
            beetlGroupUtilConfiguration.setResourceLoader(floader);
        }
        else{
            log.info("使用类模版路径...........");
            ClasspathResourceLoader cploder = new ClasspathResourceLoader(loader,  templatesPath);
            beetlGroupUtilConfiguration.setResourceLoader(cploder);
        }

        beetlGroupUtilConfiguration.init();
        //如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoader
        beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);
        return beetlGroupUtilConfiguration;

    }

    @Bean(name = "beetlViewResolver")
    public BeetlSpringViewResolver getBeetlSpringViewResolver(@Qualifier("beetlConfig") BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
        BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
        beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
        beetlSpringViewResolver.setOrder(0);
        beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration);
        return beetlSpringViewResolver;
    }


}

        在官方示例的代码中,默认是建一个ClasspathResourceLoader,现在我们不使用ClasspathResourceLoader,改为使用FileResourceLoader。在上面的代码中,FileResourceLoader使用配置文件中的模板文件路径templatesPath,在application-dev.yml中设置本地主机中的路径:

beetl:
  suffix: html
  fileTemplatesPath: D:/tmp/beetl/templates

        上面的fileTempaltesPath是自定义的变量。不是Beetl官方设置。

然后我们在上篇文章中的BeetlDemoController测试类中增加一个新的测试方法:

//http://localhost:8001/demo/beetl/demofile


    @RequestMapping(value="/demofile")

    public String demofile( Model model) {

        CommUser user = new CommUser();
        user.setRealName("张三");
        user.setUserEmail("abc@163.com");
        List<CommUser> list = new ArrayList<>();
        list.add(user );

        user = new CommUser();

        user.setRealName("李四");
        user.setUserEmail("lisi@163.com");
        list.add(user );


        model.addAttribute("users", list);
        return "b2c/beetlDemo3.html";//返回页面名
    }

        在上面的代码中,指定的页面是b2c/beetlDemo3.html,在配置中因为我们指定了模板文件的根目录是d:\tmp\beetl,所以文件的实际位置是D:\tmp\beetl\templates\b2c,因为在实际项目开发中,我们需要按照不同子系统的页面存放在不同的目录,所以b2c是存放电商系统的页面,里面还可以根据需要再建更多的子目录,比如个人中心pcenter目录,登录login目录等。我们将上节介绍的beetlDemo3.html复制到D:\tmp\beetl\templates\b2c,然后修改下内容稍作区分,

        启动springboot,访问http://localhost:8001/demo/beetl/demofile ,可以看到指定目录的页面可以正常访问,这时修改的beetlDemo3.html的内容可以看到实时修改的内容,不用重新打包SpringBoot。

        注意,如果不需要指定单独的文件目录,可以不使用BeetlConf,将BeetlConf类注解的@Configuration注释掉即可。因为BeetlConf中根据fileTemplatesPath是否为空来判断是使用类路径加载还是文件路径加载,所以如果不使用文件路径加载,也可以注释掉application-dev.yml中的fileTemplatesPath。因为注解使用了${beetl.fileTemplatesPath:},注解末尾加冒号确保yml中如果没有配置此参数,启动时也不会报异常。

        项目完整示例代码见github:

https://github.com/openjweb/cloud/tree/mastericon-default.png?t=O83Ahttps://github.com/openjweb/cloud/tree/master

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

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

相关文章

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好&#xff0c;年轻的学徒&#xff01;&#x1f9d1;‍&#x1f4bb; 是时候踏上进入Java开发世界的史诗之旅了&#xff0c;我们的得力助手将是强大的IntelliJ IDEA。准备好了吗&#xff1f;出发吧&#xff01; 在我们开始之前&#xff0c;我们需要下载这个工具。但是&#…

GWAS分析先做后学

大家好&#xff0c;我是邓飞。 GWAS分析是生物信息和统计学的交叉学科&#xff0c;上可以学习编程&#xff0c;下可以学习统计。对于Linux系统&#xff0c;R语言&#xff0c;作图&#xff0c;统计学&#xff0c;机器学习等方向&#xff0c;都是一个极好的入门项目。生物信息如…

LeetCode—189. 轮转数组(中等)

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例1&#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3输出:[5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步:[6,7,1,2,3,4,5] 向…

ModelScope-Agent(1): 基于开源大语言模型的可定制Agent系统

目录 简介快速入门 简介 github地址 快速入门 看前两篇&#xff0c;调用千问API和天气API # 选用RolePlay 配置agent from modelscope_agent.agents.role_play import RolePlay # NOQArole_template 你扮演一个天气预报助手&#xff0c;你需要查询相应地区的天气&#x…

go语言的成神之路-标准库篇-fmt标准库

目录 一、三种类型的输出 print&#xff1a; println&#xff1a; printf&#xff1a; 总结&#xff1a; 代码展示&#xff1a; 二、格式化占位符 %s&#xff1a;用于格式化字符串。 %d&#xff1a;用于格式化整数。 %f&#xff1a;用于格式化浮点数。 %v&#xff1…

pyenv 安装脚本解读

pyenv 安装脚本 curl https://pyenv.run | bash执行上面这一行脚本就可以安装pyenv来满足你对 Python 多版本共存以及切换的支持。 pyenv搭配virtualenv可以满足你对Python虚拟环境版本的支持。个人感觉pyenv比conda更轻量&#xff0c;更推荐使用。 那么上面的脚本到底干了什…

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调&#xff08;RFT&#xff09;&#xff1a;推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究&#xff1a;基因突变…

柯桥职场商务英语生活英语口语培训外贸纺织口语学习

"等一下"该怎么说&#xff1f; 大家应该都知道&#xff0c;wait a moment是一个祈使句&#xff0c;祈使句就难免带有命令的口吻&#xff0c;还有点不耐烦。 如果你把“等一下”说成wait a moment&#xff0c;外国人多半认为你是个傲慢无礼的人。毕竟在他们看来wait a…

嵌入式蓝桥杯学习7 产生PWM

Cubemx配置 打开cubemx&#xff0c;前面的配置看上文&#xff0c;这里主要配置定时器产生PWM波。 以PA1的TIM2-CH2通道为例进行演示。 1.在Timers中打开TIM2,将Channel2配置为PWM Generation CH2。 2.将Clock Source 选择为Internal Clock。 3.配置Paramater Settings中的参…

SQL Server中SELECT (Transact-SQL)语法定义和解释

语法定义&#xff1a; <SELECT statement> ::[ WITH { [ XMLNAMESPACES , ] [ <common_table_expression> [ , ...n ] ] } ]<query_expression>[ ORDER BY <order_by_expression> ][ <FOR Clause> ][ OPTION ( <query_hint> [ , ...n ] )…

证书监控续签工具

详细实现方式以及代码下载请前往https://www.passerma.com/article/91 一个基于 go 的 ssl 证书监控续签工具&#xff0c;用于监控阿里云免费 ssl 证书的有效期&#xff0c;并在证书即将过期时自动续签证书 仅支持续签阿里云的免费证书 页面 使用方法 1.申请阿里云账号 2.…

【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

HDR视频技术之六:色调映射

图像显示技术的最终目的就是使得显示的图像效果尽量接近人们在自然界中观察到的对应的场景。 HDR 图像与视频有着更高的亮度、更深的位深、更广的色域&#xff0c;因此它无法在常见的普通显示器上显示。 入门级的显示器与播放设备&#xff08;例如普通人家使用的电视&#xff0…

【C++笔记】map和set的使用

前言 各位读者朋友们大家好&#xff01;上期我们讲完了二叉搜索树这一数据结构&#xff0c;这一期我们来讲STL中的map和set这两大容器。这两个容器的底层是红黑树&#xff0c;红黑树的底层是平衡二叉搜索树。 目录 前言一. 序列式容器和关联式容器二. set系列的使用2.1 set类…

DevOps持续集成

DevOps流程 第一步安装git 关闭防火墙 systemctl stop firewalld cd /usr/loacl vim docker-compose.yml docker search gitlab 拉取gitlab镜像 2.33GB docker pull gitlab/gitlab-ce:latestvim docker-compose.yml修改docker-compose.yml version: 3.1 services:gitlab:i…

TCP的“可靠性”(上)

目录 TCP的“可靠性”&#xff08;上&#xff09;确认应答&#xff08;可靠性传输的基础&#xff09;超时重传连接管理&#xff08;三次握手&#xff0c;四次挥手&#xff09; TCP的“可靠性”&#xff08;上&#xff09; 想必大家都或多或少的听说过TCP的特性&#xff1a;有连…

【C++】求第二大的数详细解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;输入描述&#x1f4af;解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…

Linux图形化工具推荐

1、MobaXterm MobaXterm Xserver with SSH, telnet, RDP, VNC and X11 - DownloadFree X server for Windows with tabbed SSH terminal, telnet, RDP, VNC and X11-forwarding - Downloadhttps://mobaxterm.mobatek.net/download.html 2、FinalShell FinalShell SSH工具,服…

SQL计算字段:拼接字段

为了说明如何使用计算字段&#xff0c;本文将通过一个简单的示例来展示如何将两列组合成一个标题。假设Vendors表包含供应商的名称和国家信息&#xff0c;我们希望生成一个报表&#xff0c;其中列出每个供应商的名称和所在国家&#xff0c;并且需要格式化名称显示&#xff0c;国…

【Spring项目】表白墙,留言板项目的实现

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;项目实现准备 1&#xff1a;需求 2&#xff1a;准备工作 &#xff08;1&#xff09;…