web-dev-qa-db-ja.com

Thymeleafからオブジェクトのメソッドを呼び出す方法は?

私のテンプレートには、Springから渡されたオブジェクトが表示されません。

私のコード:

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では機能しません。

8
Arthur

Thymeleafでは、次の2つの方法でそれを行うことができます。

最初に、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>

そして2番目の方法は:

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

    <title>SOME TITLE</title>

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

自然なテンプレート処理の場合、2番目のオプションがより望ましいです。インライン化の詳細については、こちらをご覧ください: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#inlining

14
Ostap Gonchar

Thymeleafを介してメソッドを呼び出すことができますが、これは良い方法ではありません。 thymeleafの哲学はJSPとは異なり、有効なHTMLテンプレートを使用しようとします。そして正直に言うと、JSPでメソッドを呼び出すことも良い習慣ではありません。しかし私はあなたの判断ではないので、メソッドを呼び出すために非表示のスパンまたはdivを使用するには、次のようなことを試してください:

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

ThymeleafはJSPのようには機能しません。これは、「th:」で始まる新しい属性で既存のHTML要素を拡張することで機能します。また、これらの追加属性でのみ変数を参照することができます(したがって、そのメソッドを呼び出すことができます)。

例えば。 <p th:text="${contentOfTheParagraph}" />はthymeleafで動作します

だが <p>${contentOfTheParagraph}"</p> しない。

0