这是不是可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面

Posted

技术标签:

【中文标题】这是不是可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面【英文标题】:Is this possible to inject html code in utf-8 encoding to html page using thymeleaf and spring这是否可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面 【发布时间】:2020-12-27 01:58:50 【问题描述】:

最近我决定尝试使用 Spring MVC 学习 Thymeleaf。目前我正在存储 html 正文片段,例如 img、iframe 等。在使用带有 UTF-8 编码和西里尔符号的 thymeleaf 标签将这些 html 片段注入一个通用 html 页面后,问题就出现了。更准确地说,这些 html 片段来自 Spring 控制器的 Model 属性。是否可以仅将片段注入到一个通用 html 页面中,如下所示:

<html xmlns:th="https://www.thymeleaf.org">
<head></head>
<body>
[($contents)] <!-- contents is that fragment I want to inject -->
</body>
</html>

Controller的请求方法如下图:

    @GetMapping("/getArticle/id")
public String getArticle(@PathVariable Long id, Model model) throws IOException 
    Article article = articleService.getById(id);
    String contents = new String(Files.readAllBytes(Paths.get(article.getText())));
    model.addAttribute("contents", contents);
    return "news//article";

内容插入片段示例:

<h1>Кириллица</h1>
<br/><iframe style='width: 30%; height: 35%;' src='link'></iframe><br/>
Классный видос, да?

The result of combining 2 previous lists gives me this

正如我之前提到的,我遇到了一些问题,我有一些曲线符号而不是俄罗斯符号。另外,我应该注意,在没有注入的正常页面加载的情况下,所有的俄语符号都会正确显示。 Spring 配置中有我的 ViewResolver 和 TemplateResolver:

@Bean
public SpringResourceTemplateResolver templateResolver() 
    SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setApplicationContext(applicationContext);
    templateResolver.setPrefix("/WEB-INF/views/");
    templateResolver.setSuffix(".html");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCacheable(true);
    return templateResolver;


@Bean
public ThymeleafViewResolver viewResolver() 
    ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
    thymeleafViewResolver.setCharacterEncoding("UTF-8");
    thymeleafViewResolver.setContentType("text/html; charset=UTF-8");
    return thymeleafViewResolver;

那么,接下来的问题是:这是否可以直接注入从控制器接收的 html 代码作为属性,使用具有正确 UTF-8 编码且不带曲线符号的 thymeleaf 标签?

【问题讨论】:

【参考方案1】:

你可以这样做,但你至少需要改变这一行:

String contents = new String(Files.readAllBytes(Paths.get(article.getText())));

到这里:

String contents = Files.readString(Paths.get(article.getText()), StandardCharsets.UTF_8);

这使用带有java.nio.charset.StandardCharsets.UTF_8 字符集的readString() 方法。否则,来自readAllBytes() 的字节将被写入一个可能是其他(非 UTF-8)编码的字符串 - 可能取决于 JVM 在启动时拾取的默认字符集。

但是,为了学习 Thymeleaf,我建议您查看 Thymeleaf fragments(如果您还没有这样做的话),因为这些都是为此目的而设计的。

这将引导您进入template layouts,它具有很大的灵活性。

【讨论】:

非常感谢。问题是我在读取文件时没有设置 UTF-8 编码。可能,我应该尝试调试应用程序,但我有点懒惰,认为模板视图存在一些问题,但我的 Java 代码没有。另外,谢谢你的建议,学习百里香的布局和片段,我显然必须学习它)

以上是关于这是不是可以使用 thymeleaf 和 spring 以 utf-8 编码将 html 代码注入 html 页面的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + MyBatis + Thymeleaf实现简单留言板应用

Spring Boot + MyBatis + Thymeleaf实现简单留言板应用

SpringBoot--Thymeleaf入门使用

(Spring,Thymeleaf)如何使用模型内的模型列表向控制器“POST”请求?

此应用程序没有显式映射 /error,因此您将其视为后备。春季启动中的Thymeleaf解析异常

使用 Spring Security 通过 MySQL-LDAP-Thymeleaf 登录