web-dev-qa-db-fra.com

Comment appeler la méthode object de Thymeleaf?

Mon modèle ne voit pas les objets, passés de Spring.

Mon code:

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);

    }

}

Code du contrôleur:

@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;

    }

}

Code du modèle principal:

<!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>

Le code du fragment:

<!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>

En conséquence, je vois le code de la méthode qui appelle, comme

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>

        <title>SOME TITLE</title>

         ${CSSProcessor.setDebugCaller("Public")}
         ${CSSProcessor.setSiteRegion("public")}
         ${CSSProcessor.addCSS("/css/main.css")}

Pourquoi thymeleaf n'a pas appelé les méthodes, mais a imprimé ce texte sur la page de sortie? Par exemple, à partir de http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html L'appel de méthode/a la même syntaxe, comme

${person.createCompleteName()}

Le même code fonctionne bien avec JSP, mais ne fonctionne pas avec thymeleaf.

6
Arthur

Cela peut être fait dans Thymeleaf de deux manières:

La première consiste à utiliser spécial pour 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>

Et la deuxième façon est:

<head th:fragment="publicSiteHeader" th:inline="text">

    <title>SOME TITLE</title>

     [["${CSSProcessor.setDebugCaller("Public")}"]]
     [["${CSSProcessor.setSiteRegion("public")}"]]
     [["${CSSProcessor.addCSS("/css/main.css")}"]]
</head>

La seconde option est préférable pour le traitement des modèles naturels. Vous trouverez plus d'informations sur l'inlining ici: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining

13
Ostap Gonchar

Vous pouvez appeler des méthodes via thymeleaf mais ce n'est pas une bonne pratique. La thymeleaf a une philosophie différente de celle de JSP - elle essaie d’utiliser des tamplates HTML valides. Et être honnête d'appeler des méthodes dans JSP n'est pas non plus une bonne pratique. Mais je ne suis pas votre juge, alors pour appeler method use not visible span ou div, essayez quelque chose comme:

<span th:text="${myvariable.myfunct()}" />
3
kulatamicuda

Thymeleaf ne fonctionne pas comme JSP. Cela fonctionne en prolongeant les éléments HTML existants avec de nouveaux attributs préfixés par "th:". Et vous pouvez référencer des variables (et donc appeler une méthode sur celles-ci) uniquement dans ces extra-attributs.

Par exemple. <p th:text="${contentOfTheParagraph}" /> fonctionnera avec thymeleaf

Mais <p>${contentOfTheParagraph}"</p> ne le fera pas.

0
Gauthier JACQUES