IntelliJ+SpringBoot项目实战(28)--整合Beetl模板框架

news2025/2/25 0:23:33

        在前面的文章里介绍过freemarker,thymeleaf模板引擎,本文介绍另一个性能超高的模板引擎---Beetl,据说此模板引擎的性能远超Freemarker。官网的说法是,Beetl 远超过主流java模板引擎性能(引擎性能5-6倍于FreeMarker,2倍于JSP。参考附录),而且消耗较低的CPU。

        官方网站是:

DocumentDescriptionicon-default.png?t=O83Ahttp://ibeetl.com/guide/#/beetl        这个网站上有详细的示例。想深入学习的话可在此网站上下载资料。

        那么为什么有时候我们需要考虑使用模板引擎呢?使用VUE做前后端分离的前端不可以吗?使用模板引擎的主要场景是内容类网站,希望HTML正文能够对爬虫友好的,或者说内容能够直接呈现在html元素中,而不是通过接口动态赋值给页面元素的。

       本文介绍Beetl快速上手的过程。

一、引入依赖

        在openjweb-core模块中引入beetl依赖



    <dependency>
         <groupId>com.ibeetl</groupId>
         <artifactId>beetl-framework-starter</artifactId>
         <version>1.2.28.RELEASE</version>
    </dependency>

二、开发测试类

        在openjweb-sys工程中建一个BeetlDemoController.java:

package org.openjweb.sys.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.HashMap;
import java.util.Map;

/**
 * http://localhost:8001/demo/beetl/queryBook
 */
@Controller
@RequestMapping(value="/demo/beetl/")
public class BeetlDemoController {

    @RequestMapping(value="/queryBook")

    public String queryBook( Model model) {


        Map<String,Object> map = new HashMap();
        map.put("name", "三国演义");
        map.put("author", "罗贯中");

        model.addAttribute("book", map);
        return "beetlDemo.btl";//返回页面名
    }
}

         这段代码创建了一个Map,map中含name,author,然后设置给book变量返回给前端的beetlDemo.btl页面。

        然后在openjweb-sys的resources/templates下建一个beetlDemo.btl文件:

        

<!DOCTYPE HTML>
<html>
<head>
    <title>图书</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

</head>

<body>
<table border="1">
    <tr>
        <td>book</td>
        <td>author</td>
    </tr>

    <tr>
        <td>${book.name}</td>
        <td>${book.author}</td>
    </tr>
</table>
</body>
</html>

        文件中使用了${book.name}和${book.author}两个变量。

        运行http://localhost:8001/demo/beetl/queryBook :

        但是在实际项目中,如果把前端制作好的.html文件再改成扩展名.btl的话,会耗费时间,另外也不利于实时查看页面展示效果。所以还是使用.html后缀比较方便一点。如果使用.html后缀,可在application-dev.yml中增加:

beetl:
  suffix: html

        注意不是在spring节点下增加的,后缀html也不带. 别写成.html ,这个是实测过的。改成html后缀后,上面的beetlDemoController.java中的return  "beetlDemo.btl" ;改为return  "beetlDemo.html" ;即可。注意如果去掉.html会解析失败,所以需要写完整的文件名。改为解析.html后,.btl的解析就不支持了。

        经过测试,beetl改为解析.html后,并不影响thymeleaf解析前面章节示例中的页面。另外以后项目主要还是使用beetl作为模板引擎。

 二、beetl基础语法

        如果完整学习beetl基础语法可查看官方资料:DocumentDescriptionicon-default.png?t=O83Ahttp://ibeetl.com/guide/#/beetl/all     这里介绍常用的语法,beetl的语法有点类似javascript,也有点类似jsp,可以使用<%%>来书写beetl脚本。我们创建一个测试html,命名为beetlDemo3.html:

<!DOCTYPE HTML>
<html>
<head>
    <title>图书2</title>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>

</head>

<body>


<%
var a = 2;
var b = 3;
var result = a+b;
%>
hello 2+3=${result}<p>

    <!--rotate-->
    <%
    for(user in users){
    %>
    hello,${user.realName},your email is ${user.userEmail} ;
    <% } %>

</body>
</html>

        然后在控制层中再增加一个测试方法,这个测试方法返回用户列表,然后在前端展示:

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

    /**
     * 演示beetl语法
     * @param model
     * @return
     */
    @RequestMapping(value="/demo")

    public String demo( 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 "beetlDemo3.html";//返回页面名
    }

        上面的代码创建了2个用户,放到users变量中返回给beetleDemo3.html,在beetleDemo3.html中,使用

  <%
    for(user in users){
    %>
    hello,${user.realName},your email is ${user.userEmail} ;
    <% } %>

        循环显示users中的realName和userEmail,运行效果:

另外

<%
var a = 2;
var b = 3;
var result = a+b;
%>

hello 2+3=${result}<p>

演示了在html中书写动态脚本,有点类似jsp和javascript。 

另外我们还可以使用beetl的逻辑表达式if,在beetlDemo3.html的</body>前加上下面的代码:

   <%
    var aa = 1;
    var bb="good";
    var cc = null;

    if(aa==1&&bb=="good"&&cc==null){
     %>
    <script>alert('符合条件')</script>
    <%
    }
    else{%>
    <script>alert('不符合条件')</script>

    <%
    }
    %>

运行效果:

还有其他常用的语法,下面是for的表达式:

<% var a = [1,2,3]; for(var i=0;i<a.~size;i++){ print(a[i]); } %>

下面是while循环:

<% var i = 0; while(i<5){ print(i); i++; } %>

其他语法就不再一一列举了。大家可以在使用的过程中根据需要来学习更多的语法。

本例代码见github:

GitHub - openjweb/cloud at masterOpenJWeb is a java bases low code platform. Contribute to openjweb/cloud development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/openjweb/cloud/tree/master

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

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

相关文章

全面解析DApp开发中的智能合约设计

在DApp的开发过程中&#xff0c;智能合约的设计起到了至关重要的作用。智能合约是运行在区块链上的程序&#xff0c;负责处理和执行DApp中的逻辑、交易和数据存储。下面我们将深入探讨智能合约的设计原则、挑战和优化方法&#xff0c;帮助开发者掌握如何设计高效、安全的智能合…

利用Grounding DINO进行自动标注——目标检测任务——YOLO格式

关于Grounding DINO的环境搭建可以参考我的以前的博客&#xff0c;链接如下所示 如何在Linux上离线部署Grounding DINO-CSDN博客 这个博客主要来介绍如何利用Grounding DINO这个项目去进行目标检测的自动化标注。并且给出了相关的代码已经实验验证。 1.数据集准备 2. 开始实…

1.使用docker 部署redis Cluster模式 集群3主3从

1.使用docker 部署redis Cluster模式 集群3主3从 1.1 先安装docker 启动docker服务&#xff0c;拉取redis镜像 3主3从我们要在docker启动6个容器docker run --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-…

开发类似的同款小程序系统制作流程

很多老板想要开发一款和别人家类似的同款小程序系统&#xff0c;但是不知道该怎么开发制作&#xff0c;本文就为大家详细介绍一下开发类似的同款小程序的流程为大家做参考。 一、前期准备找到对标小程序&#xff1a;首先&#xff0c;需要找到你想要模仿的同款小程序&#xff0…

Jenkins凭据管理及使用详解

简介:Jenkins凭据管理是指对Jenkins中存储的敏感信息进行管理的功能,这些信息通常用于认证和授权,以确保Jenkins能够安全地与其他系统和服务进行交互。以下是关于Jenkins凭据管理添加及作用的详细介绍: 一、Jenkins凭据管理的添加 进入凭据管理页面: 登录Jenkins后,点击…

车载VR可视化解决方案

车载VR可视化解决方案是通过融合跟踪用户头部运动的特殊预测算法与惯性测量数据而开发的。该系统将大范围虚拟现实跟踪技术与IMU传感器相结合&#xff0c;为VR和AR应用打造了一套全面的运动跟踪与渲染流程&#xff0c;极大地方便了虚拟现实头显制造商定制可视化流程。 该车载VR…

鸿蒙实现数据管理

目录&#xff1a; 1、鸿蒙实现数据管理的三种方式2、用户首选项3、键值型数据管理3.1、获取KVManager实例&#xff0c;用于管理数据库对象3.2、创建并获取键值数据库3.3、调用put()方法向键值数据库中插入数据3.4、调用get()方法获取指定键的值3.5、调用delete()方法删除指定键…

【环境搭建】WordPress本地部署搭建及历史版本插件安装(windows系统)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【环境搭建】WordPress本地部署搭建及历史版本插件安装&#xff08;windows系统&#xff09; WordPress搭建环境部署&#xff08;…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!

文章链接&#xff1a;https://arxiv.org/pdf/2411.18623 项目链接&#xff1a;https://lift3d-web.github.io/ 亮点直击 提出了Lift3D&#xff0c;通过系统地提升隐式和显式的3D机器人表示&#xff0c;提升2D基础模型&#xff0c;构建一个3D操作策略。 对于隐式3D机器人表示&a…

详解MySQL安装

目录 Ubantu 1. 使⽤apt安装MySQL 2.查看MySQL状态 3. MySQL 安装安全设置 4.设置密码 卸载MySQL Centos 1. 确认当前的系统版本 2.下载MySQL源 3.安装MySQL 4.启动mysqld 5.查看MySQL状态 6.设置开机自启动 7.查看MySQL密码&#xff0c;并登录 8.修改密码 Ubant…

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法&#xff1a; interrupt()方法是设置结束阻塞(sleep、)&#xff0c;并且设置中断标记true isInterrupted()判断当前是否中断 静态方法&#xff1a; Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好&#xff0c;既然上面的方法作用是清晰的&…

[Python学习日记-70] 元类

[Python学习日记-70] 元类 简介 什么是元类 关键字 class 创建类的流程分析 自定义元类控制类的创建 自定义元类控制类的调用 自定义元类的属性查找 自定义元类的应用与练习 简介 在上一篇章当中我们已经了解了面向对象的各种内置函数了&#xff0c;本篇我们将讲述“元类…

【前端】浏览器输入url到页面呈现发生了什么?

前言 在此总结记录下浏览器输入url到页面呈现期间的流程。 浏览器输入url发生了什么&#xff1f; 从浏览器地址栏上输入url到页面渲染主要分为以下流程&#xff1a; 解析请求url&#xff0c;建立连接发送请求浏览器渲染页面 在输入url地址后&#xff0c;浏览器识别输入的是…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

&#x1f31d;引言 近年来&#xff0c;云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇&#xff0c;其中云电脑作为一种虚拟化桌面解决方案&#xff0c;逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求&#xff0c;云电脑通过为用户提供随…

Windows中MySQL8.3.4 MSI版本——详细安装教程

一、下载MySQL安装文件。 下载地址&#xff1a;MySQL官网 进入后点击下面的MySQL社区版下载 点击MySQL Comunity Server。 我这里选择的是版本8.4.3LTS版本&#xff0c;在线对应的msi文件。 点击No thanks,直接下载。 二、安装MySQL 2.1、双击刚刚下载好的msi文件&#xff0c;…

Appium:安装uiautomator2失败

目录 1、通过nmp安装uiautomator2&#xff1a;失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2&#xff1a;失败 我先是通过npm安装的uiautomator2&#xff0c;也显示已经安装成功了&#xff1a; npm install -g …

计算机网络-IPSec VPN基本概念

企业分支之间经常有互联的需求&#xff0c;企业互联的方式很多&#xff0c;可以使用专线线路或者Internet线路。部分企业从成本和需求出发会选择使用Internet线路进行互联&#xff0c;但是使用Internet线路存在安全风险&#xff0c;如何保障数据在传输时不会被窃取&#xff1f;…

【Linux】环境ChatGLM-4-9B 模型之 openai API 服务

一、摘要 最近看到 Function Call 比较感兴趣,它的核心是赋予大模型能够调用外部API的能力,能够解决大模型功能扩展性问题,允许模型调用外部数据库或API,提供特定领域的详细信息;解决信息实时性问题,模型可以实时获取最新数据;解决数据局限性问题,大模型训练数据虽多但…

实践教程|Transformer Decoder-Only 模型批量生成 Trick

导读 本文给出了一个用单Transformer decoder&#xff08; GPT&#xff09;模型进行批量生成时的解决方法。 发现用单 Transformer decoder &#xff08;Aka GPT&#xff09;模型进行生成时&#xff0c;因为位置对齐等问题&#xff0c;进行批量生成时十分麻烦。 训练时&#…