【问题标题】: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 标签?

【问题讨论】:

    标签: java spring spring-boot model-view-controller 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 代码没有。另外,谢谢你的建议,学习百里香的布局和片段,我显然必须学习它)
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多