転職して、JSPを使っている会社に入りました。今どきJSPはないだろ!っていうことでThymeleafと共存させることにしました。
プロジェクト構成は、こんな感じです。
JavaCofigでBean定義を行うプロジェクト構成
xmlでBean定義を行うプロジェクト構成
では、さっそくコードを見ていただこうと思います。
xml version="1.0" encoding="UTF-8"
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xsischemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>spring-framework-sandbox</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<projectbuildsourceEncoding>UTF-8</projectbuildsourceEncoding>
<springmvcversion>4.3.8.RELEASE</springmvcversion>
<jvloverslf4jversion>1.7.25</jvloverslf4jversion>
<logbackclassicversion>1.2.3</logbackclassicversion>
<lombokversion>1.16.16</lombokversion>
<thymeleafversion>3.0.5.RELEASE</thymeleafversion>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.mvc.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jvl.over.slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.classic.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>${thymeleaf.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
JavaConfig
ThymeleafConfig.java
@Configuration
public class ThymeleafConfig {
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setPrefix("/WEB-INF/views/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolver(){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setOrder(1);
viewResolver.setViewNames(new String[] {"thymeleaf/*"});
return viewResolver;
}
}
WevMvcConfig.java
JSP用のViewResolverを登録する。Thymeleafとほぼ同じなので説明は割愛します。
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
@Import(ThymeleafConfig.class)
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp()
.prefix("/WEB-INF/views/")
.suffix(".jsp")
.viewNames("jsp/*");
registry.order(2);
}
}
beans-biz.xml
xml version="1.0" encoding="UTF-8"
<beans xmlns="http://www.springframework.org/schema/beans"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xmlnscontext="http://www.springframework.org/schema/context"
xsischemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<contextcomponent-scan base-package="com.example"/>
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="META-INF.messages" />
</bean>
<bean id="globalValidator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource" />
</bean>
</beans>
beans-webmvc.xml
xml version="1.0" encoding="UTF-8"
<beans xmlns="http://www.springframework.org/schema/beans"
xmlnsxsi="http://www.w3.org/2001/XMLSchema-instance"
xmlnscontext="http://www.springframework.org/schema/context"
xmlnsmvc="http://www.springframework.org/schema/mvc"
xsischemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<contextcomponent-scan base-package="com.example.web.controller" />
<mvcannotation-driven validator="globalValidator" />
<mvcresources mapping="/resources/**" location="/WEB-INF/views/" />
<beans>
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver" >
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".html" />
<property name="characterEncoding" value="UTF-8" />
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<property name="characterEncoding" value="UTF-8" />
<property name="viewNames" value="thymeleaf/*" />
<property name="order" value="1" />
</bean>
</beans>
<beans>
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
<property name="viewNames" value="jsp/*" />
<property name="order" value="2" />
</bean>
</beans>
</beans>
JavaConfigとxmlの共通のControllerクラスです。
View返すだけのControllerなので、特に説明はいらないかと思います。
WelcomeController.java
@Controller
@RequestMapping("/hello")
public class WelcomeController {
@GetMapping("/jsp")
public String helloJsp() {
return "jsp/hello/index";
}
@GetMapping("/thymeleaf")
public String helloThymeleaf() {
return "thymeleaf/hello/index";
}
}
あとは、アプリケーションを起動して次にアクセスするだけです。
http://localhost:8080/hello/jsp
http://localhost:8080/hello/thymeleaf
※ViewResolverの順序は、JSPよりThymeleafを先に指定してください。JSPを先に指定してしまうと、JSP以降に登録されてあるViewResolverを使わなくなってしまいます。