2015-01-21 4 views
6

Il mio modello non vede oggetti, passati dalla primavera.Come chiamare il metodo dell'oggetto da Thymeleaf?

Il mio codice:

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

    } 

} 

codice di Contoller:

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

    } 

} 
codice

del modello principale:

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

codice di 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> 

Come risultato vedo il codice del metodo di chiamata, come

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

     <title>SOME TITLE</title> 

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

Perché thymeleaf non ha chiamato i metodi, ma stampare il testo nella pagina di uscita? Nel esempio dalla http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html metodo chiamante ha medesima sintassi, come

${person.createCompleteName()} 

Lo stesso codice funziona bene con JSP, ma non funzionano con thymeleaf.

risposta

8

che può essere fatto in Thymeleaf in due modi:

primo è quello di utilizzare speciale per 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> 

E il secondo modo è:

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

    <title>SOME TITLE</title> 

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

Per modello naturale elaborando seconda opzione i s più preferibile. Maggiori informazioni su inlining possono essere trovate qui: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining

0

Thymeleaf non funziona come JSP. Funziona estendendo gli elementi HTML esistenti con nuovi attributi preceduti da "th:". E puoi fare riferimento a variabili (e quindi chiamare metodo su di esse) solo in questi attributi extra.

E.g. <p th:text="${contentOfTheParagraph}" /> funzionerà con thymeleaf

Ma <p>${contentOfTheParagraph}"</p> non lo farà.

+1

Questo non è vero vero. Puoi utilizzare th: block o th: inline per fare

[[$ {contentOfTheParagraph} "]]

o

$ {contentOfTheParagraph}". Controlla la mia risposta qui sotto. –

3

È possibile chiamare i metodi tramite Thymeleaf ma non è una buona pratica. Il thymeleaf ha una filosofia diversa da quella JSP: prova a utilizzare gli stampaggi HTML validi. E essere i più giusti per chiamare i metodi in JSP non è una buona pratica. Ma io non sono il vostro giudice, in modo da chiamare il metodo uso arco non visibile o div, provare qualcosa di simile:

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