Thymeleaf 未在页面上显示正确的字符串,但从模型中正确打印

Posted

技术标签:

【中文标题】Thymeleaf 未在页面上显示正确的字符串,但从模型中正确打印【英文标题】:Thymeleaf not displaying correct string on page but prints correctly from model 【发布时间】:2020-07-07 18:48:15 【问题描述】:

我正在尝试创建一个网页,该网页根据用户的位置以不同的语言显示文本。为此,我使用属性文件和要以每种语言显示的字符串,并将它们作为资源包加载,然后将这些字符串添加到模型中,以便我可以在 Thymeleaf 中访问它们。这是我的代码:

@Controller
public class IndexController 

    @GetMapping("/")
    public String index(Model model, Locale locale) 
        ResourceBundle rb = ResourceBundle.getBundle("lang/index", locale);
        addResourceBundleToModel(model, rb);
        System.out.println(model.getAttribute("test2"));
        return "index";
    

    private void addResourceBundleToModel(Model model,
                                          ResourceBundle resourceBundle) 
        for (String key : resourceBundle.keySet()) 
            model.addAttribute(key, resourceBundle.getString(key));
        
    

还有百里香文件:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <a th:text ="#test2"></a>
</body>
</html>

当我加载页面并将model.getAttribute("test2") 打印到控制台时,我得到了我想要的字符串,即“abc”作为测试字符串。但是“abc”没有显示在浏览器中,而是我得到??test2_en_US??。我的代码有什么问题?如何让它在浏览器上显示“abc”?另外,我尝试使用@RestController 注释并返回model.getAttribute("test2").toString(),这样我就可以在浏览器上显示“abc”,但我无法让它与 Thymeleaf 一起使用。

【问题讨论】:

【参考方案1】:

你需要在你的配置类的某个地方为你的资源注册一个bean(比如你的资源文件夹中的messages.properties),如下所示:

@Bean
public MessageSource messageSource() 
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setCacheSeconds(10);
    messageSource.setBasename("classpath:messages");
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;

在你的messages.properties 文件中输入类似这样的键值:

welcome.text=Welcome to Thymeleaf Layouts with SpringBoot

在您看来,在某处简单地写下类似的内容:

<h1 th:text="#welcome.text"></h1>

尚未尝试您的代码。但是您可以查看here 的工作示例。我刚刚在我的 html 中添加了 message.properties 和 th:text 标签。

【讨论】:

由于某种原因没有工作...即使从参数中删除区域设置我仍然得到相同的字符串。或者一起删除该代码并仅使用默认值,而不设置路由仍然打印相同的字符串 按照我提到的步骤后,尝试从控制器索引方法的主体中删除所有内容,除了 - return “index”;然后分享结果。 我认为问题出在其他地方,因为即使根本没有代码,只有带有模型的控制器,它仍然具有相同的输出。我尝试完全删除所有文件,所以没有任何属性或任何东西的痕迹,只有控制器和 html,并使用 model.addAttribute("test", "test string"); 手动向模型添加了一个属性,仍然在浏览器上得到 ??test_en_US??【参考方案2】:

我发现了问题。问题出在我的 index.html 文件中。我没有使用带有# 的&lt;a th:text ="#test2"&gt;&lt;/a&gt;,而是将其更改为带有美元符号的&lt;a th:text ="$test2"&gt;&lt;/a&gt;。这解决了问题,现在它正在呈现正确的字符串。

【讨论】:

以上是关于Thymeleaf 未在页面上显示正确的字符串,但从模型中正确打印的主要内容,如果未能解决你的问题,请参考以下文章

jquery 事件按钮显示正确的响应,但视图未在 django 中正确呈现

特色图片未在 Google+ 信息中正确显示

SVG 图像未在 Chrome 上加载(有时)

Bootstrap-Vue 分页未在屏幕上显示更新的切片数组内容

Django 应用程序未在管理页面中显示注册模型

推送通知未在 android 上显示