Thymeleaf 3 和 Tiles2 集成
Thymeleaf 3 and Tiles2 integration
Thymeleaf 3 是否以某种方式支持 Tiles 2?我在 Thumeleaf 2.x.x thymeleaf-extras-tiles2-spring4
中使用了一个包,但正如我现在看到的那样,由于 org.thymeleaf.dialect.AbstractDialect
class
中的更改,它不兼容
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
我只将我的 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 是否以某种方式支持 Tiles 2?我在 Thumeleaf 2.x.x thymeleaf-extras-tiles2-spring4
中使用了一个包,但正如我现在看到的那样,由于 org.thymeleaf.dialect.AbstractDialect
class
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
我只将我的 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);
}
}