SpringBoot整合模板引擎Thymeleaf(5)

news2024/7/2 21:10:49

版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

概述

在这里插入图片描述
在本节教程中,我们在之前案例的基础上详细介绍利用Thymeleaf实现国际化。

项目结构

在这里插入图片描述

依赖文件

请在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>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cn</groupId>
    <artifactId>SpringBootThymeleaf01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootThymeleaf01</name>
    <description>SpringBootThymeleaf01</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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>
            </plugin>
        </plugins>
    </build>

</project>

国际化文件及其配置

在resources文件夹下创建i18n文件夹,并在该文件夹中创建多语言文件:login.properties、login_en_US.properties、login_zh_CN.properties。

其中,login.properties为默认语言配置文件,login_zh_CN.properties为中文国际化文件,login_en_US.properties为英文国际化文件。

login.properties

login.tip=请登录
login.username=用户
login.password=密码
login.rememberme=记住我
login.button=登录

login_en_US.properties

login.tip=Please sign in
login.username=username
login.password=password
login.rememberme=Remember me
login.button=Login

login_zh_CN.properties

login.tip=请登录
login.username=用户
login.password=密码
login.rememberme=记住我
login.button=登录

配置文件

请在application.properties文件添加以下配置。

# 缓存设置。开发中设置为false,线上时设置为true
spring.thymeleaf.cache=false
# 模板的编码方式
spring.thymeleaf.encoding=UTF-8
# 模式
spring.thymeleaf.mode=HTML5
# 模板页面存放路径
spring.thymeleat.prefix=classpath:/resources/templates/
# 模板页面名称后缀
spring.thymeleaf.suffix=.html
# 配置国际化文件基础名
spring.messages.basename=i18n.login

LocaleResolverImpl

在完成上一步中多语言国际化文件的编写和配置后,就可以正式在前端页面中结合Thymeleaf模板相关属性进行国际化语言设置和展示了。不过,这种实现方式默认是使用请求头中的语言信息(浏览器语言信息)自动进行语言切换的。有时候,项目还会提供手动语言切换的功能,此时需要定制区域解析器了。在项目中创建名为com.cn.config包,并在该包下创建一个用于定制国际化功能区域信息解析器的自定义配置类LocaleResolverImpl。

package com.cn.springbootthymeleaf03.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;
/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
@Configuration
public class LocaleResolverImpl implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        // 获取页面手动切换传递的语言参数language
        String language = httpServletRequest.getParameter("language");
        // 获取请求头自动传递的语言参数Accept-Language
        String header = httpServletRequest.getHeader("Accept-Language");
        Locale locale=null;
        // 如果手动切换参数不为空,就根据手动参数进行语言切换,否则默认根据请求头信息切换
        if(!StringUtils.isEmpty(language)){
            String[] strings = language.split("_");
            locale=new Locale(strings[0],strings[1]);
        }else {
            // Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
            String[] strings = header.split(",");
            String[] stringArray = strings[0].split("-");
            locale=new Locale(stringArray[0],stringArray[1]);
        }
        return locale;
    }
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, @Nullable
            HttpServletResponse httpServletResponse, @Nullable Locale locale) {
    }
    // 将自定义LocaleResolverImpl注册为Bean组件从而覆盖默认的LocaleResolver
    @Bean
    public LocaleResolver localeResolver(){
        return new LocaleResolverImpl();
    }
}

LoginController

package com.cn.springbootthymeleaf03.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Calendar;

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.csdn.net/lfdfhl
 */
@Controller
@RequestMapping("/LoginController")
public class LoginController {
    @RequestMapping("/toLogin")
    public String toLogin(Model model){
        int year = Calendar.getInstance().get(Calendar.YEAR);
        model.addAttribute("year", year);
        //跳转至login.html
        return "login";
    }
}

login.html

<!DOCTYPE html>
<!--  引入Thymeleaf命名空间 -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1,shrink-to-fit=no">
  <title>用户登录界面</title>
  <!--  通过th:href引入css -->
  <link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
  <link th:href="@{/css/signin.css}" rel="stylesheet">
</head>
<body class="text-center">
<!--  用户登录表单 -->
<form class="form-signin">
  <!--  通过th:src引入图片 -->
  <img class="mb-4" th:src="@{/img/icon.jpg}" width="72" height="72"/>
  <!--  依据国际化文件并结合th:text显示文本信息 -->
  <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">请登录</h1>
  <!--  依据国际化文件并结合th:text显示文本信息 -->
  <input type="text" class="form-control" th:placeholder="#{login.username}"/>
  <!--  依据国际化文件并结合th:text显示文本信息 -->
  <input type="password" class="form-control" th:placeholder="#{login.password}"/>
  <div class="checkbox mb-3">
    <label>
      <!--  依据国际化文件并结合input标签使用行内表达式[ [ ] ]取值 -->
      <input type="checkbox" value="remember-me"/> [[#{login.rememberme}]]
    </label>
  </div>
  <!--  依据国际化文件并结合th:text显示文本信息 -->
  <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button>
  <!--  通过th:text显示后台传递的数据year -->
  <p class="mt-5 mb-3 text-muted">© <span th:text="${year}">2030</span>-<span th:text="${year}+1">2040</span></p>
  <!--  依据国际化文件并结合th:href切换文本的显示 -->
  <a class="btn btn-sm" th:href="@{/LoginController/toLogin(language='zh_CN')}">中文</a>
  <a class="btn btn-sm" th:href="@{/LoginController/toLogin(language='en_US')}">English</a>
</form>
</body>
</html>

测试

测试地址:http://localhost:8080/LoginController/toLogin

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Android 9 蓝牙协议初始化

先讲一下Application类的使用 要使用自定义的Application&#xff0c;首先就是要自己新建一个Application的子类&#xff0c;然后把它的名字写在manifest文件里面的application标签里的android:name属性就行&#xff0c;如我的Application子类名字是BaseApplication&#xff0c…

java入门3(程序流程结构)

目录 大部分和C语言一样 顺序结构 选择结构 简单if语句 ​ 多重if结构 嵌套if结构 Switch选择结构 if和Switch嵌套 循环结构 while循环 do while 语句 for循环 break和continue break 中断指令&#xff0c;结束所在层的循环 continue:中断指令 中断本轮的循环&…

chatgpt赋能python:Python收发短信:简单可靠的解决方案

Python收发短信&#xff1a;简单可靠的解决方案 如果您需要向客户发送定期提醒或通知的短信&#xff0c;则 Python 是一种简单易用的解决方案。在本文中&#xff0c;我们将介绍如何使用 Python 发送和接收短信&#xff0c;并探讨一些流行的短信 API。 什么是短信 API&#xf…

深入分析vfio-user设备实现原理 —— Client侧

文章目录 前言数据结构protocolVFIOUserHdrvfio_user_commandVFIOUserHdr flags 设备模型VFIODeviceVFIODevIOVFIOContIO VFIOPCIDeviceVFIOKernPCIDeviceVFIOUserPCIDevice proxyVFIOUserMsgVFIOProxy 流程详解消息发松流程DMA映射流程 前言 数据结构 protocol VFIO User P…

「解析」YOLOv4模型小结

Paper Yolo v4: https://arxiv.org/abs/2004.10934 Scaled-YOLOv4: Scaling Cross Stage Partial Network Source code:https://github.com/AlexeyAB/darknet Bag of Freebies(BoF) 只增加训练成本&#xff0c;但是能显著提高精度&#xff0c;并不影响推理速度&#xff1b;数据…

Kubernetes使用Istio

Kubernetes使用Istio 1、基本概念 1.1、流量方向 南北流量&#xff08;NORTH-SOURTH-TRAFFIC&#xff09;&#xff1a;客户端到服务器之间通信的流量 东西流量(EAST-WEST-TRAFFIC)&#xff1a;指的是服务器和服务器之间的流量 1.2、Service Mesh 2、安装Istio 2.1、下载 …

【编译、链接、装载九】静态链接

【编译和链接九】静态链接 一、demo二、空间与地址分配1、相似段合并 三、即虚拟地址VMA&#xff08;Virtual Memory Address&#xff09;四、重定位1、add调用2、printf调用——同add2、shared 五、重定位表六、符号解析七、c相关问题1、重复代码消除2、全局构造与析构3、C与A…

从创建到维护:掌握package.json的最佳实践

文章目录 I. 介绍什么是package.jsonpackage.json的作用npm与package.json的关系 II. 创建package.jsonnpm init自动生成package.jsonpackage.json各个字段的含义 III. dependencies和devDependenciesdependencies和devDependencies的区别安装依赖包安装依赖包的版本更新依赖包…

Flink 学习十 FlinkSQL

Flink 学习十 Flink SQL 1. FlinkSQL 基础概念 flink sql 基于flink core ,使用sql 语义方便快捷的进行结构化数据处理的上层库; 类似理解sparksql 和sparkcore , hive和mapreduce 1.1 工作流程 整体架构和工作流程 数据流,绑定元数据 schema ,注册成catalog 中的表 table …

【C语言复习】第七篇、关于C语言关键字的知识

目录 第一部分、常见关键字 1、数据类型关键字 2、流程控制类关键字 第二部分、常用的关键字 1、typedef&#xff08;类型重定义/类型重命名&#xff09; 2、static&#xff08;易混淆const&#xff09; 2.1、static修饰局部变量 2.2、static修饰全局变量 2.3、static修饰…

9.创建provider实例

创建provider网络 controller节点 创建一个provider 网络&#xff0c;网络类型为 external 对于 provider 网络来说&#xff0c;实例通过 2 层&#xff08;桥接网络&#xff09;连接到提供商网 络。 参数说明&#xff1a; --share&#xff1a; 允许所有项目都可以使用该网络…

深度学习-【图像分类】学习笔记8 ShuffleNet

文章目录 8.1 ShuffleNet v1 v2理论讲解ShuffleNet v1ShuffleNet v2 8.2 使用Pytorch搭建ShuffleNet 8.1 ShuffleNet v1 v2理论讲解 ShuffleNet v1 论文链接&#xff1a;https://readpaper.com/paper/2963125010 Channel shuffle 相关链接&#xff1a;深度学习-【图像分类】…

车载以太网 - 传输层 - TCP/IP

目录 一、传输层基础介绍 传输层主要包括两种协议 传输层端口号 二、UDP通信 UDP协议介绍 UDP 通信特点: UDP Segment结构 UDP通信过程 三、TCP通信 TCP通信特点: TCP Segment结构 一、传输层基础介绍 传输层的寻址方式&#xff1a;端口号 包括传输层的寻址方式&…

几个SQL的高级写法

一、ORDER BY FLELD() 自定义排序逻辑 MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC&#xff0c;还可以通过 ORDER BY FIELD(str,str1,...) 自定义字符串/数字来实现排序。这里用 order_diy 表举例&#xff0c;结构以及表数据展示&#xff1a; ORDER BY FIELD(str,str1,..…

chatgpt赋能python:Python支持跨平台软件开发

Python支持跨平台软件开发 作为一种高级编程语言&#xff0c;Python 以其丰富的库和跨平台支持而备受开发人员欢迎。Python 通过将应用程序的可移植性最大化&#xff0c;使得开发人员可以轻松地在不同的操作系统平台上构建和部署软件。 跨平台支持 Python 支持各种不同的操作…

三子棋都玩过吧,那C语言现造一个呢???

目录 前言 三子棋简介 棋盘介绍 规则介绍 程序设计 基本流程 游戏逻辑 菜单界面打印 创建棋盘并初始化 打印棋盘 玩家落子 电脑落子 判断胜负 1.判定是否和棋 2.判定胜负 代码总汇 ✅Game.h 头文件 ✅Game.c ✅Test.c 前言 &#x1f970;想必各位大佬们上学的…

编译安装以及升级Nginx

目录 一、前言 1、简介 2、 Nginx模块 3、与Apache的差异 4、优点 二、编译安装 1、关闭防火墙 2、安装依赖包 3、创建运行用户与组 4、编译安装 5、检测配置文件是否正确 6、添加系统服务 三、版本升级 四、总结 一、前言 1、简介 Nginx是一个高性能的HTTP和反…

chatgpt赋能python:Python散点图连线——一种美妙的可视化方法

Python散点图连线——一种美妙的可视化方法 散点图连线是一种常用的可视化方法&#xff0c;可以展示不同维度之间的关系和趋势。在Python中&#xff0c;我们可以使用多种库来绘制散点图连线&#xff0c;例如matplotlib、seaborn和plotly等。本文将介绍如何使用matplotlib和plo…

数学公式库mathjs 安装使用教程

Math.js 是个JavaScript 和 Node.js 的扩展数学库。它包括了灵活的表达式解析器&#xff0c;提供数字&#xff0c;大数值&#xff0c;复杂数值&#xff0c;单位&#xff0c;矩阵等等集成的解决方案。Math.js 很强大又易于使用。 特性 支持数值&#xff0c;大数值&#xff0c…

医疗IT绝缘监测应用

近年来&#xff0c;随着医疗技术的迅猛发展&#xff0c;电子电气相关医疗设备在医院中的应用越来越广泛&#xff0c;各类疾病治疗也越来越依赖医疗电气设备 。人们对医院医疗环境提出更高要求&#xff0c;传统的建筑、电气等设计已难以充分保障其人身安全。患者及医务人员已深陷…