1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Spring BootでThymeleafとJSPを併用する

Last updated at Posted at 2023-01-06

本来、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のコンテンツアシスタントが有効になります。
https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin

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">
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?