spring boot 默认采用 thymeleaf 模板引擎,其默认的配置就支持 thymeleaf 。html
而后不少的工程之前就使用 jsp 来编写,切换到 thymeleaf 的代价太大,实在没有必要,在找了网上的一些资料后,作了一下 spring-boot 与 jsp 的集成配置。java
整个配置的关键点有几个:web
若是以 war 方式打包,应用类须要继承 SpringBootServletInitializer
,才会被容器正确加载。spring
从 start.spring.io
下载一个支持 web 的项目骨架代码后,开始进行定制。apache
spring boot 默认的模板目录为 src/resources/templates
,而通常遗留项目(包括使用 maven)时,可能会用 WebContent
或 src/webapp
目录做为资源目录,而后把 jsp 放到 WEB-INF/jsp
目录下以防止被直接读取。tomcat
假设如今放在 src/webapp/WEB-INF/jsp
目录下,所以,首先须要调整相应的配置,在 application.properties (或 application.yml),修改以下:mvc
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
这样就能指定从src/webapp
目录加载视图文件,并以 .jsp
做为后缀,这些配置会被 spring boot 中的配置属性 bean WebMvcProperties
接收。app
WebMvcProperties
除了视图的前缀、后缀外,还包含日期格式之类的一些配置。webapp
事实上,并不须要显式地配置视图解析类,spring boot 会自动找到合适的试图解析器和解析类。若是打开了 debug ,可见到加载了对应的 bean WebMvcAutoConfiguration
。jsp
在 WebMvcAutoConfiguration
这个自动化配置的类中,会配置一个 InternalResourceViewResolver
的 bean :
@Bean @ConditionalOnMissingBean public InternalResourceViewResolver defaultViewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix(this.mvcProperties.getView().getPrefix()); resolver.setSuffix(this.mvcProperties.getView().getSuffix()); return resolver; }
可见,在缺省状况下,就会建立一个默认的 view resolver 来进行视图的解析。 InternalResourceViewResolver
的构造函数,在发现 classpath 下存在 jstl 类库时,会自动以 JstlView
类做为视图。
public InternalResourceViewResolver() { Class<?> viewClass = requiredViewClass(); if (InternalResourceView.class == viewClass && jstlPresent) { viewClass = JstlView.class; } setViewClass(viewClass); }
默认生成的项目结构中,会采用 tomcat 做为嵌入式的容器,可是并无包含支持 jsp 的组件,所以,须要增长依赖:
runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
若是使用到 jstl ,因为部分容器是不带 jstl 的,所以还须要增长 jstl 的依赖。
compile('javax.servlet:jstl')
最后,汇总一下修改的内容:
build.gradle
增长 tomcat jasper 和 jstl
compile('javax.servlet:jstl') runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
修改 application.properties
修改 prefix 和 suffix
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp
编写 jsp 和 controller 类
controller
@Controller class IndexController { @GetMapping("/") fun index(): String { return "index" } }
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>Index</title> </head> <body> <h1>Hello, world!</h1> </body> </html>
打包运行