Spring BootでThymeleafとJSPを併用する

本来、Spring BootによるWebアプリケーションで使用するViewはThymeleafを使用することが望ましいのですが、古いプロジェクトでJSPを使用しているWebアプリケーションをThymeleafに移行する場合等、一度に全ての画面をThymeleafに移行出来ない場合にJSPと併用する方法を紹介します。

## 開発環境
* Spring Tools Suite (STS) 4
* JDK 8
* Spring Boot 2.7.7

## 前提
Spring Bootのプロジェクトで既にJSPを使用したWebアプリケーションに対してThymeleafと共存させるための手順をです。
従いまして、Spring BootプロジェクトでJSPを使用する際の手順は含まれておりません。

:::note warn
JSPを使用していない既存プロジェクトであれば敢えてJSPと併用するメリットはありません。
:::

## Maven依存関係の設定
pom.xmlにthymeleafの依存関係を追加します。
* spring-boot-starter-thymeleaf
* spring-boot-devtools
```xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
```

:::note info
spring-boot-devtoolsはデバッグ時にソースの変更を即座に反映させるために使用します。
:::

## ThymeleafのEclipseプラグイン追加
[Thymeleaf Eclipse Plugin](http://www.thymeleaf.org/eclipse-plugin-update-site/)をSTSのプラグインに追加します。
このプラグインを使用することでhtmlエディタでThymeleafのコンテンツアシスタントが有効になります。
![https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin](https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin/blob/3.0-master/autocomplete.gif?raw=true)

## Thymeleaf用のViewリゾルバ定義
MVC用のConfigクラスに以下のBean定義を追加します。
JSPを使用せずにThymeleafのみ使用する場合は不要ですが、JSPと併用する場合は必要となります。
リゾルバにセットする値についてはapplication.propertiesで指定したspring.thymeleaf.*（未設定の項目はデフォルト値）を使用します。
ThymeleafViewResolverのsetOrderに1を指定することでJSPのリゾルバよりも優先度を上げるようにします。
* SpringResourceTemplateResolver
* SpringTemplateEngine
* ThymeleafViewResolver
```java

	@Autowired
	private ThymeleafProperties thProperties;

～ 省略 ～

	@Bean
	public SpringResourceTemplateResolver templateResolver(){
		SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
		templateResolver.setPrefix(thProperties.getPrefix());
		templateResolver.setSuffix(thProperties.getSuffix());
		templateResolver.setCacheable(thProperties.isCache());
		templateResolver.setTemplateMode(thProperties.getMode());
		return templateResolver;
	}

	@Bean
	public SpringTemplateEngine templateEngine(){
		SpringTemplateEngine templateEngine = new SpringTemplateEngine();
		templateEngine.setTemplateResolver(templateResolver());
		templateEngine.setEnableSpringELCompiler(thProperties.isEnableSpringElCompiler());
		return templateEngine;
	}

	@Bean
	public ThymeleafViewResolver viewResolver(){
		ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
		viewResolver.setOrder(1);
		viewResolver.setTemplateEngine(templateEngine());
		viewResolver.setCharacterEncoding(thProperties.getEncoding().name());
		viewResolver.setViewNames(thProperties.getViewNames());
		return viewResolver;
	}


```

## JSP用のViewリゾルバ定義
MVC用のConfigクラスでJSP用に定義しているViewResolverRegistryに対してorderに2を指定し、Thymeleafよりも優先度を下げます。
これによりThymeleafのリゾルバを先に処理しviewNamesに該当するViewはThymeleaf、それ以外はJSPのを使用することになります。
```java
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/views/", ".jsp");
		registry.order(2);
	}
```

## application.propertiesの設定追加
Thymeleaf用の設定を追加します。
* cache
デバッグ時はfalseを指定します。これによりtemplateの変更内容が再起動しなくても反映されます。
* view-names
Thymeleafを使用するViewの名前をカンマ区切りで指定します。ワイルドカードでパターン指定も可能です。
```properties
spring.thymeleaf.cache=false
spring.thymeleaf.view-names=xxxx,yyyy,*th-*
```

:::note warn
cacheの設定についてはデバッグ時以外はtrueにして下さい。
:::

## Viewの作成
### テンプレートの作成
Spring BootでのThymeleafのテンプレート配置先は既定で`/src/main/resources/templates`となっています。
こちらのディレクトにテンプレートのhtmlファイルを作成します。
Thymeleafの詳細についてはリファレンスを参照してください。

https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html

### 静的リソースの参照
静的リソースの配置先は既定で`/src/main/resources/static`ですが、今回はJSPとの併用にあたりJSPでの使用で既に配置している`/src/main/webapp/resources`の静的リソースを参照します。パスは以下のように指定します。
```html
<link th:href="@{/resources/css/xxxx.min.css}" rel="stylesheet">
```