2015-01-21 7 views
6

Mój szablon nie wyświetla obiektów, przekazanych ze źródła.Jak wywołać metodę obiektu z Thymeleaf?

Mój kod:

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

    } 

} 

kod Contoller za:

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

    } 

} 

główny szablon Kod:

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

fragment Kod:

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

W wyniku widzę kod metody powołania, jak

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

     <title>SOME TITLE</title> 

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

Dlaczego thymeleaf nie wywoływać metody, ale wydrukować ten tekst na stronie wyjściowej? W przykładzie z http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html metody wywoływania ma taką samą składnię, jak

${person.createCompleteName()} 

Ten sam kod działa dobrze z JSP, ale nie działają z thymeleaf.

Odpowiedz

8

To można zrobić w Thymeleaf na dwa sposoby:

Pierwszym jest użycie specjalnego dla 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> 

A drugi sposób to:

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

    <title>SOME TITLE</title> 

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

Dla naturalnego przetwarzania szablonu drugi wariant I s bardziej preferowane. Więcej informacji na temat wprowadzania można znaleźć tutaj: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining

0

Thymeleaf nie działa jak JSP. Działa poprzez rozszerzenie istniejących elementów HTML o nowe atrybuty poprzedzone prefiksem "th:". I możesz odwoływać się do zmiennych (i dlatego wywoływać na nich metodę) tylko w tych dodatkowych atrybutach.

E.g. <p th:text="${contentOfTheParagraph}" /> będzie działać z thymeleaf

Ale <p>${contentOfTheParagraph}"</p> nie będzie.

+1

To nie jest cicho prawda. Możesz użyć th: block lub th: inline dla zrobienia

[[$ {contentOfTheParagraph} "]]

lub

$ {contentOfTheParagraph}". Sprawdź moją odpowiedź poniżej. –

3

Możesz wywoływać metody za pomocą thymeleaf, ale to nie jest dobra praktyka. Thymeleaf ma inną filozofię niż JSP - stara się używać poprawnych szablonów HTML. A bycie szczerym, by wywoływać metody w JSP, również nie jest dobrą praktyką. Ale ja nie jestem twoim sędzią, więc zadzwonić stosowanie metody nie widać rozpiętość lub div, spróbuj coś takiego:

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