Thymeleaf 预处理表达式__${表达式}__使用案例

news2024/12/26 21:08:33

目录

  • 一. 前期准备
    • 1.1 国际化项目获取类
    • 1.2 国际化配置文件类
    • 1.3 项目配置文件
    • 1.4 国际化资源文件
  • 二. `__${表达式}__`预处理表达式
    • 2.1 在Thymeleaf中使用Spring的Bean
    • 2.2 通过#{}获取国际化资源
    • 2.3 预处理表达式`__${表达式}__`的使用
  • 三. 效果
  • 四. 表格案例


一. 前期准备

1.1 国际化项目获取类

  • 缓存数据库查询到的国际化资源文件
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

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

@Component
public class ThymeleafMsgPreProcess implements InitializingBean {

    // 中文项目缓存
    private final static Map<String, String> msgCh = new HashMap<>();

    // 日文项目缓存
    private final static Map<String, String> msgJP = new HashMap<>();

    // 可以在此处进行数据库查询国际化项目的操作
    @Override
    public void afterPropertiesSet() throws Exception {

        // 清空所有的国际化项目
        msgCh.clear();
        msgJP.clear();

        // 模拟从数据库获取数据 -> 中文
        msgCh.put("E001", "香蕉");
        msgCh.put("E002", "苹果");

        // 模拟从数据库获取数据 -> 日语
        msgJP.put("E001", "バナナ");
        msgJP.put("E002", "リンゴ");
    }

    // 获取中文项目
    public String getChMsgByCode(String code) {
        String msg = msgCh.get(code);
        if (ObjectUtils.isEmpty(msg)) {
            return "";
        }

        return msg;
    }

    // 获取日文项目
    public String getJpMsgByCode(String code) {
        String msg = msgJP.get(code);
        if (ObjectUtils.isEmpty(msg)) {
            return "";
        }

        return msg;
    }
}

1.2 国际化配置文件类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;

@Configuration
public class InternationalConfig implements WebMvcConfigurer {

    // 默认解析器,用来设置当前会话默认的国际化语言
    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        // 指定当前项目的默认语言是中文
        sessionLocaleResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
        return sessionLocaleResolver;
    }

    // 默认拦截器,用来指定切换国际化语言的参数名
    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor() {

        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        /*
            设置国际化请求参数为language
            设置完成之后,URL中的 ?language=zh 表示读取国际化文件messages_zh.properties
         */
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }
    
    // 将我们自定义的国际化语言参数拦截器放入Spring MVC的默认配置中
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

1.3 项目配置文件

spring:
  messages:
    basename: i18n/messages
    encoding: UTF-8

1.4 国际化资源文件

@Bean名称.方法名(参数)可以在Thymeleaf的HTML中调用Java中的Bean类

⏹messages_zh.properties

# 在中文资源文件中获取中文项目
item.text=@thymeleafMsgPreProcess.getChMsgByCode({0})

⏹messages_ja.properties

# 在日文资源文件中获取日文项目
item.text=@thymeleafMsgPreProcess.getJpMsgByCode({0})

二. __${表达式}__预处理表达式

预处理是在普通表达式执行之前的执行的表达式,预处理表达式执行之后的结果会再作为普通表达式要执行的内容被普通表达式再处理一遍,最终渲染到页面上。


2.1 在Thymeleaf中使用Spring的Bean

我们在后台定义了国际化项目获取类ThymeleafMsgPreProcess,并将其放入了Spring的Bean中,因此可以在前台这样使用

<div>
	[[${@thymeleafMsgPreProcess.getChMsgByCode('E001')}]]
</div>

渲染之后

<div>
	香蕉
</div>

2.2 通过#{}获取国际化资源

<div>
    [[#{item.text('E001')}]]
</div>

⏹渲染之后,可以看到直接把资源文件中的信息原封不动的展示在页面上

在这里插入图片描述

也就是说,如果能先通过 #{} 来将获取国际化资源的表达式渲染出来,再通过 ${} 执行国际化资源获取,就可以直接展示国际化资源了

2.3 预处理表达式__${表达式}__的使用

__${表达式}__会预先进行处理,得到@thymeleafMsgPreProcess.getChMsgByCode(E001)
然后再通过${}指定普通的表达式处理,最终就可以得到效果

<div th:with="itemCode='E001'">
    [[${__#{item.text(itemCode)}__}]]
</div>

渲染之后

<div>
	香蕉
</div>

需要注意的是,如果我们打算直接将Code写死到HTML中的话,不能这么写

<div>
    [[${__#{item.text('E001')}__}]]
</div>

而是要使用|字符串拼接|这样的写法,否则无法正确传参

<div>
    [[${__#{item.text(|'E001'|)}__}]]
</div>

三. 效果

<div th:with="itemCode='E001'">
    [[${__#{item.text(itemCode)}__}]]
</div>

<div>
    [[${__#{item.text(|'E001'|)}__}]]
</div>

在这里插入图片描述

四. 表格案例

⏹实体类

import lombok.Data;
import java.util.List;

@Data
public class Test16Form {

    private List<TestBean> beanList;
}

@Data
public class TestBean {

    private Integer fromAge;

    private Integer toAge;

    private Integer fromDate;

    private Integer toData;
}

⏹Controller层

@Controller
@RequestMapping("/test16")
public class Test16Controller {

    @Resource
    private HttpServletRequest request;

    @GetMapping("/init")
    public ModelAndView init() {
		
		// 准备测试数据
        TestBean testBean1 = new TestBean();
        testBean1.setFromAge(1);
        testBean1.setToAge(2);
        testBean1.setFromDate(2021);
        TestBean testBean2 = new TestBean();
        testBean2.setFromAge(11);
        testBean2.setToAge(22);
        testBean2.setFromDate(2022);
        ArrayList<TestBean> testBeans = new ArrayList<>();
        testBeans.add(testBean1);
        testBeans.add(testBean2);
		
		// 放入实体类中
        Test16Form test16Form = new Test16Form();
        test16Form.setBeanList(testBeans);

        // 返回到页面中
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("test16");
        modelAndView.addObject("entity", test16Form);
        return modelAndView;
    }
}

⏹Thymeleaf页面

  • th:id="fromAge__${state.index}__"th:id="|toAge${state.index}|"的作用相同
  • 第1种写法中,使用预处理表达式__${表达式}__先将 ${state.index} 处理为下标,也就是说变成了th:id="fromAge0",然后使用th:id渲染为id="fromAge0"
  • 第2种写法中,使用字符串拼接的方法处理为th:id="toAge0",然后使用th:id渲染为id="toAge0"
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div th:object="${entity}">
    <table border="1">
        <tr>
            <th>年龄from</th>
            <th>年龄to</th>
        </tr>
        <th:block th:each="bean,state: *{beanList}">
            <tr>
                <td th:id="fromAge__${state.index}__">[[${bean.fromAge}]]</td>
                <td th:id="|toAge${state.index}|">[[${bean.toAge}]]</td>
            </tr>
        </th:block>
    </table>
</div>
</body>
</html>

⏹渲染之后

在这里插入图片描述

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

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

相关文章

图神经网络 # GNN基础(干货版)

注意&#xff1a;本篇文章不是系统性的图神经网络或者图深度学习的入门教程&#xff0c;而是介绍如何入门图神经网络的学习指南以及相关的干货笔记&#xff0c;文中会列出一些视频和文章学习资料&#xff0c;并在本文作一些重点的摘要&#xff0c;读者需要自行前往文本超链接的…

【C语言】通讯录《信息写到文件版本》

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

非零基础自学Golang 第9章 结构体 9.5 结构体方法

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.5 结构体方法9.5.1 指针类型接收者9.5.2 值类型接收者第9章 结构体 9.5 结构体方法 Go语言中&#xff0c;一个方法就是一个包含了接收者的函数。 对于结构体方法&#xff0c;接收者可以是结构体类型的值或是指针…

【图像融合】对比度增强结合多尺度边缘保持分解红外与可见光图像融合【含Matlab源码 1886期】

⛄一、对比度增强结合多尺度边缘保持分解红外与可见光图像融合简介 1 引言 夜视成像技术在军事与执法领域&#xff0c;如监控&#xff0c;侦查&#xff0c;情报搜集和安保等方面有着重要应用。不同类型的夜视成像传感器在记录同一场景时&#xff0c;在其提供的信息中有部分是冗…

目标检测论文解读复现【NO.21】基于改进YOLOv7的小目标检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

Java项目:基于SSM的高校运动会管理系统的设计与实现

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该高校运动会信息管理系统是以B/S架构为设计基础并基于SSM框架开发的系统。系统采用了Java语言和MySQL数据库来实现。 系统按预定的算法完成了创…

数据结构---删去k个数字后的最小值

删去k个数字后的最小值思路贪心算法JAVA实现1JAVA实现2给出一个整数&#xff0c;从该整数中去掉k个数字&#xff0c;要求剩下的数字形成的新整数尽可能小。应该如何选取被去掉的数字&#xff1f; 其中整数的长度大于或等于k&#xff0c;给出的整数的大小可以超过long类型的数字…

计算机毕业设计 基于HTML+CSS+JavaScript 大气的甜品奶茶美食餐饮文化网页设计与实现23页面

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

Java+SSM房屋租赁系统房屋出租房产(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;jQuery 、JSP 数据库&#xff1a;MySQL 系统功能 系统分为前台用户界面和后台系统管理&#xff1a; 1.前台用户界面 用户注册、用户登录、用户中心、浏览房源、房源…

代码随想录训练营第54天|休息日 小结

打家劫舍系列 198. 打家劫舍对于当前的房间&#xff0c;无非就两种选择&#xff1a;偷与不偷。如果当前房间偷&#xff0c;那么前一个房间就不偷&#xff0c;即dp[i] dp[i-2] nums[i]&#xff1b;如果当前房间不偷&#xff0c;那么dp[i] dp[i-1]&#xff0c;因此递推公式为…

ch3_1_多进程的概念

1. CPU 的管理 CPU的工作原理&#xff1a; 从内存中取出程序的指令&#xff0c; 执行程序中的指令&#xff1b; 1.1 多道程序 假设A 程序运行时&#xff0c; 遇到 IO 处理时&#xff0c; 为了能够执行A 程序的后续指令&#xff0c; 正常情况下 cpu 需要等待着IO 处理完成&am…

后端快速学习VUE(一):VUE入门

个人博客地址 http://xiaohe-blog.top/ 文章目录1. 简介2. 基本使用2.1 引入Vue2.2 基本使用2.3 总结 &#xff1a;3. v-text、v-html指令的使用4. v-on : 事件绑定4.1 事件的三要素&#xff1a;4.2 v-on的基本使用4.3 v-on获取vue实例this4.4 事件绑定简化写法5. 常用指令5.1 …

useRef 源码解读

文章目录useRef 源码解读mountRefupdateRefref 的生命周期&#xff08;工作流程&#xff09;总结&#xff1a;render 阶段commit 阶段总述具体阐述safelyDetachRefcommitAttachRefuseRef 源码解读 由于 string 类型的 ref 已不推荐使用&#xff0c;所以只针对 function &#…

论文复现-1:bertscore

Bertscore是计算相似度的一种方法。 遗留问题&#xff1a;使用model layer 中的单一层 还是多个层&#xff0c;会对结果造成很大的影响吗&#xff1f; sent_encode函数是使用tokenizer将句子做encode。 tokenizer.encode( sent, add_special_tokensTrue, add_prefix_spaceTrue,…

HTML与CSS基础

2022.12.12 程序员在前端写完代码之后通过浏览器的渲染和解析成为用户看到的网页 浏览器出品的公司不同&#xff0c;内部的渲染引擎也不同。导致解析相同代码时的速度、性能、效果也不同 相同的前端网页在不同浏览器中运行的的结果也可能不同 WEB的三大标准 HTML包含页面内…

Java+MySQL基于SSM的智能办公管理系统

随着时代的发展,人们越来越来希望通过简单方便快捷的方式来进行办公,通过自能办公系统可以实现在线办公,这种办公模式脱离了传统纸质办公很多困扰,在实现现代化的同时提高了办公的效率。 本智能办公管理系统采用JAVA语言来进行开发,用小巧灵活的MySQL数据库做完后台存储解释。本…

痞子衡职场经验与感悟分享 - 索引

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。本系列痞子衡给大家分享的是职场经验与见闻感悟。 痞子衡在嵌入式行业也摸打滚爬了不少年&#xff0c;有一些个人经验可以给大家参考。所谓他山之石可以攻玉&#xff0c;希望痞子衡的经验对大家的职场之路有所帮…

jsp+ssm计算机毕业设计电影影评网【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

java基础的综合运用

文章目录前言一.类的设计书籍类书架类用户类二.行为的规范2.1 增加书籍2.2展示所有书籍2.3查找书籍2.4 删除书籍2.5 归还书籍2.6 借阅书籍2.7 退出系统三.测试类的方法四.项目的目录前言 在我们学习完面向对象的知识之后&#xff0c;我们就要运用相关知识去实现一个图书管理系…

十六进制转Ascii脚本(包含\x处理)

目录 1.前言 2.十六进制转换脚本(包含处理\x) 1.前言 在以前玩CTF的时候,会遇到十六进制编码,特别是带\x的那种,网上虽然也有在线解密网站,但是对于\x解码不是特别友好。 2.十六进制转换脚本(包含处理\x&#