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.
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
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()}" />
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.