Thymeleaf 3和Tiles2集成

Thymeleaf 3是否以某种方式支持Tiles 2?我有一个用于Thumeleaf 2.xx的程序包,thymeleaf-extras-

tiles2-spring4但正如我现在所看到的,由于org.thymeleaf.dialect.AbstractDialect类的更改,它不兼容

Caused by: java.lang.NoSuchMethodError: org.thymeleaf.dialect.AbstractDialect: method <init>()V not found

[INFO] at org.thymeleaf.extras.tiles2.dialect.TilesDialect.<init>(TilesDialect.java:46)

我是否需要等待此集成的更新才能从T3开始?

有什么方法可以模拟Thymeleaf3中的图块

我只会将Tiles用于此类情况:

  <definition name="portal/**" template="layouts/portal">

<put-attribute name="_head" value="/portal/{1} :: _head"/>

<put-attribute name="content" value="/portal/{1} :: content"/>

</definition>

回答:

为了解决该问题,我创建了一个代理SpringTemplateEngine和建议TemplateEngine.process()方法。

基于模板路径的代码映射布局,例如:

portal/moje_konto/moje_dane

映射到布局

 LAYOUTS_PATH/portal

此外,它传递变量VIEW,其中包含指向实际模板的路径

在内部布局中,它可以用来包含特定的片段。非常简单的门户布局可能看起来像这样:

<!DOCTYPE html SYSTEM "about:legacy-compat">

<html lang="pl" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.springframework.org/security/tags">

<body>

<div th:replace="${'portal/' + VIEW} :: content">Content</div>

</body>

</html>

@PreAuthorize("isAuthenticated()")

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Model model) {

return "portal/home/index";

}

public class LayoutTemplateEngine implements ITemplateEngine, MessageSourceAware, InitializingBean {

private final Logger logger = Logger.getLogger(this.getClass().getName());

private final String LAYOUTS_PATH = "layouts/";

private final SpringTemplateEngine templateEngine = new SpringTemplateEngine();

@Override

public void process(TemplateSpec templateSpec, IContext context, Writer writer) {

String template = templateSpec.getTemplate();

logger.info("Rendering template: " + template);

if (context instanceof WebExpressionContext) {

int end = template.indexOf("/");

if (end != -1) {

// change template

templateSpec = new TemplateSpec(LAYOUTS_PATH + template.substring(0, end), templateSpec.getTemplateSelectors(), templateSpec.getTemplateMode(), templateSpec.getTemplateResolutionAttributes());

// add VIEW variable

((WebExpressionContext)context).setVariable("VIEW", template.substring(end + 1));

}

}

templateEngine.process(templateSpec, context, writer);

logger.info("Rendering finished");

}

public void setTemplateResolver(final ITemplateResolver templateResolver) {

templateEngine.setTemplateResolver(templateResolver);

}

public void setEnableSpringELCompiler(final boolean enableSpringELCompiler) {

templateEngine.setEnableSpringELCompiler(enableSpringELCompiler);

}

public void addDialect(final IDialect dialect) {

templateEngine.addDialect(dialect);

}

public void addTemplateResolver(final ITemplateResolver templateResolver) {

templateEngine.addTemplateResolver(templateResolver);

}

@Override

public IEngineConfiguration getConfiguration() {

return templateEngine.getConfiguration();

}

@Override

public String process(String template, IContext context) {

return process(new TemplateSpec(template, null, null, null), context);

}

@Override

public String process(String template, Set<String> templateSelectors, IContext context) {

return process(new TemplateSpec(template, templateSelectors, null, null), context);

}

@SuppressWarnings("resource")

@Override

public String process(TemplateSpec templateSpec, IContext context) {

final Writer stringWriter = new FastStringWriter(100);

process(templateSpec, context, stringWriter);

return stringWriter.toString();

}

@Override

public void process(String template, IContext context, Writer writer) {

process(new TemplateSpec(template, null, null, null), context, writer);

}

@Override

public void process(String template, Set<String> templateSelectors, IContext context, Writer writer) {

process(new TemplateSpec(template, templateSelectors, null, null), context, writer);

}

@Override

public IThrottledTemplateProcessor processThrottled(String template, IContext context) {

return processThrottled(new TemplateSpec(template, null, null, null), context);

}

@Override

public IThrottledTemplateProcessor processThrottled(String template, Set<String> templateSelectors, IContext context) {

return processThrottled(new TemplateSpec(template, templateSelectors, null, null), context);

}

@Override

public IThrottledTemplateProcessor processThrottled(TemplateSpec templateSpec, IContext context) {

return templateEngine.processThrottled(templateSpec, context);

}

@Override

public void afterPropertiesSet() throws Exception {

templateEngine.afterPropertiesSet();

}

@Override

public void setMessageSource(MessageSource messageSource) {

templateEngine.setMessageSource(messageSource);

}

}

以上是 Thymeleaf 3和Tiles2集成 的全部内容, 来源链接: utcz.com/qa/402037.html

回到顶部