SpringBoot项目实战(41)--Beetl网页使用自定义函数获取新闻列表

        在Beetl页面中可以使用自定义的函数从后台新闻列表中获取新闻数据展示到页面上。例如我们可以从后台新闻表中获取新闻按照下面的格式展示:

 <li><a href="#">东亚非遗展即将盛妆亮相 揭起盖头先睹为快</a></li><li><a href="#">上海之春国际音乐节启幕在即 凸显“一带一路”时代主题</a></li>

   使用Beetl自定义函数时,我们需要在后台实现一个类,继承Beetl的Function,见下面的代码:

package org.openjweb.core.service;import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.beetl.core.Context;
import org.beetl.core.Function;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
@Slf4j
public class BeetlService implements Function {public List<Map<String,Object>> getCateInfoListDemo(String treeCode ){List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map = new HashMap<>();map.put("infTitle","国庆节来了"+treeCode);map.put("infUrl","http://www.sohu.com");map.put("Image","");list.add(map);map = new HashMap<>();map.put("infTitle","2025年春节放假通知"+treeCode);map.put("infUrl","http://www.sohu.com");map.put("Image","");list.add(map);return list;}@Overridepublic Object call(Object[] objects, Context context) {if(objects.length>1){log.info("第二个参数pageNo:"+String.valueOf(objects[1]));}if(objects.length>2){log.info("第三个参数pageSize:"+String.valueOf(objects[2]));}if(1==2) {return this.getCateInfoListDemo((String )objects[0]);}else {log.info("传入的栏目编码为:::::");log.info(String.valueOf(objects[0]));return this.getCateInfoList((String) objects[0], 1, 10);}}public Object getCateInfoList(String treeCode ,int pageNo,int pageSize){HttpRequest request = HttpRequest.get("http://localhost:8001/api/cms/pub/getCateInfoList?treeCode="+treeCode+"&pageNo="+pageNo+"&pageSize="+pageSize);HttpResponse response = request.execute();String result = response.body();log.info("请求返回的内容:");log.info(result);return JSONArray.parseArray(result) ;}}

        在上面的代码中,call方法接收Beetl网页前端传入的参数,参数分别是栏目编码、页面、每页行数,然后调用this.getCateInfoListDemo((String )objects[0]); 这个是个简单的示例,封装了2条Map数据返回给前端页面。

        另外需要在以前的BeetlConf中注册函数,我们就把BeetlService类作为一个函数,下面是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.openjweb.core.service.BeetlService;
import org.springframework.beans.factory.annotation.Autowired;
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;
import org.springframework.web.context.WebApplicationContext;@Configuration
@Slf4j
public class BeetlConf {@Autowiredprivate WebApplicationContext wac;//@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 的ClassLoaderClassLoader 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();//如果使用了优化编译器,涉及到字节码操作,需要添加ClassLoaderbeetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(loader);//注册国际化函数beetlGroupUtilConfiguration.getGroupTemplate().registerFunction("i18n", new I18nFunction(wac));//注册cms相关的方法beetlGroupUtilConfiguration.getGroupTemplate().registerFunction("cmsUtil",new BeetlService());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;}}

        注意在上面的代码中,将BeetlService注册为一个名为cmsUtil 的函数:

 beetlGroupUtilConfiguration.getGroupTemplate().registerFunction("cmsUtil",new BeetlService());

    然后在前端页面(D:\tmp\beetl\templates\cms\site\wenhua\china.html)中,使用下面的代码来调用后台BeetlService函数(此函数传入3个参数,在后台的call方法中通过Object[]参数接收):

<%for(item in cmsUtil("001001",1,10)){
%><li><a href="${item.infUrl}">${item.infTitle}</a></li>
<% }
%>

测试: http://localhost:8001/front/china

显示效果,在界面上显示了BeetlService中的演示数据:

另外如果调用后台新闻表cms_info的新闻,在BeetlService中使用了

public Object getCateInfoList(String treeCode ,int pageNo,int pageSize){HttpRequest request = HttpRequest.get("http://localhost:8001/api/cms/pub/getCateInfoList?treeCode="+treeCode+"&pageNo="+pageNo+"&pageSize="+pageSize);HttpResponse response = request.execute();String result = response.body();log.info("请求返回的内容:");log.info(result);return JSONArray.parseArray(result) ;}

因为在OpenJweb工程中,openjweb-cms内容管理模块是依赖openjweb-core模块,所以在openjweb-core模块里的BeetlService中,如果调用CMS的API方法,不能直接引用openjweb-cms的Service类,只能通过Http的方式调用openjweb-cms里的API接口(/api/cms/pub/getCateInfoList

),这里通过Hutool进行了get调用。下面是CmsInfoV3Api的获取栏目信息接口代码:

package org.openjweb.cms.api;import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.openjweb.cms.entity.CmsInfo;
import org.openjweb.cms.module.params.CmsInfoParam;
import org.openjweb.cms.service.CmsInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@Api(tags = "内容管理V3")
@Slf4j
@RestController
@RequestMapping("/api/cms/pub")
public class CmsInfoV3Api {@Autowiredprivate CmsInfoService cmsInfoService;@RequestMapping("/getCateInfoList")public List<CmsInfo> getCateCmsInfo(String treeCode, int pageNo, int pageSize){log.info("getCateInfoList传入的参数:");log.info(treeCode);log.info(String.valueOf(pageNo));log.info(String.valueOf(pageSize));CmsInfoParam param = new CmsInfoParam();param.setPage(pageNo);param.setPageSize(pageSize);param.setCateTreeCode(treeCode);List<CmsInfo> list = this.cmsInfoService.queryList(param);if(list!=null&&list.size()>0){//${myService.sayHello('World')}log.info("查询到栏目的信息......");}else{log.info("没查到栏目下的信息.....");}return list;//List<CmsInfo> cmsInfo}
}

在SpringSecurity中,配置/api/cms/pub为免登录可以访问。我们在BeetlService中改为调用这个接口:

if(1==2) {return this.getCateInfoListDemo((String )objects[0]);
}
else {log.info("传入的栏目编码为:::::");log.info(String.valueOf(objects[0]));return this.getCateInfoList((String) objects[0], 1, 10);
}

上面的代码调用this.getCateInfoList,然后重新运行SpringBoot,访问http://localhost:8001/front/china:

上面是从cms_info表获取的新闻列表的标题。

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

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

相关文章

从零开始开发纯血鸿蒙应用之多签名证书管理

从零开始开发纯血鸿蒙应用 一、前言二、鸿蒙应用配置签名证书的方式1、自动获取签名证书2、手动配置签名证书 三、多签名证书配置和使用四、多证书使用 一、前言 由于手机操作系统&#xff0c;比电脑操作系统脆弱很多&#xff0c;同时&#xff0c;由于手机的便携性&#xff0c…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

系统看门狗配置--以ubuntu为例

linux系统配置看门狗 以 ubuntu 系统配置看门狗为例 配置看门狗使用的脚本文件&#xff0c;需要使用管理员权限来执行&#xff1a; 配置是&#xff1a;系统每 30S 喂一次狗&#xff0c;超过 60S 不进行投喂&#xff0c;就会自动重启。 1. 系统脚本内容&#xff1a; #!/bin/b…

opencv的NLM去噪算法

NLM&#xff08;Non-Local Means&#xff09;去噪算法是一种基于图像块&#xff08;patch&#xff09;相似性的去噪方法。其基本原理是&#xff1a; 图像块相似性&#xff1a;算法首先定义了一个搜索窗口&#xff08;search window&#xff09;&#xff0c;然后在该窗口内寻找…

Docker运维高级容器技术知识点总结

1、虚拟机部署和容器化部署的区别是什么&#xff1f; 1、技术基础&#xff1a; <1>.虚拟化技术在物理硬件上创建虚拟机&#xff0c;每台虚拟机运行自己完整的操作系统、从而实现资源隔离。 <2>.容器化技术&#xff1a;将应用程序打包在容器内&#xff0c;在进程空间…

双模充电桩发展前景:解锁新能源汽车未来的金钥匙,市场潜力无限

随着全球能源转型的浪潮席卷而来&#xff0c;新能源汽车行业正以前所未有的速度蓬勃发展&#xff0c;而作为其坚实后盾的充电基础设施&#xff0c;特别是双模充电桩&#xff0c;正逐渐成为推动这一变革的关键力量。本文将从多维度深入剖析双模充电桩的市场现状、显著优势、驱动…

python3GUI--大屏可视化-传染病督导平台 By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件组成&开发心得1.样式&使用方法2.左侧表格实现3.设计4.学习5.体验效果 四&#xff0e;代码分享1.环形渐变进度组件2.自定义图片的背景组件 五&#xff0e;总结 大小&#xff1a;60.9 M&#xff0c;软件…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

ffmpeg aac s16 encode_audio.c

用ffmpeg库时&#xff0c;用代码对pcm内容采用aac编码进行压缩&#xff0c;出现如下错误。 [aac 000002bc5edc6e40] Format aac detected only with low score of 1, misdetection possible! [aac 000002bc5edc8140] Error decoding AAC frame header. [aac 000002bc5edc81…

深度学习的原理和应用

一、深度学习的原理 深度学习是机器学习领域的一个重要分支&#xff0c;其原理基于多层神经网络结构和优化算法。以下是深度学习的核心原理&#xff1a; 多层神经网络结构&#xff1a;深度学习模型通常由多层神经元组成&#xff0c;这些神经元通过权重和偏置相互连接。输入数据…

mv指令详解

&#x1f3dd;️专栏&#xff1a;计算机操作系统 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 主要功能 常用选项详解 1. 移动文件或目录 2. 重命名文件或目录 3. -i&am…

5 分布式ID

这里讲一个比较常用的分布式防重复的ID生成策略&#xff0c;雪花算法 一个用户体量比较大的分布式系统必然伴随着分表分库&#xff0c;分机房部署&#xff0c;单体的部署方式肯定是承载不了这么大的体量。 雪花算法的结构说明 如下图所示: 雪花算法组成 从上图我们可以看…

怎么实现Redis的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【怎么实现Redis的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 怎么实现Redis的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性&#xff0c;我们需要保证在发…

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…

H266/VVC 帧内预测中 ISP 技术

帧内子划分 ISP ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理&#xff0c;在 VTM8 中完整展示算法。ISP是线基内预测&#xff08;LIP&#xff09;模式的更新版本&#xff0c;它改善了原始方法在编码增益和复杂度之间的权衡&#xff0c;ISP 算法的核心原理就是利用较近的像…

了解npm:JavaScript包管理工具

在JavaScript的生态系统中&#xff0c;npm&#xff08;Node Package Manager&#xff09;无疑是一个举足轻重的存在。它不仅是Node.js的包管理器&#xff0c;更是前端开发不可或缺的一部分&#xff0c;为开发者提供了丰富的包资源、便捷的包管理以及强大的社区支持。本文将深入…

CNN Test Data

由于数据量过大&#xff0c;打不开了 搞一组小的吧。收工睡觉 https://download.csdn.net/download/spencer_tseng/90256048

协同过滤算法商品推荐系统|Java|SpringBoot|VUE|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SpringBoot、Mybatis-Plus、VUE、jquery,html 5⃣️…

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器&#xff08;DMA_CCRx&#xff09; DMA中断状态寄存器&#xff08;DMA_ISR&#xff09; DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09; DMA通道x传输…

Routine Load 导入问题处理指南

Routine Load 导入问题处理指南 在使用 Apache Doris 的 Routine Load 时&#xff0c;你是否曾经被各种奇奇怪怪的问题卡住&#xff1f;今天就来分享一些最常见的 Routine Load 问题&#xff0c;并提供相应的解决方案&#xff0c;让你快速应对&#xff0c;高效解决&#xff01;…