Как вызвать метод 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> не будет.