私のテンプレートには、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では機能しません。
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
Thymeleafを介してメソッドを呼び出すことができますが、これは良い方法ではありません。 thymeleafの哲学はJSPとは異なり、有効なHTMLテンプレートを使用しようとします。そして正直に言うと、JSPでメソッドを呼び出すことも良い習慣ではありません。しかし私はあなたの判断ではないので、メソッドを呼び出すために非表示のスパンまたはdivを使用するには、次のようなことを試してください:
<span th:text="${myvariable.myfunct()}" />
ThymeleafはJSPのようには機能しません。これは、「th:」で始まる新しい属性で既存のHTML要素を拡張することで機能します。また、これらの追加属性でのみ変数を参照することができます(したがって、そのメソッドを呼び出すことができます)。
例えば。 <p th:text="${contentOfTheParagraph}" />
はthymeleafで動作します
だが <p>${contentOfTheParagraph}"</p>
しない。