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 文件中。我没有使用带有# 的<a th:text ="#test2"></a>
,而是将其更改为带有美元符号的<a th:text ="$test2"></a>
。这解决了问题,现在它正在呈现正确的字符串。
【讨论】:
以上是关于Thymeleaf 未在页面上显示正确的字符串,但从模型中正确打印的主要内容,如果未能解决你的问题,请参考以下文章
jquery 事件按钮显示正确的响应,但视图未在 django 中正确呈现