spring-boot 与 jsp 集成(使用 gradle)

spring-boot 与 jsp 集成(使用 gradle)

spring boot 默认采用 thymeleaf 模板引擎,其默认的配置就支持 thymeleaf 。html

而后不少的工程之前就使用 jsp 来编写,切换到 thymeleaf 的代价太大,实在没有必要,在找了网上的一些资料后,作了一下 spring-boot 与 jsp 的集成配置。java

整个配置的关键点有几个:web

  1. 肯定 jsp 目录
  2. 让 spring-boot 采用正确的 view 解析类
  3. 使用支持 jsp 的容器插件

若是以 war 方式打包,应用类须要继承 SpringBootServletInitializer ,才会被容器正确加载。spring

start.spring.io 下载一个支持 web 的项目骨架代码后,开始进行定制。apache

肯定 jsp 目录

spring boot 默认的模板目录为 src/resources/templates ,而通常遗留项目(包括使用 maven)时,可能会用 WebContentsrc/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

使用正确的 view 解析类

事实上,并不须要显式地配置视图解析类,spring boot 会自动找到合适的试图解析器和解析类。若是打开了 debug ,可见到加载了对应的 bean WebMvcAutoConfigurationjsp

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')

运行

最后,汇总一下修改的内容:

  1. build.gradle

    增长 tomcat jasper 和 jstl

    compile('javax.servlet:jstl')
     runtime('org.apache.tomcat.embed:tomcat-embed-jasper')
  2. 修改 application.properties

    修改 prefix 和 suffix

    spring.mvc.view.prefix=/WEB-INF/jsp/
     spring.mvc.view.suffix=.jsp
  3. 编写 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>
  4. 打包运行

相关文章
相关标签/搜索