【问题标题】:Render a fragment of a html in Thymeleaf from an external server从外部服务器渲染 Thymeleaf 中的 html 片段
【发布时间】:2019-04-29 06:12:17
【问题描述】:

我的 Spring Boot 项目中有我的主页,名为 home.html。我有一个页面控制器来呈现这个home.html。下面是控制器的代码。

@RequestMapping(value = "/home")
public String goToHome(Model model) {
    return "home";
}

在我的项目中,home.html 位于 webapp/WEB-INF/static/ 文件夹中。所以路径是webapp/WEB-INF/static/home.html

我的home.html 如下所示

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/html">
<head>
     <title>home</title>
</head>
<body>
    <object th:include="/en/home :: home-body" th:remove="tag"/>
</body>
</html>

我在外部服务器中有home.html 文件,如下所示。

<div th:fragment="home-body">
    <p>Welcome to home page</p>
</div>

这个文件的路径是http://external-server.com/fragments/en/home.html

我想要做的是渲染这个从外部服务器获取的home-body 片段部分,该片段部分位于位于 Spring Boot Tomcat 服务器中的 home.html 内。

我添加了下面的 Bean 作为配置来获取这个 home-body 片段。下面是它的代码。

@Bean
    public UrlTemplateResolver urlTemplateResolver(){
        UrlTemplateResolver urlTemplateResolver = new UrlTemplateResolver();
        boolean isCmsContentEnable = Boolean.parseBoolean( env.getProperty( ConfigurationConstants.CMS_CONTENT_ENABLE ) );
        if( isCmsContentEnable )
        {
            urlTemplateResolver.setPrefix( "http://external-server.com/fragments/" );
            urlTemplateResolver.setSuffix( ".html" );
            urlTemplateResolver.setCharacterEncoding( "UTF-8" );
            urlTemplateResolver.setTemplateMode( "HTML5" );
            urlTemplateResolver.setCacheable( false );
            urlTemplateResolver.setOrder(10);
        }
        return urlTemplateResolver;
    }

现在,当我尝试转到主页时,会发生什么而不是渲染驻留在 Spring Boot Tomcat 服务器中的 home.html 内的 home-body 片段,而是直接渲染驻留在外部服务器中的 home.html。

我该如何解决这个问题?谁能指出我在这里做错了什么。谢谢

【问题讨论】:

    标签: java html spring spring-boot thymeleaf


    【解决方案1】:

    使用thymeleafTemplateResolver 和urlTemplateResolver 作为模板解析器创建SpringTemplateEngine。

       @Bean public ThymeleafViewResolver thymeleafViewResolver()
    {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine( templateEngine() );
        return viewResolver;
    }
    
    @Bean public SpringTemplateEngine templateEngine()
    {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        Set<ITemplateResolver> templateResolvers = new HashSet();
        templateResolvers.add( thymeleafTemplateResolver() );
        templateResolvers.add( urlTemplateResolver() );
        templateEngine.setTemplateResolvers( templateResolvers );
    
        return templateEngine;
    }
    
    @Bean public SpringResourceTemplateResolver thymeleafTemplateResolver()
    {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setPrefix( "/WEB-INF/static/" );
        templateResolver.setSuffix( ".html" );
        templateResolver.setTemplateMode( "HTML5" );
        templateResolver.setOrder( 2 );
        return templateResolver;
    }
    
    @Bean public UrlTemplateResolver urlTemplateResolver()
    {
        UrlTemplateResolver urlTemplateResolver = new UrlTemplateResolver();
        urlTemplateResolver.setCharacterEncoding( "UTF-8" );
        urlTemplateResolver.setTemplateMode( "HTML5" );
        urlTemplateResolver.setCacheable( false );
        urlTemplateResolver.setOrder( 3 );
        return urlTemplateResolver;
    }
    

    然后像这样访问外部模板。

     <div th:include="http://banner.server.com/myBanner.html :: fragmentName">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多