從 Thymeleaf 呼叫物件的方法
1. 引言
本文將探討如何在 Thymeleaf 範本中使用自訂 Java 方法。我們將介紹幾種方法類型以及如何使用 Thymeleaf 語法呼叫它們。
2. 為什麼要呼叫物件方法?
通常情況下,當我們使用 Thymeleaf 模板時,我們會渲染 HTML 標記並將模型屬性中的值插入其中。這是 Thymeleaf 的設計方式,也是它期望我們採用的工作方式。
不過,有時候我們可能需要做一些稍微複雜一點的事情。例如,我們可能需要呼叫 Java 方法來為範本產生額外的數據,或為某個值產生格式正確的輸出。這並非 Thymeleaf 模板的常用做法,但有時我們卻難以避免。
3. 呼叫模型物件的方法
在模板中呼叫 Java 方法最常見的用例之一是當這些方法是模型物件的一部分時。這樣我們就可以將模型物件中的資料傳遞給模板。
例如,我們的模型可能如下所示:
public class MethodsModel {
private final String theName;
public MethodsModel(String theName) {
this.theName = theName;
}
public String getName() {
return theName;
}
public String buildUppercaseName() {
return getName().toUpperCase();
}
public String getNameSubstring(int index) {
return getName().substring(index);
}
}
首先,我們可以直接呼叫 getter 方法,例如getName() 。我們可以透過使用 getter 所代表的欄位名稱來實現這一點:
<p th:text="'getName = ' + ${methodsModel.name}"></p>
Thymeleaf 明白這需要映射到getName()方法。它不會存取私有成員,所以為了存取私有字段,我們需要使用公共的 getter 方法。
我們也可以使用我們從 Java 中熟悉的傳統方法呼叫語法來呼叫不遵循 getter 模式的方法:
<p th:text="'buildUppercaseName = ' + ${methodsModel.buildUppercaseName()}"></p>
這樣做時,Thymeleaf 就能理解我們是在直接呼叫指定的命名方法。
我們也可以向方法傳遞參數:
<p th:text="'getNameSubstring = ' + ${methodsModel.getNameSubstring(3)}"></p>
這樣做會使 Thymeleaf 使用相同的參數來呼叫 Java 方法,從而獲得我們模板的正確輸出。
4. 呼叫靜態方法
在某些情況下,我們需要在其他物件上使用輔助方法。例如,當我們想要使用一些靜態 Java 程式碼來幫助格式化模板中要渲染的值時:
public class DateFormatter {
private static String DEFAULT_FORMAT = "YYYY-MM-DD hh:mm:ss";
public static String defaultDateFormat() {
return DEFAULT_FORMAT;
}
public static String format(Instant instant) {
return DateTimeFormatter.ofPattern(DEFAULT_FORMAT).format(instant.atZone(ZoneId.of("UTC")));
}
}
Thymeleaf 可以像我們之前看到的那樣呼叫這些方法。唯一的困難在於如何取得相關類別的正確引用。
在使用 Spring 渲染 Thymeleaf 模板時,我們可以使用一些 SpEL 結構來輔助工作。特別是,這裡我們可以使用T()呼叫來取得對類型的參考:
<p th:text="'defaultDateFormat = ' + ${T(com.baeldung.thymeleaf.controller.DateFormatter).defaultDateFormat()}"></p>
這會解析com.baeldung.thymeleaf.controller.DateFormatter類,然後呼叫其defaultDateFormat()靜態方法,並將傳回值插入我們的範本中。
我們也可以像以前一樣傳遞參數:
<p th:text="'formatNow = ' + ${T(com.baeldung.thymeleaf.controller.DateFormatter).format(methodsModel.now)}"></p>
這裡,我們呼叫了format()方法,並將呼叫模型物件getNow()方法的結果作為參數傳遞給它。這樣,我們就可以使用 Java 方法在將值插入輸出之前先對其進行格式化。
5. 呼叫 Spring Bean 的方法
有時我們需要在 Spring 環境中呼叫 bean 上定義的方法。一種方法是將 bean 注入我們的模型物件中:
@Controller
public class MyController {
@Autowired
public MyBean myBean;
@RequestMapping(value = "/myRoute", method = RequestMethod.GET)
public String handle(Model model) {
model.addAttribute("myBean", myBean);
return "view.html";
}
}
但是,這種方法擴展性不好,因為任何使用依賴該 bean 的範本的控制器都需要重複執行此操作。
幸運的是,Spring 預設會將所有 Spring bean 提供給 Thymeleaf 範本。我們只需要確保定義的 bean 有唯一的名稱:
public class MethodsBean {
public String hello() {
return "Hello, Baeldung!";
}
}
@Configuration
public class MethodsConfiguration {
@Bean
public MethodsBean methodsBean() {
return new MethodsBean();
}
}
然後我們可以像以前一樣呼叫它的方法:
<p th:text="'methodsBean = ' + ${@methodsBean.hello()}"></p>
這裡,「 @methodsBean 」語法指的是Spring上下文中具有此名稱的bean。遺憾的是,這意味著除非我們能在編譯時可靠地確定生成的名稱,否則我們無法引用未命名的bean。不過,通常情況下,當我們需要在模板中存取Spring bean時,我們也可以控制它們的名稱。
6. 結論
在本文中,我們了解了幾種直接從 Thymeleaf 模板呼叫不同類型類別的 Java 方法的方法。下次寫 Thymeleaf 程式碼時,如果需要這樣做,不妨試試看。
與往常一樣,本文中使用的所有程式碼都可以在 GitHub 上找到。