1. 序章

このチュートリアルでは、Thymeleafを使用してSpringMVCデータにアクセスするさまざまな方法について説明します。

まず、Thymeleafを使用して電子メールテンプレートを作成し、Springアプリケーションからのデータを使用してテンプレートを拡張します。

2. プロジェクトの設定

まず、Thymeleaf依存関係を追加する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.6.1</version>
</dependency>

次に、Spring BootWebスターターを含めましょう。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.1</version>
</dependency>

この依存関係は、後でいくつかのエンドポイントを作成するために使用するRESTサポートを提供します。

サンプルケースをカバーするためにいくつかのThymeleafテンプレートを作成し、それらを resources /mvcdataに保存します。 チュートリアルの各セクションでは、異なるテンプレートを実装します。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <!-- data -->
</html>

最後に、ビジネスロジックを格納するコントローラークラスを実装する必要があります。

@Controller
public class EmailController {
    private ServletContext servletContext;

    public EmailController(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}

コントローラクラスは常にサーブレットコンテキストに依存するわけではありませんが、後で特定のThymeleaf機能を示すことができるように、ここに追加します。

3. モデル属性

モデル属性は、ビュー内でレンダリングするためのデータを準備するコントローラークラス内で使用されます。

モデルに属性を追加する1つの方法は、コントローラーメソッドのパラメーターとしてModelのインスタンスを要求することです。

emailDataを属性として渡します。

@GetMapping(value = "/email/modelattributes")
public String emailModel(Model model) {
    model.addAttribute("emailData", emailData);
    return "mvcdata/email-model-attributes";
}

/ email / modelattributes が要求されると、SpringはModelのインスタンスを挿入します。

次に、Thymeleaf式でemailDataモデル属性を参照できます。

<p th:text="${emailData.emailSubject}">Subject</p>

これを行うもう1つの方法は、 @ModelAttribute を使用して、ビューで必要な属性をSpringコンテナーに通知することです。

@ModelAttribute("emailModelAttribute")
EmailData emailModelAttribute() {
    return emailData;
}

そして、ビュー内のデータを次のように表すことができます。

<p th:each="emailAddress : ${emailModelAttribute.getEmailAddresses()}">
    <span th:text="${emailAddress}"></span>
</p>

モデルデータのその他の例については、Spring MVCチュートリアルのModel、ModelMap、およびModelViewを確認してください。

4. リクエストパラメータ

データにアクセスする別の方法は、リクエストパラメータによるものです。

@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
    @RequestParam(value = "emailsubject") String emailSubject) {
    return "mvcdata/email-request-parameters";
}

一方、テンプレートでは、キーワード param を使用して、データを含むパラメーターを指定する必要があります。

<p th:text="${param.emailsubject}"></p>

同じ名前の複数のリクエストパラメータを設定することもできます。

@GetMapping(value = "/email/requestparameters")
public String emailRequestParameters(
    @RequestParam(value = "emailsubject") String emailSubject,
    @RequestParam(value = "emailaddress") String emailAddress1,
    @RequestParam(value = "emailaddress") String emailAddress2) {
    return "mvcdata/email-request-parameters";
}

次に、データを表示するための2つのオプションがあります。

まず、 th:each を使用して、同じ名前の各パラメーターを調べます。

<p th:each="emailaddress : ${param.emailaddress}">
    <span th:text="${emailaddress}"></span>
</p>

次に、パラメータ配列のインデックスを使用できます。

<p th:text="${param.emailaddress[0]}"></p>
<p th:text="${param.emailaddress[1]}"></p>

5. セッション属性

または、データをHttpSession属性に配置することもできます。

@GetMapping("/email/sessionattributes")
public String emailSessionAttributes(HttpSession httpSession) {
    httpSession.setAttribute("emaildata", emailData);
    return "mvcdata/email-session-attributes";
}

次に、リクエストパラメータと同様に、sessionキーワードを使用できます。

<p th:text="${session.emaildata.emailSubject}"></p>

6. ServletContext属性

ServletContext では、式を使用してemailDataのプロパティにアクセスすることはできません。

これを回避するために、各値を個別の属性として渡します。

@GetMapping("/email/servletcontext")
public String emailServletContext() {
    servletContext.setAttribute("emailsubject", emailData.getEmailSubject());
    servletContext.setAttribute("emailcontent", emailData.getEmailBody());
    servletContext.setAttribute("emailaddress", emailData.getEmailAddress1());
    servletContext.setAttribute("emaillocale", emailData.getEmailLocale());
    return "mvcdata/email-servlet-context";
}

次に、servletContext変数を介してそれぞれを取得できます。

<p th:text="${#servletContext.getAttribute('emailsubject')}"></p>

7. 豆

最後に、コンテキストBeanを使用してデータを提供することもできます。

@Bean
public EmailData emailData() {
    return new EmailData();
}

Thymeleafは、@beanName構文を使用したBeanアクセスを許可します。

<p th:text="${@emailData.emailSubject}"></p>

8. 結論

この小さなチュートリアルでは、Thymeleafを介してデータにアクセスする方法を学びました。

まず、適切な依存関係を追加しました。 次に、テンプレートにデータを渡すことができるように、いくつかのRESTメソッドを実装しました。

いつものように、コードはGitHubから入手できます。