本来、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を使用する際の手順は含まれておりません。
JSPを使用していない既存プロジェクトであれば敢えてJSPと併用するメリットはありません。
Maven依存関係の設定
pom.xmlにthymeleafの依存関係を追加します。
- spring-boot-starter-thymeleaf
- spring-boot-devtools
<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>
spring-boot-devtoolsはデバッグ時にソースの変更を即座に反映させるために使用します。
ThymeleafのEclipseプラグイン追加
Thymeleaf Eclipse PluginをSTSのプラグインに追加します。
このプラグインを使用することでhtmlエディタでThymeleafのコンテンツアシスタントが有効になります。
Thymeleaf用のViewリゾルバ定義
MVC用のConfigクラスに以下のBean定義を追加します。
JSPを使用せずにThymeleafのみ使用する場合は不要ですが、JSPと併用する場合は必要となります。
リゾルバにセットする値についてはapplication.propertiesで指定したspring.thymeleaf.*(未設定の項目はデフォルト値)を使用します。
ThymeleafViewResolverのsetOrderに1を指定することでJSPのリゾルバよりも優先度を上げるようにします。
- SpringResourceTemplateResolver
- SpringTemplateEngine
- ThymeleafViewResolver
@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のを使用することになります。
@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の名前をカンマ区切りで指定します。ワイルドカードでパターン指定も可能です。
spring.thymeleaf.cache=false
spring.thymeleaf.view-names=xxxx,yyyy,*th-*
cacheの設定についてはデバッグ時以外はtrueにして下さい。
Viewの作成
テンプレートの作成
Spring BootでのThymeleafのテンプレート配置先は既定で/src/main/resources/templates
となっています。
こちらのディレクトにテンプレートのhtmlファイルを作成します。
Thymeleafの詳細についてはリファレンスを参照してください。
静的リソースの参照
静的リソースの配置先は既定で/src/main/resources/static
ですが、今回はJSPとの併用にあたりJSPでの使用で既に配置している/src/main/webapp/resources
の静的リソースを参照します。パスは以下のように指定します。
<link th:href="@{/resources/css/xxxx.min.css}" rel="stylesheet">