spring-boot 与 jsp 集成(使用 gradle)
spring-boot 与 jsp 集成(使用 gradle)
spring boot 默认采用 thymeleaf 模板引擎,其默认的配置就支持 thymeleaf 。
然后很多的工程以前就使用 jsp 来编写,切换到 thymeleaf 的代价太大,实在没有必要,在找了网上的一些资料后,做了一下 spring-boot 与 jsp 的集成配置。
整个配置的关键点有几个:
- 确定 jsp 目录
- 让 spring-boot 采用正确的 view 解析类
- 使用支持 jsp 的容器插件
如果以 war 方式打包,应用类需要继承 SpringBootServletInitializer
,才会被容器正确加载。
从 start.spring.io
下载一个支持 web 的项目骨架代码后,开始进行定制。
确定 jsp 目录
spring boot 默认的模板目录为 src/resources/templates
,而一般遗留项目(包括使用 maven)时,可能会用 WebContent
或 src/webapp
目录作为资源目录,然后把 jsp 放到 WEB-INF/jsp
目录下以防止被直接读取。
假设现在放在 src/webapp/WEB-INF/jsp
目录下,因此,首先需要调整相应的配置,在 application.properties (或 application.yml),修改如下:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
这样就能指定从src/webapp
目录加载视图文件,并以 .jsp
作为后缀,这些配置会被 spring boot 中的配置属性 bean WebMvcProperties
接收。
WebMvcProperties
除了视图的前缀、后缀外,还包含日期格式之类的一些配置。
使用正确的 view 解析类
事实上,并不需要显式地配置视图解析类,spring boot 会自动找到合适的试图解析器和解析类。如果打开了 debug ,可见到加载了对应的 bean WebMvcAutoConfiguration
。
在 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);
}
采用支持 jsp 的容器
默认生成的项目结构中,会采用 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>
-
打包运行