Как вызвать метод object из Thymeleaf?
мой шаблон не видит объектов, переданных с весны.
мой код:
public class PublicModelAndView extends ModelAndView {
@Autowired
TemplateModulesHandler templateModulesHandler;
public void init() {
setViewName("index");
CSSProcessor cSSProcessor = new CSSProcessor();
cSSProcessor.setSiteRegion("public");
super.addObject("CSSProcessor", cSSProcessor);
JSProcessor jSProcessor = new JSProcessor();
super.addObject("JSProcessor", jSProcessor);
templateModulesHandler.setPublicModelAndView(this);
}
}
Контроллер это:
@SpringBootApplication
@Controller
public class IndexPage {
@Autowired
PublicModelAndView publicModelAndView;
@Autowired
OurServicesBean ourServicesBean;
@Autowired
PortfolioBean portfolioBean;
@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView indexPage() {
publicModelAndView.setTemplate("publicSiteIndexPage");
publicModelAndView.addObject("ourServices", ourServicesBean.getMenu());
publicModelAndView.addObject("portfolioWorkTypes", portfolioBean.getWorkTypes());
publicModelAndView.addObject("portfolioWorks", portfolioBean.getWorks());
return publicModelAndView;
}
}
код основного шаблона:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
>
<head th:include="headerAndFooter/fragments/header :: publicSiteHeader">
<title></title>
</head>
<body>
hello!
</body>
</html>
фрагмент:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head th:fragment="publicSiteHeader">
<title>SOME TITLE</title>
${CSSProcessor.setDebugCaller("Public")}
${CSSProcessor.setSiteRegion("public")}
${CSSProcessor.addCSS("/css/main.css")}
</head>
<body>
</body>
</html>
в результате я вижу код вызова метода, например
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>SOME TITLE</title>
${CSSProcessor.setDebugCaller("Public")}
${CSSProcessor.setSiteRegion("public")}
${CSSProcessor.addCSS("/css/main.css")}
почему thymeleaf не вызывал методы, а печатал этот текст на странице вывода? В примере из http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html способ вызова имеет такой же синтаксис, как
${person.createCompleteName()}
тот же код хорошо работает с JSP, но не работает с thymeleaf.
3 ответов
Это можно сделать в Thymeleaf двумя способами:
во-первых, использовать специальные для Thymeleaf:
<head th:fragment="publicSiteHeader">
<title>SOME TITLE</title>
<th:block th:text="${CSSProcessor.setDebugCaller("Public")}"/>
<th:block th:text="${CSSProcessor.setSiteRegion("public")}"/>
<th:block th:text="${CSSProcessor.addCSS("/css/main.css")}"/>
</head>
и второй способ:
<head th:fragment="publicSiteHeader" th:inline="text">
<title>SOME TITLE</title>
[["${CSSProcessor.setDebugCaller("Public")}"]]
[["${CSSProcessor.setSiteRegion("public")}"]]
[["${CSSProcessor.addCSS("/css/main.css")}"]]
</head>
для обработки естественного шаблона предпочтительнее второй вариант. Более подробную информацию о inlining можно найти здесь:http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining
вы можете вызывать методы через thymeleaf, но это не очень хорошая практика. Thymeleaf имеет другую философию, чем JSP-он пытается использовать действительные HTML-таблички. И быть honnest для вызова методов в JSP также не является хорошей практикой. Но я не ваш судья, поэтому для вызова метода используйте non visible span или div, попробуйте что-то вроде:
<span th:text="${myvariable.myfunct()}" />
Thymeleaf не работает как JSP. Он работает путем расширения существующих HTML-элементов с новыми атрибутами с префиксом " th:". И вы можете ссылаться на переменные (и, следовательно, вызывать метод на них) только в тезисах extra-attributes.
Е. Г. <p th:text="${contentOfTheParagraph}" />
будет работать с thymeleaf
но <p>${contentOfTheParagraph}"</p>
не будет.